프로그래밍 이야기/파이썬 코딩 테스트 스터디

파이썬 코딩테스트 스터디 7주차 #4 - 영어 끝말 잇기

hoony926 2024. 8. 11. 19:50

     

 

1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다.

 

  • 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.
  • 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.
  • 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.
  • 이전에 등장했던 단어는 사용할 수 없습니다.
  • 한 글자인 단어는 인정되지 않습니다.

 

다음은 3명이 끝말잇기를 하는 상황을 나타냅니다.

 

tank → kick → know → wheel → land → dream → mother → robot → tank

위 끝말잇기는 다음과 같이 진행됩니다.

  • 1번 사람이 자신의 첫 번째 차례에 tank를 말합니다.
  • 2번 사람이 자신의 첫 번째 차례에 kick을 말합니다.
  • 3번 사람이 자신의 첫 번째 차례에 know를 말합니다.
  • 1번 사람이 자신의 두 번째 차례에 wheel을 말합니다.
  • (계속 진행)

위에서서 3명이 하는 끝말잇기로 Turn과 몇번째 사람이 말하는지를 분석해보자

 

 

 

 

규칙의 핵심은

1. 같은 단어 반복 X

2. 이전 단어의 끝 음절이 현 단어의 첫 음절과 같아야함.

 

n = 3

인덱스 0 1 2 3 4 5 6 7 8
몇번째
사람
1 2 3 1 2 3 1 2 3
몇번째
사람 
로직
(index%n)+1
개인
횟수
1 1 1 2 2 2 3 3 3
개인
횟수
로직
index//n +1
단어 tank kick know wheel land dream mother robot tank

 

 

입출력예 

n words result
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]
2 ["hello", "one", "even", "never", "now", "world", "draw"] [1,3]

 

 

 

def solution(n, words):
    answer = [0,0]
    
    used_word = set()
    prev_word = words[0][0] #이전 단어 끝음절을 저장하기 위한 변수이나
                            #처음 검사시에는 일단 무조건 if문 통과해야하므로 첫단어의 첫음절로 선언
    
    for i , word in enumerate(words):
        if word in used_words or word[0] != prev_word : 
        #  현재 단어가 사용된적이 있거나 or 현재 단어 첫음절이 이전 단어의 끝음절과 다르면
        #  몇번째 사람이 현재 단어를 말했는지 ? (index%n)+1
        #  각 사람의 몇번째 차례인지? index//n +1
            return [(i%n)+1, (i//n)+1]
        
        used_words.add(word) #기사용 set에 저장
        prev_word = word[-1] #끝음절 prev_word에 저장

    return answer