https://school.programmers.co.kr/learn/courses/30/lessons/12981
포인트는, 끝말잇기가 정상적으로 이루어지고 있는지, 즉 해당 단어의 끝과 다음 단어의 처음이 일치하는지를 확인하는 것 하나와 기존에 등장했던 단어인지, 즉 중복되는 단어인지를 파악하는 것이다.
일단 해당 단어를 찾으면 그 단어의 index로 몫과 나머지를 활용해 차례와 몇 번째 사람인지를 확인할 수 있겠다고 생각했다.
def solution(n, words):
done = [" "]
for i in range(len(words)):
if i != 0 and words[i][0] != done[-1][-1]:
break
if words[i] in done:
break
else:
done.append(words[i])
else:
return [0,0]
number = n if (i+1)%n == 0 else (i+1)%n
turn = (i+1)//n +1 if (i+1)%n > 0 else (i+1)//n
return [number, turn]
for문 안에 첫째 if로 끝말잇기가 정상적으로 이루어지고 있는지 확인한다. 두 번째 if로는 중복되는 단어인지 확인한다. 그렇게 break를 걸어 나온 index에 1을 더해 차례와 몇 번째 사람인지를 계산해 리턴한다.
for문 자체에 else를 걸어서 아무 문제 없이 끝난다면 곧바로 [0,0]을 리턴하게 했다.
효율성은 그렇게까지 좋지는 않다 ㅠㅠ
다른 사람의 풀이를 살펴보다가 감동받은 부분인데,
if words[p][0] != words[p-1][-1] or words[p] in words[:p]: return [(p%n)+1, (p//n)+1]
for문 내부의 if문들을 이렇게 한 문장으로 만든 것이 있었다. 또 중복 여부를 확인하려고 append하는 것이 아니라 [:p]
를 사용한 부분이 정말 천재적이라고 생각했다.