다희의 코딩 성장일기
[프로그래머스] level2. 스킬트리 (자바 JAVA) 본문
[ 문제 ] [프로그래머스] level2. 스킬트리 (자바 JAVA)
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/49993
# 접근 방법 및 풀이
- 처음 내 방식대로 풀이했을땐 31줄 나왔는데, 다른사람 풀이보고 String의 새로운 메서드를 알아냈다. 그 메서드를 이용한 방식으로 풀었더니 31줄에서 12줄로 줄었다.
- 자바는 진짜 문자열에선 킹왕짱 같다,,
- 먼저 첫번째 풀이는, skill을 char[] 배열로 바꿔주고, skill_trees[]에 있는 String을 skill에 들어있는 문자로만 이루어지게 바꿔서 마찬가지로 list로 만들어주었다.
- 이때 skill에 없는 문자로 이루어졌다면 list size는 0이고 이건 스킬트리순서와는 무관하므로 answer++ 해준다.
- list에 값이 들어가있다면 char[]배열과 0번째 부터 비교해서 값이 다르면 continue를 통해 빠져나온다.
- 이것도 처음에 문제 제대로 안 읽어서 skill = "CBD"일때, 저 순서만 맞으면 되겠지 하고 BD도 가능한걸로 착각했다.
- B가 나왔다면 무조건 C가 먼저 나와야한다. 따라서 CBD에서 나올 수 있는 경우의 수는 다음과 같다.
-
C B D C B C - 문제 예제를 제대로 읽었으면 삽질은 안 했을텐데.. 여기서 중요한건 skill_tree[i] 를 skill로만 이루어진 배열이나 리스트 형태로 바꾸고 그냥 0번째부터 비교하면 된다.
- 아무튼 첫번째 풀이 이렇게 했는데 다른 사람풀이 보고 알게된 함수 indexOf()이다.
- 두번째 풀이는 위와 같은 방식에서 indexOf를 활용했다.
- skill = "CBD", skill.indexOf("C") 이렇게 하면 알파벳 C가 위치한 idx를 반환한다. 따라서 0이다.
- 마찬가지로 skill.indexOf("B") = 1, skill.indexOf("D") = 2 이다.
- 이때, 파라미터로 들어가는 ""에 해당 문자가 없을 경우 -1을 반환한다.
- skill.indexOf("A") = -1, skill.indexOf("BDDD") = -1 이다.
- skill_tree[i]에서 skill로 이루어진 String s를 만들어 skill.indexOf(s)로 비교해주고, 이 값이 0일 경우만 answer++해주면 된다.
- 이때, s = ""일 수도 있는데 skill.indexOf("") = 0이다.
- 또한 skill.indexOf("CD") 는 -1이다. 왜냐면 skill에 해당 문자열이 없기때문이다.
- skill.indexOf("CB") = 0 이다. CB가 CBD에 있고, C는 0번째부터기 때문이다.
- 자세한건 아래 코드참고!
# 주의할 점
- CBD에서 BD는 가능한 문자열이 아님! 문제 제대로 읽기
JAVA 코드
첫번째 코드
import java.util.*;
class Solution {
public int solution(String skill, String[] skill_trees) {
int answer = 0;
boolean alpa[] = new boolean [26];
char arr[] = new char[skill.length()];
for(int i = 0; i < skill.length(); i++){
char c = skill.charAt(i);
arr[i] = c;
alpa[c-65] = true;
}
out: for(int i = 0; i < skill_trees.length; i++){
List<Character> list = new ArrayList<>();
for(int j = 0; j <skill_trees[i].length(); j++){
char c = skill_trees[i].charAt(j);
if(alpa[c-65])
list.add(c);
}
if(list.size()==0)
answer++;
else{
for(int j = 0; j < list.size(); j++){
if(arr[j] != list.get(j))
continue out;
}
answer++;
}
}
return answer;
}
}
indexOf 활용코드
import java.util.*;
class Solution {
public int solution(String skill, String[] skill_trees) {
int answer = 0;
for(int i = 0; i < skill_trees.length; i++){
String s = skill_trees[i].replaceAll("[^"+skill+"]", "");
if(skill.indexOf(s) == 0)
answer++;
}
return answer;
}
}
REVIEW
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] level2. 영어 끝말잇기 (자바 JAVA) (0) | 2021.08.25 |
---|---|
[프로그래머스] level2. 신규 아이디 추천 (자바 JAVA) (0) | 2021.08.25 |
[프로그래머스] level2. 다음 큰 숫자 (자바 JAVA) (0) | 2021.08.25 |
[프로그래머스] level1. 소수 만들기 (자바 JAVA) (0) | 2021.08.25 |
[프로그래머스] level2. 괄호 변환 (자바 JAVA) (0) | 2021.08.24 |
Comments