다희의 코딩 성장일기

[프로그래머스] level2. 스킬트리 (자바 JAVA) 본문

Algorithm/프로그래머스

[프로그래머스] level2. 스킬트리 (자바 JAVA)

ilmiodiario 2021. 8. 25. 14:29

[ 문제 ]  [프로그래머스] level2. 스킬트리 (자바 JAVA)

 

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/49993

 

코딩테스트 연습 - 스킬트리

 

programmers.co.kr


# 접근 방법 및 풀이 

 

  • 처음 내 방식대로 풀이했을땐 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

Comments