Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Security
- 함수
- error
- GitHub
- 시큐리티
- 자바
- 쿼리
- 프로그래머스
- Eclipse
- jquery
- IntelliJ
- 방법
- 알고리즘
- 에러
- mybatis
- kotlin
- JPA
- 오라클
- 생성
- oracle
- aws
- db
- Git
- 스프링
- 코틀린
- 넥사크로
- Vue
- Spring
- JavaScript
- Java
Archives
- Today
- Total
송민준의 개발노트
프로그래머스-level2-영어 끝말잇기 본문
https://programmers.co.kr/learn/courses/30/lessons/12981
(서머코딩, 윈터코딩)영어 끝말잇기 문제.
푸는데 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
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 스킬트리 (0) | 2021.01.29 |
---|---|
프로그래머스 - 크레인 인형뽑기 게임(카카오) (0) | 2021.01.27 |
프로그래머스-level2-라면공장 (0) | 2019.12.05 |
프로그래머스-level2-전화번호 목록 (0) | 2019.12.02 |
프로그래머스-level2-쇠막대기 (0) | 2019.12.02 |