본문 바로가기
알고리즘/프로그래머스 PS

[프로그래머스][Level 2][Python] 영어 끝말잇기

by 빛밤하늘 2021. 8. 3.
반응형

밑의 링크는 프로그래머스에서의 문제 링크입니다.

 

코딩테스트 연습 - 영어 끝말잇기

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. [탈락자의 번호, 탈락할 때 자신의 몇 번째 차례]를 저장할 변수 answer를 선언합니다. 탈락자가 생기지 않으면 [0, 0]으로 반환해야하므로 [0, 0]으로 초기화합니다.
  2. 사람의 번호를 저장하는 변수 man_num을 선언합니다. 첫 단어를 말하는 사람은 탈락하지 않으므로 2로 초기화합니다.
  3. 탈락할 때 자신의 몇 번째 차례에 탈락하는지를 저장할 변수 turn_num을 선언합니다. 처음에는 1로 초기화합니다.
  4. 이전에 사용한 단어들을 저장할 리스트 변수 prev_words를 선언합니다. words의 첫 단어를 미리 넣어줍니다.
  5. 바로 이전에 사용한 단어를 저장할 변수 prev_word를 선언합니다. words의 첫 단어로 초기화합니다.
  6. 매개변수로 주어진 단어들 words의 단어들을 두 번째 단어부터 하나씩 반복해봅니다.
  7. 현재 단어의 첫 글자와 바로 이전 단어의 끝 글자가 일치하지 않거나, 현재 단어가 이미 사용된 단어라면 현재 단어를 말한 사람이 탈락자입니다.
  8. 탈락자가 생겼다면 과정 1에서 만든 answer에 [탈락자의 번호, 탈락할 때 자신의 몇 번째 차례]를 저장하고, 반복문을 탈출합니다.
  9. 탈락자가 생기지 않았다면, prev_words에 현재 단어를 넣어주고, prev_word에는 현재 단어를 저장합니다. 그리고 사람의 번호 man_num에 1을 더합니다.
  10. 만약 사람의 번호 man_num에 1을 더한 결과가 사람의 수 n보다 커진다면 다시 1번 사람 차례로 돌아가므로 man_num은 1로 초기화하고, 다음 자신의 차례로 돌아갔으므로 turn_num에도 1을 더합니다.
  11. 탈락자가 생기거나, 탈락자가 생기지 않아 words의 모든 단어를 읽을 때까지 과정 7 ~ 과정 10을 반복합니다.
  12. 반복문이 끝났다면 answer에 저장된 리스트 [탈락자의 번호, 탈락할 때 자신의 몇 번째 차례] 혹은 [0, 0]을 반환합니다.



 

 

 

 

 

 

제출한 파이썬 코드

# 사람의 수 n, 사람들이 순서대로 말한 단어 words가 매개변수로 주어집니다.
def solution(n, words):
    # 가장 먼저 탈락하는 사람의 번호, 그 사람이 자신의 몇 번째 차례에 탈락했는지로
    # 구성된 리스트를 저장할 변수를 선언합니다.
    # 탈락자가 생기지 않는다면 [0, 0]을 반환해야하므로 [0, 0]으로 초기화합니다.
    answer = [0, 0]
    # 현재 차례인 사람의 번호를 저장하는 변수를 선언합니다.
    # 1번 사람이 처음 단어를 말할 때는 탈락할 수 없으므로 2부터 시작합니다.
    man_num = 2
    # 현재 차례인 사람이 몇 번째 차례인지를 저장하는 변수를 선언합니다.
    turn_num = 1
    # 끝말잇기 중 이전에 사용한 단어들을 저장하는 리스트 변수를 선언합니다.
    # 처음 단어는 미리 넣어줍니다.
    prev_words = [words[0]]
    # 끝말잇기는 이전 단어와 비교해야하므로 이전 단어를 저장할 변수를 선언합니다.
    # 처음에는 첫 단어로 초기화합니다.
    prev_word = words[0]

    # words의 두 번째 단어부터 하나씩 반복해봅니다.
    for word in words[1:]:
        # 이전 단어의 끝 글자와 현재 단어의 첫 글자가 같지 않거나
        # 현재 단어가 이전에 말했던 단어였다면
        if prev_word[-1] != word[0] or word in prev_words:
            # 현재 단어를 말한 사람은 탈락자입니다.
            # answer에 [탈락자의 번호, 탈락자가 몇 번째 차례에 탈락했는지] 리스트를 저장합니다.
            answer = [man_num, turn_num]
            # 탈락자가 생겼으므로 반복문을 탈출합니다.
            break

        # 현재 단어를 이전에 말했던 단어들 리스트인 prev_words에 넣어줍니다.
        prev_words.append(word)
        # 이전 단어 변수 prev_word에 현재 단어를 저장합니다.
        prev_word = word
        # 사람의 번호에 1을 더합니다.
        man_num += 1

        # 사람의 번호에 1을 더한 결과가 사람의 수보다 커졌다면
        if man_num > n:
            # 1번 사람의 차례로 돌아가므로 사람의 번호를 다시 1로 초기화합니다.
            man_num = 1
            # 모든 사람들이 한 차례를 마쳤으므로 turn_num에 1을 더합니다.
            turn_num += 1
            
    # 탈락자가 생겼을 때는 [탈락자의 번호, 탈락자가 탈락한 차례]를
    # 탈락자가 생기지 않았을 때는 [0, 0]인
    # answer에 저장된 리스트를 반환합니다.
    return answer

 

 

 

제출 결과

결과

 

 

 

※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.

※ 더 효율적이고 빠른 정답을 환영합니다.

반응형

댓글