💡Problem Solving/Programmers

[프로그래머스] 영어 끝말잇기 (Java)

gom20 2021. 10. 20. 12:39

#문제

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


#풀이

단어 배열을 순회하면서 

1) 현재 단어가 이미 사용된 단어인지 체크한다. (중복 체크 시에는 HashSet 사용)

2) 이전 단어의 마지막 문자와 현재 문자의 첫번째 문자가 다른 지 체크한다. 

이 두 조건중 하나라도 만족 한다면 탈락자가 발생한 것이므로, 탈락자의 번호와 차례를 구한다. 

두 조건에 해당 되지 않는다면, 단어를 HashSet에 넣고 다음 반복을 진행한다.

 

#소스코드

import java.util.*;
class Solution {
    public int[] solution(int n, String[] words) {
        int no = 0, order = 0;
        HashSet<String> usedWords = new HashSet<String>();
        for(int i = 0; i < words.length; i++){
            if(i == 0){
                // 첫 번째 단어는 조건을 체크하지 않는다
                usedWords.add(words[i]);
                continue;
            }            
            if(usedWords.contains(words[i]) || 
               words[i-1].charAt(words[i-1].length()-1) != words[i].charAt(0)){
                // 현재 단어가 이미 사용한 단어와 같다면 탈락자 발생
                // 이전 단어의 마지막 문자와 현재 단어의 첫번째 문자가 같지 않다면 탈락자 발생
                int nmg = (i+1)%n;
                int mok = (i+1)/n;
                no = nmg == 0? n : nmg;
                order = nmg == 0 ? mok : mok+1;                
                break;    
            } 
            usedWords.add(words[i]);
        }

        return new int[]{no, order};
    }
}