[프로그래머스/Lv2] 영어 끝말잇기

2022. 10. 18. 12:03

문제

n명의 사람들이 순서대로 끝말잇기 놀이를 한다.

영어 끝말잇기의 규칙은 다음과 같다.

 

1. 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말한다.

2. 마지막 사람이 말한 다음에는 다시 1번부터 시작한다.

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

4. 이전에 나왔던 단어는 말할 수 없다.

5. 한 글자인 단어는 말할 수 없다.

 

사람의 수 n과 사람들이 순서대로 말한 words가 매개변수로 주어질 때,

가장 먼저 탈락한 사람의 번호와 그 사람이 몇 번째 차례에 탈락하는지를 반환하는 함수를 만들어야 한다.

 

 

제한조건

1. 끝말잇기에 참여하는 사람의 수는 2 이상 10 이하의 자연수이다.

2. words는 끝말잇기에 사용한 단어들이 순서대로 들어있는 배열이며, 길이는 n 이상 100 이하이다.

3. 단어의 길이는 2 이상 50 이하이다.

4. 모든 단어는 알파벳 소문자로만 이루어져 있다.

5. 끝말잇기에 사용되는 단어의 뜻은 신경 쓰지 않아도 된다.

6. 정답은 [번호, 차례] 형태로 return해야 한다.

7. 만약 주어진 단어들로 탈락자가 생기지 않는다면 [0, 0]을 return한다.

 

 

코드

import math

def solution(n, words):
    word_dict = {}
    dropout_num = 0
    dropout_order = 0

    for i in range(len(words)):
        if len(words[i]) < 2:
            dropout_num = (i%n) + 1
            dropout_order = (i+1) / n
            return [int(dropout_num), math.ceil(dropout_order)]
        
        try:
            word_dict[words[i]] += 1
            dropout_num = (i%n) + 1
            dropout_order = (i+1) / n
            return [int(dropout_num), math.ceil(dropout_order)]
        except:
            word_dict[words[i]] = 0

        if i > 0:
            if words[i][0] != words[i-1][-1]:
                dropout_num = (i%n) + 1
                dropout_order = (i+1) / n
                return [int(dropout_num), math.ceil(dropout_order)]

    return [dropout_num, dropout_order]

 

 

설명

word_dict = {}
dropout_num = 0
dropout_order = 0

word_dict은 이전에 나온 단어인지를 판별할 때 사용한다.

dropout_num은 탈락한 사람의 번호를 의미한다.

dropout_order는 탈락한 사람의 차례를 의미한다.

탈락자가 없을 때를 생각해서 0으로 초기화해 둔다.

 

dropout_num과 dropout_order는 끝말잇기 조건에 맞지 않는 단어의 위치(words의 인덱스)를 찾아

그 인덱스에서 각각 n을 모듈러 연산하여 1을 더한 값, 1을 더한 뒤 n으로 나눈 값이 된다.

 

for i in range(len(words)):
	if len(words[i]) < 2:
		dropout_num = (i%n) + 1
		dropout_order = (i+1) / n
		return [int(dropout_num), math.ceil(dropout_order)]

한 글자를 말했을 경우에 동작한다.

 

try:
	word_dict[words[i]] += 1
	dropout_num = (i%n) + 1
	dropout_order = (i+1) / n
	return [int(dropout_num), math.ceil(dropout_order)]
except:
	word_dict[words[i]] = 0

이전에 나온 단어를 말했을 경우에 동작한다.

파이썬의 딕셔너리는 존재하지 않는 키에 대한 값을 연산하려 하면 오류가 발생한다.

try, except 문을 활용해서 이 오류가 발생하면 어떠한 동작을 하도록 설정한다.

 

word_dict에 현재 인덱스의 단어를 키로 하는 값에 1을 더한다.

이 때 해당하는 키가 없다면 오류가 발생하여 except로 넘어간다.

except에서는 word_dict에 현재 인덱스의 단어를 키로 갖는 값을 저장한다.

해당하는 키가 있다면 이전에 나왔던 단어임을 의미하기 때문에

탈락자의 번호와 차례를 반환해준다.

 

if i > 0:
	if words[i][0] != words[i-1][-1]:
		dropout_num = (i%n) + 1
		dropout_order = (i+1) / n
		return [int(dropout_num), math.ceil(dropout_order)]

이전 단어의 마지막 문자와 현재 단어의 첫번째 문자가 같지 않을 경우에 동작한다.

words 배열의 첫번째 단어는 검사할 필요가 없기 때문에 i가 0보다 클 경우에 동작하도록 한다.

 

return [dropout_num, dropout_order]

위 끝말잇기 조건들을 모두 통과했다면 탈락자가 없기 때문에

0으로 초기화 된 dropout_num과 dropout_order를 반환한다.

BELATED ARTICLES

more