[Programmers]-영어 끝말잇기

문제

문제 설명하겠다. 끝말잇기 하면서 자기등번호와 몇라운드에 탈락하는지 반환하면 되는 문제이다. 한바퀴 돌면 한 라운드가 끝이난 것이다. n명이서 끝말잇기한다. 중복되어도 탈락이다. 말이 이어지지 않아도 탈락이다. 끝말잇기가 안정적으로 끝나면 [0,0]반환하면 된다.

코드

import java.util.*;

class Solution {
    public int[] solution(int n, String[] words) {
        int[] answer = new int[2];
        
        LinkedHashMap<String,Integer> map = new LinkedHashMap<String,Integer>();
        
        int human = 0;
        int round = 1;
        
        String prevString = words[0].charAt(0)+"";
        
        for(int i=0;i<words.length;i++){
            String word = words[i];//현 단어
            
            human++;
            if(human > n) {
                human = 1;//순서
                round++;
            }
            
            if(map.containsKey(word)){//입력전 중복여부
                answer[0] = human;
                answer[1] = round;
                break;
            }

            map.put(word,human);//맵에 값 넣어주기
            
            if(prevString.charAt(prevString.length()-1) != word.charAt(0)){//말 잇기가 되는지 여부
                answer[0] = human;
                answer[1] = round;
                break;
            }
            
            prevString = word;//전 단어로 지정
            
            if(i==words.length-1){//탈락없이 종료 조건
                human = 0;
                round = 0;
            }
        }
        
        return answer;
    }
}

코드 설명

words 문자열 배열을 입력 받는다. 이 배열은 끝말잇기에서 말한 단어들이다. 단어들 수를 for문 돌리고 다음 단어부터 human등번호 증가한다. n명보다 등번호 커지면 round가 증가했다는 뜻이다. 중복여부를 map.containsKey()로 쉽게 구한다, 그래서 링크드 해쉬맵을 사용했다. 그리고 맵에 데이터 넣어준다. 전 단어와 잇기가 되는지 확인도 한다. 안전히 끝말잇기를 끝내면 0,0 반환한다.

요약

  • 오늘 머리가 안돌아간다.
  • 해쉬맵을 쓰려했는데 순서보장이 없어 링크드해쉬맵을 써주면 된다.