본문 바로가기
Programming/Programmers

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

by duoxi 2023. 6. 17.

출처: https://school.programmers.co.kr/learn/courses/30/lessons/12981

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


 

문제

 

 

풀이

끝말잇기를 할 때 규칙은 다음과 같습니다.

1) 1번부터 끝 번호까지 차례대로 한 명씩 단어를 말하고, 마지막의 다음 순서는 1번입니다.

2) 이전에 등장한 단어는 사용할 수 없습니다.

3) 앞 사람이 말한 단어의 마지막 단어로 시작하는 단어를 말해야 합니다.

 

단어를 순서대로 받으면서 2, 3번 규칙을 어긴 사람의 번호와 순서를 return 하도록 하면 됩니다. 또 번호가 마지막 순서가 되면 다시 1번으로 초기화 합니다.

 

 

1) 번호 부여하기

참여자들의 번호를 number 라고 하고, 차례는 turn 이라고 합니다. 둘 다 1부터 시작하고 하나씩 늘어납니다.

마지막 번호가 되면 number는 다시 1로 돌아갑니다. 

 

for(String word : words){
    int number = 1, turn = 1;
    
    /* 규칙 2, 3, 4 */
    
    // 현재 순서가 마지막이었다면 1번으로 돌아가고, 아니라면 다음 순서로 넘어갑니다.
    if(number == n) number = 1;
    else number ++;
    
    turn ++;
}

 

 

문제에서 요구하는 차례는 몇 번째 턴에 탈락했는지를 의미하고, turn은 몇 번째 단어인지를 의미하기 때문에 (turn - 1) / n + 1 해야합니다.

만약에 3명이 참가한다면 3개의 단어가 1번의 턴이 될 것입니다. 그렇다면 3개씩 묶음이 되는 것이고 그 묶음이 몇 번째인지를 구해야 합니다.

 

몇 번째 단어? 2 3 4 5 6 7 8 9
몇 번째 턴? 1 2 3

 

따라서 위 표처럼 몇 번째 턴인지를 구하기 위해서는 (turn - 1) / n + 1을 해주면 됩니다.

 

 

2) 이전에 등장한 단어는 사용할 수 없음

각 단어가 이전에 등장했었는지를 확인하기 위해 arraylist를 선언하고 각 단어는 list에 들어갑니다.

만약 현재 단어가 list에 포함되어 있다면 2번 규칙을 어겼기 때문에 탈락하게 됩니다.

 

if(list.contains(word)){
    answer[0] = number;
    answer[1] = (turn - 1) / n + 1;
}

 

 

3) 끝말잇기 하기

단어를 말할 때는 앞 사람이 말한 단어의 마지막 단어로 시작하는 단어를 말해야 합니다. 만약 이 규칙을 어긴다면 그 사람이 탈락하는 것이기 때문에 그 때의 number와 차례를 answer에 넣어주면 됩니다.

 

if(!list.isEmpty()){
    // 앞 사람이 말한 단어
    String past = list.get(list.size() - 1);

    // 끝말잇기가 안된다면 탈락
    if(past.charAt(past.length() - 1) != word.charAt(0)){
        answer[0] = number;
        answer[1] = (turn-1) / n + 1;
    }
}

 

 

위 내용을 종합하여 코드를 작성하면 다음과 같습니다.

 

 

소스코드

import java.util.*;

class Solution {
    public int[] solution(int n, String[] words) {
        int[] answer = {0, 0}; // 번호, 차례
        
        ArrayList<String> list = new ArrayList<>();

        int number = 1, turn = 1;
        for(String word : words){
            
            // 2번 중복 규칙
            if(list.contains(word)){
                answer[0] = number;
                answer[1] = (turn-1) / n + 1;
                break;
            }
            
            // 3번 끝말잇기 규칙
            if(!list.isEmpty()){
                String past = list.get(list.size() - 1);
                
                if(past.charAt(past.length() - 1) != word.charAt(0)){
                    answer[0] = number;
                    answer[1] = (turn-1) / n + 1;
                    break;
                }
            }
            
            // 규칙을 어기지 않았다면 list에 포함
            list.add(word);
            
            // 순서 넘어가기
            if(number == n) number = 1;
            else number ++;
            
            // 차례 하나씩 추가
            turn ++;
            
        }
        
        return answer;
    }
}