알고리즘/프로그래머스
프로그래머스-level2-영어 끝말잇기
송민준
2019. 12. 9. 14:02
https://programmers.co.kr/learn/courses/30/lessons/12981
코딩테스트 연습 - 영어 끝말잇기 | 프로그래머스
3 [tank, kick, know, wheel, land, dream, mother, robot, tank] [3,3] 5 [hello, observe, effect, take, either, recognize, encourage, ensure, establish, hang, gather, refer, reference, estimate, executive] [0,0]
programmers.co.kr
(서머코딩, 윈터코딩)영어 끝말잇기 문제.
푸는데 3시간 걸렸다....
접근 방식은 HashMap key 값에 배열에 있는 '말'을 넣고 value로 인덱스를 줬다.
value 값은 활용할 일이 없으니 다른 자료구조를 써도 무방하다.
HashMap<String, Integer> map = new HashMap<String, Integer>();
스트링빌더를 prev, next를 각각 만들어 끝말과 시작말을 각각 넣어주고
StringBuilder prev = new StringBuilder("");
StringBuilder next = new StringBuilder("");
첫번째 비교는 무조건 참이 나오게 초기화 했다.
prev.append(words[0].substring(0, 1)); // 끝말 초기화
이후 for문을 돌려서 앞뒤가 같은 경우와 같은 단어가 나왔던 경우를 분리해서 처리하였다.
밑에 코드가 가장 중요하다고 생각하는 코드이다.
[0]이 가장 먼저 탈락하는 사람 번호이고 [1]이 탈락한 사람의 몇 번째 차례에 탈락했는지다.
[1] 부분에서 double로 연산 후 올림 처리를 해줘야 이에 맞는 값들이 나온다.
answer[0] = ((i+1)%n==0) ? n:(i+1)%n ;
answer[1] = (i+1 > n)? (int)Math.ceil(((double)i+(double)1)/(double)n) : 1;
public int[] solution(int n, String[] words) {
HashMap<String, Integer> map = new HashMap<String, Integer>();
StringBuilder prev = new StringBuilder("");
StringBuilder next = new StringBuilder("");
prev.append(words[0].substring(0, 1)); // 끝말 초기화
int[] answer = new int[2];
for(int i =0; i < words.length; i++) {
next.append(words[i].substring(0, 1)); // 비교할 값 넘음
if(prev.toString().equals(next.toString())) { // 앞뒤가 같은 경우
prev.delete(0, prev.length());
if(i != words.length-1) {
prev.append(words[i].substring(words[i].length()-1));
}
next.delete(0, next.length());
} else { // 앞뒤가 다른 경우
answer[0] = ((i+1)%n==0) ? n:(i+1)%n ;
answer[1] = (i+1 > n)? (int)Math.ceil(((double)i+(double)1)/(double)n) : 1; //i+1이 n 이상일 경우 n으로 나눠서 반환
break;
}
if(map.containsKey(words[i])) { // 단어가 나왔던 경우
answer[0] = ((i+1)%n==0) ? n:(i+1)%n ;
answer[1] = (i+1 > n)? (int)Math.ceil(((double)i+(double)1)/(double)n) : 1; //i+1이 n 이상일 경우 n으로 나눠서 반환
break;
} else {
map.put(words[i], i);
}
}
return answer;
}
StringBuilder를 써서 그런지 속도도 훌륭하다.
테스트 케이스.. 필요한 분은 활용하시길...
int[] a = s.solution(3, new String[] {"tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"});
답 : 3, 3
int[] b = s.solution(5, new String[] {"hello", "observe", "effect", "take", "either", "recognize", "encourage", "ensure", "establish", "hang", "gather", "refer", "reference", "estimate", "executive"});
답 : 0, 0
int[] c = s.solution(2, new String[] {"hello", "one", "even", "never", "now", "world", "draw"});
답 : 1, 3
int[] d = s.solution(2, new String[] {"land", "dream", "mom", "mom", "ror"});
답 : 2, 2
int[] e = s.solution(2, new String[] {"land", "dream", "mom", "mom"});
답 : 2, 2
int[] f = s.solution(2, new String[] {"qwe", "eqwe", "eqwe"});
답 : 1, 2
int[] g = s.solution(3, new String[] {"qwe", "eqwe", "eqqwe", "eqqwe"});
답 : 1, 2
int[] h = s.solution(2, new String[] {"qwe", "qwe"});
답 : 2, 1
int[] h2 = s.solution(2, new String[] {"ewe", "ewe"});
답 : 2, 1
int[] h3 = s.solution(2, new String[] {"ewe", "ewq"});
답 : 0, 0
int[] h4 = s.solution(10, new String[] {"tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"});
답 : 9, 1