송민준의 개발노트

프로그래머스-level2-영어 끝말잇기 본문

알고리즘/프로그래머스

프로그래머스-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