programming

프로그래머스 영어 끝말잇기 파이썬 풀이 및 해설


by Kitle · 2020. 08. 15.



프로그래머스 퀴즈 중 영어 끝말잇기에 대한 파이썬 풀이 및 해설을 해보겠습니다.

원본 출처 프로그래머스 : 프로그래머스에서 보기

풀이 소스 : 깃허브에서 보기


문제요약

1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. n명과 끝말잇기를 하고 있는 단어리스트들이 주어지면, 해당 끝말을 맞게 말했는지, 중복되지 않았는지를 체크합니다.  틀린 경우는 누가 언제 틀렸는지 알려주고, 마지막까지 틀리지 않은 경우는 틀린사람이 없다고 리턴해주면 됩니다.


풀이

풀이 코드 먼저 보시고 해설과 솔루션 시작하겠습니다.

def solution(n, words):
spoken_words = []
for item in range(len(words)):
if not spoken_words:
spoken_words.append(words[item])
else:
if words[item] in spoken_words:
return [item % n + 1, item // n + 1]
elif spoken_words[item-1][-1:] != words[item][:1]:
return [item % n + 1, item // n + 1]
else:
spoken_words.append(words[item])
return [0, 0]

해설 및 솔루션

끝말잇기를 실제 하는 부분을 생각해 보세요. A라는 사람이 tank 라고 말했고, B라는 사람이 kick 이라고 말했습니다.

첫번째 말하는 사람은 절대 Fail 일 경우가 없습니다. 그리고 같은말을 했는지 안했는지 중복체크가 필요합니다. 사람들이 대답한 단어들을 모아두는 spoken_words = [] 리스트를 만들고, 한명한명 말할때마다 결과를 집어 넣겠습니다. 그리고 말을 할때 같은단어가 해당 리스트에 포함되어 있다면, '아까 이미 나온단어야!' 라고 말하듯이 중복단어는 탈락하게 되겠지요.

if not spoken_words: 의 경우가 아무것도 없을때는 답변에 추가하게 됩니다.

if words[item] in spoken_words: 의 경우는 다음의 순서가 이미 대답한 답변에 있는 경우 입니다.

그다음은 tank 라고 말했는데 lucky 라고 말한다면 탱크의 k와 lucky의 l 이 같지 않기때문에 끝말이 이어진 경우가 아니라서 이부분도 틀렸다고 봐야 합니다.

파이썬에서는 문자열 슬라이싱으로 문자열의 맨끝 char와 맨처음 char를 뽑아내는 것은 아주 쉽습니다.

spoken_words[item-1][-1:] != words[item][:1] 로 조건을 걸어주면 됩니다. [-1:] 로 맨뒤에 글자를 , [:1] 로 첫번째 글자를 뽀아낼 수 있습니다 이 둘이 다르다면 끝말잇기가 안된 것입니다.

틀리거나 이미 있는 말을 한 경우는 바로 결과를 return 하여 종료시킵니다.

그리고 단순히 틀렸다가 아니라 누가 언제 틀렸다를 [누가,언제] 식으로 리턴해줘야 합니다. 9개의 단어가 있는 경우, 1,2,3 번 이 순서대로 1-2-3 1차, 4-5-6 2차, 7-8-9 3차 로 답변한다고 볼 수 있습니다. 5번째 단어에서 틀렸다면 2번이 2차에서 틀렸으므로 [2,2] 를 리턴해야 합니다. 어떤것을 쓰면 될까요. 반복된 패턴으로 자르는 경우는 바로 나누기 연산을 활용하면 됩니다. 문제에서 의도하것인지 모르겠지만 전체 문자열을 n+1 나눈 나머지 값이 누가 틀렸는지, n+1로 나눈 몫이 언제 틀렸는지 위치를 가리키게 됩니다.

마지막까지 for 문이 돌았는데도 틀림 return 케이스에 걸리지 않았다면, 아무도 틀리지 않았으므로 반복문 종료까지 왔다면 return [0,0] 으로 아무도 틀린사람이 없음을 알려주면 되겠습니다.

이상 설명을 마치겠습니다.