문제 설명
상세한 문제 설명은 프로그래머스에서 확인할 수 있습니다.
아래와 같이 우리가 알고 있는 영어 끝말잇기 규칙과 같습니다.
- 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.
- 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.
- 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.
- 이전에 등장했던 단어는 사용할 수 없습니다.
- 한 글자인 단어는 인정되지 않습니다.
이 규칙에 맞게 N명이 끝말잇기를 진행할 때 가장 먼저 탈락한 사람의 번호와 자신의 몇 번째 차례에서 탈락하는지를 구하면 됩니다.
제한 사항
- 끝말잇기에 참여하는 사람의 수 n은 2 이상 10 이하의 자연수입니다.
- words는 끝말잇기에 사용한 단어들이 순서대로 들어있는 배열이며, 길이는 n 이상 100 이하입니다.
- 단어의 길이는 2 이상 50 이하입니다.
- 모든 단어는 알파벳 소문자로만 이루어져 있습니다.
- 끝말잇기에 사용되는 단어의 뜻은 신경 쓰지 않으셔도 됩니다.
- 정답은 [번호, 차례] 형태로 return 해주세요.
- 만약 주어진 단어들로 탈락자가 생기지 않는다면, [0, 0]을 return 해주세요.
입출력 예시
n | words | result |
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] |
2 | ["hello", "one", "even", "never", "now", "world", "draw"] | [1, 3] |
두 번째 케이스의 경우에는 영어 끝말잇기 규칙을 모두 준수한 상태로 겹침 단어가 발생하지 않아 [0, 0] 이 정답입니다.
풀이
저는 Map을 이용해서 해당 단어가 사용됐는지 확인하기 위해 containsKey(...) 메서드를 사용했습니다.
또 나눗셈(/)과 나머지(%) 연산을 활용해서 정답을 구했습니다.
i가 0부터 시작하고 i 번째 단어에서 탈락자가 발생했을 때
- (i % n) + 1 이 탈락한 사람의 번호입니다.
- 입출력 예시 1번처럼 n이 3이라면 (8 % 3) + 1는 3이 됩니다.
- (i / n) + 1 이 현재 끝말잇기가 몇 번째 사이클인지를 가리킵니다.
- 마찬가지로 1번 예시 경우에서 연산하면 3이 됩니다.
코드
import java.util.HashMap;
class Solution {
public int[] solution(int n, String[] words) {
// 값이 변경되지 않고 무사히 리턴되는 경우 [0, 0]
int[] answer = { 0 , 0 };
HashMap<String, Integer> wordsMap = new HashMap<>();
// 첫 번째 사람의 첫 번째 단어를 미리 추가
wordsMap.put(words[0], 1);
// 두 번째 사람의 첫 번째 단어부터 시작
for (int i = 1; i < words.length; i++) {
// 이전 단어의 마지막 문자와 현재 단어의 시작 문자를 비교하기 위해 변수 설정
char last = words[i-1].charAt(words[i-1].length()-1);
char start = words[i].charAt(0);
// 끝말잇기 규칙에 안 맞는 경우
if (last != start || wordsMap.containsKey(words[i])) {
answer[0] = (i % n) + 1; // 현재 걸린 사람
answer[1] = (i / n) + 1; // 몇 번째 사이클
break;
}
wordsMap.put(words[i], 1);
}
return answer;
}
}
'개발 > Algorithm' 카테고리의 다른 글
[Java] 다음 큰 숫자 (Programmers, Level 2) (0) | 2023.07.18 |
---|---|
[Java] 오픈채팅방 (2019 KAKAO BLIND RECRUITMENT) (0) | 2023.06.30 |
[Java] 성격 유형 검사하기 (2022 KAKAO TECH INTERNSHIP) (0) | 2023.06.26 |
[Java] 크레인 인형뽑기 게임 (2019 카카오 개발자 겨울 인턴십) (0) | 2023.06.26 |
[Java] 백준 2178번: 미로 탐색 (0) | 2023.01.05 |