반응형
밑의 링크는 프로그래머스에서의 문제 링크입니다.
주의해야 할 점
탈락자가 생기는 이유는 앞 단어의 끝 글자와 뒷 단어의 첫 글자가 맞지 않는 경우도 있지만,
이전에 이미 사용했던 단어를 또 사용한 경우에도 탈락자가 생깁니다.
생각한 풀이 과정
- [탈락자의 번호, 탈락할 때 자신의 몇 번째 차례]를 저장할 변수 answer를 선언합니다. 탈락자가 생기지 않으면 [0, 0]으로 반환해야하므로 [0, 0]으로 초기화합니다.
- 사람의 번호를 저장하는 변수 man_num을 선언합니다. 첫 단어를 말하는 사람은 탈락하지 않으므로 2로 초기화합니다.
- 탈락할 때 자신의 몇 번째 차례에 탈락하는지를 저장할 변수 turn_num을 선언합니다. 처음에는 1로 초기화합니다.
- 이전에 사용한 단어들을 저장할 리스트 변수 prev_words를 선언합니다. words의 첫 단어를 미리 넣어줍니다.
- 바로 이전에 사용한 단어를 저장할 변수 prev_word를 선언합니다. words의 첫 단어로 초기화합니다.
- 매개변수로 주어진 단어들 words의 단어들을 두 번째 단어부터 하나씩 반복해봅니다.
- 현재 단어의 첫 글자와 바로 이전 단어의 끝 글자가 일치하지 않거나, 현재 단어가 이미 사용된 단어라면 현재 단어를 말한 사람이 탈락자입니다.
- 탈락자가 생겼다면 과정 1에서 만든 answer에 [탈락자의 번호, 탈락할 때 자신의 몇 번째 차례]를 저장하고, 반복문을 탈출합니다.
- 탈락자가 생기지 않았다면, prev_words에 현재 단어를 넣어주고, prev_word에는 현재 단어를 저장합니다. 그리고 사람의 번호 man_num에 1을 더합니다.
- 만약 사람의 번호 man_num에 1을 더한 결과가 사람의 수 n보다 커진다면 다시 1번 사람 차례로 돌아가므로 man_num은 1로 초기화하고, 다음 자신의 차례로 돌아갔으므로 turn_num에도 1을 더합니다.
- 탈락자가 생기거나, 탈락자가 생기지 않아 words의 모든 단어를 읽을 때까지 과정 7 ~ 과정 10을 반복합니다.
- 반복문이 끝났다면 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
제출 결과
※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.
※ 더 효율적이고 빠른 정답을 환영합니다.
반응형
댓글