-
[프로그래머스 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을 사용하는 것이 코드의 핵심이다. 더욱 공부해야겠다.'알고리즘 문제 풀기' 카테고리의 다른 글
[백준 1991] 트리 순회 (java) (0) 2021.05.25 [프로그래머스 17687] 3진수 게임 (java) (0) 2021.05.19 [프로그래머스 42746] 가장 큰 수 (java) (0) 2021.04.30 [프로그래머스 70129] 이진 변환 반복하기 (java) (0) 2021.04.29 [프로그래머스 12924] 숫자의 표현 (java) (0) 2021.04.26