프로그래머스

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

코 밑 2025. 1. 25. 20:29
Contents

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

끝말잇기 문제다. 그런데 이제 영어로 진행하는.

끝말잇기 국제룰을 사용한다. 중복 x, 한 글자 단어 x, 시작 글자는 전 사람의 마지막 글자.

주어진 매개변수는 플레이어의 수, 게임에 사용된 단어들이다.

룰을 어긴 단어가 나와 탈락자가 나온다면 해당 플레이어의 번호, 차례를 반환한다.

탈락자가 없다면 0, 0을 반환한다.

 

예시)

 

중복 단어를 외쳤기 때문에 탈락

3번째 사람이 3번째 턴에 탈락했기 때문에 3, 3을 반환한다.

// 프로그래머스 영어 끝말잇기
// n명의 사람들이 영어 끝말잇기중이다. 흔히들 아는 끝말잇기 룰로다가. 중복x, 한글자 x, 시작 글자는 전사람의 마지막 글자
// 탈락자는 룰을 지키지 않으면 정해진다
// 탈락자가 등장하면 몇번째 사람, 몇번째 차례 인지 배열로 반환한다.
// 탙락자가 없다면 {0, 0} 반환
// map에다가 하나씩 넣으면서 있나 비교
import java.util.*;

class Solution {
    public int[] solution(int n, String[] words) {
        // 사람 카운트, 턴 카운트 초기값 1
        int p = 1, turn = 1;
        Map<String, String> map = new HashMap<>();
        for (int i = 0; i < words.length; i++) {
            // 단어 중복
            if (map.get(words[i]) == null) {
                map.put(words[i], words[i]);
            } else {
                return new int[] { p, turn };
                // p, turn 변수를 쓰기 싫다면
                // return new int[] { (i % n) + 1, (i / n) + 1 };
            }
            // 전 단어의 마지막 글자랑 현 단어의 처음 글자랑 다를 때
            if (i != 0 && words[i].charAt(0) != words[i - 1].charAt(words[i - 1].length() - 1)) {
                return new int[] { p, turn };
            }
            // 단어 한글자
            if (words[i].length() == 1) {
                return new int[] { p, turn };
            }

            // 다 돌면 1번 참가자로 가고 턴은 다음 턴으로
            if (p == n) {
                p = 1;
                turn++;
                continue;
            }

            p++;
        }

        // 탈락자 없으면 0, 0 반환
        return new int[] { 0, 0 };
    }
}

 

MAP을 이용해 각 순서마다 발생하는 단어를 넣었다.

MAP은 Key와 Value로 이루어진 자료구조로 리스트처럼 순차적으로 데이터가 저장되지 않는다.

Key와 Value가 쌍으로 연결되어있기 때문에 키를 통해 값에 접근 가능하다.

이 때문에 키는 중복이 불가능하다.

 

나는 중복 검사를 키를 통해 하기 위해 MAP을 사용했다.

 

매 순서마다 map 내에 중복 단어가 없다면 한단어씩 map에 집어넣는다.

단어마다 세개의 검사를 한다.

 

1. 중복 검사

map 내에 현재 단어와 중복되는 단어가 있다면 탙락

 

2. 한 글자 단어 검사

현재 단어가 한 글자짜리 단어라면 탈락

 

3. 전 단어의 마지막 글자와 현 단어의 첫번째 글자와 불일치

 

편리함을 위해 플레이어 카운트, 턴 카운트 변수를 사용했지만

플레이어 -> (i % n) + 1

순서 -> (i / n) + 1

 

이렇게도 사용할 수 있다.

 

탈락자 없이 모든 단어의 검사를 마쳤다면 0, 0을 반환한다.

잘자용~