(프로그래머스 12981) 영어 끝말잇기

ps  · 2 mins read

이해

  • n명의 사람이 다음과 같은 규칙으로 영어 끝말잇기를 한다.
    • 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말한다.
    • 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작한다.
    • 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 한다.
    • 이전에 등장했던 단어는 사용할 수 없다.
    • 한 글자인 단어는 인정되지 않는다.
  • 사람의 수와 사람들이 순서대로 말한 단어를 담고있는 배열이 주어질 때, 가장 먼저 탈락하는 사람의 번호와 그 사람이 자신의 몇 번째 차례에 탈락하는지를 구해라.

계획

  • 이전에 등장했던 단어를 저장하기 위한 배열 하나를 선언한다.
  • words 배열의 단어를 차례대로 하나 씩 탐색하여 단어가 이전에 등장했던 단어이거나 앞사람이 말한 단어의 마지막 문자로 시작하는 단어인지 확인해준다.
  • 사람의 번호는 입력받은 words 배열의 index를 참여자 수로 나눈 나머지에 1을 더한 값으로 구해준다.
  • 몇 번째 차례인지에 대해서는 turn 변수를 하나 선언하여 words 배열의 인덱스를 참여자 수로 나눈 나머지가 0인 경우에 1씩 증가시켜주어 구해준다.

실행

def solution(n, words):

    spoken = []
    turn = 0
    for i, word in enumerate(words):
        if i % n == 0:
            turn += 1
        if word in spoken or (i > 0 and words[i-1][-1] != word[0]):
            return [i % n + 1, turn]
        spoken.append(word)
    return [0, 0]

개선

  • turn 변수를 사용하지 않고도 탐색중인 단어의 인덱스 값으로 몇 번째 차례인지를 계산할 수 있다.
  • 이전에 등장했던 단어들을 따로 저장하지 않고 words 배열을 가지고 현재 탐색중인 단어가 이전에 등장했던 단어인지를 확인할 수 있다.
def solution(n, words):

    for i, word in enumerate(words):
        if word in word[:i] or (i > 0 and words[i-1][-1] != word[0]):
            return [i % n + 1, i//n + 1]
    return [0, 0]

회고

  • 쉬웠고, 코드를 간결하게 짜기에는 파이썬 언어가 최고인 것 같다.