ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스 12981] 영어 끝말잇기 (java)
    알고리즘 문제 풀기 2021. 5. 5. 15:12

    링크

    나의 풀이

    import java.util.ArrayList;
    
    class Solution {
        public int[] solution(int n, String[] words) {
            int[] answer = new int[2];
    
            ArrayList<String> talk = new ArrayList<>();
            int len = words.length;
    
            for (int i = 0; i < len; i++) {
                // 앞에 말한 단어인지 확인
                if (talk.indexOf(words[i]) == -1) {
                    // 안나왔다면 끝말잇기 검증
                    if (!talk.isEmpty()) {
                        // 첫 원소가 아닐 경우에만 확인
                        char[] last = talk.get(i-1).toCharArray();
    
                        // 마지막 글자가 다음 문자열의 앞글자와 일치하는지
                        if (words[i].indexOf(last[last.length-1]) != 0) {
                            // 아니라면
                            answer[0] = (i % n) + 1;    // n번 사람 확인
                            answer[1] = (i / n) + 1;    // n번째 차례 확인
    
                            return answer;
                        }
                    }
    
                    talk.add(words[i]); // 추가
                }
    
                else {
                    // 나왔던 것이라면
                    answer[0] = (i % n) + 1;    // n번 사람 확인
                    answer[1] = (i / n) + 1;    // n번째 차례 확인
    
                    return answer;
               }
            }
    
            // 위의 for문 반복 후에도 끝나지 않았다면, 걸린 사람이 없는 것임
            answer[0] = 0;
            answer[1] = 0;
    
            return answer;
        }
    }

    이번에도 역시나, 문제에서 주어진 조건 그대로 풀이를 시작했다. 이전에 나온 단어는 ArrayList에 담아서 일일히 indexOf를 통해 중복 검사를 실시했다. 이와 더불어, 끝말잇기의 규칙대로 글자가 이어가는지를 확인하기 위해 매 단어마다 char[]를 만들고 비교했다. 통과는 했지만, 유리함이 전혀 없는 코드이다.

    모범 답안

    import java.util.HashSet;
    
    class Solution {
    
    
        public int[] solution(int n, String[] words) {
          int[] answer = { 0, 0 };
            char chEnd = words[0].charAt(words[0].length() - 1);
            char chStart;
            System.out.print(chEnd + " ");
            HashSet<String> log = new HashSet<>();
            log.add(words[0]);
            for (int i = 1; i < words.length; i++) {
                chStart = words[i].charAt(0);
                log.add(words[i]);
                if (chEnd != chStart || log.size() != i + 1) {
                    System.out.print(i + 1 + "!");
                    answer[0] = (i % n)+1;
                    answer[1] = (i / n) + 1;
                    break;
                }
    
                chEnd = words[i].charAt(words[i].length() - 1);
                System.out.print(chEnd + " ");
            }
            System.out.println();
            System.out.println("(" + answer[0] + ", " + answer[1] + ")");
            return answer;
        }
    }

    HashSet을 통해 중복을 처리했다. 중복된 원소가 들어올 경우에는 size가 증가하지 않기 때문에, 일일히 비교하는 불필요한 과정을 하지 않고 바로 처리했다. 이와 함께 불필요하게 char[]를 만들 필요 없이 charAt()을 통해 필요한 글자만 받아들여서 처리했다.
    덕분에 코드도 훨씬 간결하고, 효율성이 높아졌다. 중복 제거에 HashSet을 사용하는 것이 코드의 핵심이다. 더욱 공부해야겠다.

Designed by Tistory.