
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
'프로그래밍 이야기 > 파이썬 코딩 테스트 스터디' 카테고리의 다른 글
파이썬 코딩테스트 스터디 8주차 #1 - 그래프 개념 (0) | 2024.08.15 |
---|---|
파이썬 코딩테스트 스터디 7주차 #5 - 전화번호 목록 (0) | 2024.08.11 |
파이썬 코딩테스트 스터디 7주차 #3 - 포켓몬 - 합격자가 되는 모의 테스트 (0) | 2024.08.09 |
파이썬 코딩테스트 스터디 7주차 #2 - 몸풀기 문제 : 간단한 유니온 - 파인드 알고리즘 구현하기 (0) | 2024.08.09 |
파이썬 코딩테스트 스터디 7주차 #1 - 집합 (0) | 2024.08.04 |