CS/알고리즘 문제풀이

프로그래머스 Lv2 - 영어 끝말잇기

AI쟁이J 2023. 1. 21. 00:52

오랜만의 문제 풀이 포스팅.

저번에 프로그래머스 lv1을 모두 정복한 이후 lv1 문제들이 약 13개정도 추가되었었는데, 이것도 다 풀고..

네이버 부스트캠프 1차를 준비하면서 백준,프로그래머스 하위 레벨 문제들을 양치기로 계속 풀다보니 포스팅보다는 빠르게 계속 푸느라 포스팅을 안했었다. 

덕분에 1차를 붙었고, 2차 시험을 준비하면서 LV2 문제를 풀고있었다. 근데 이 문제는 포스팅 안해두면 나중에 내 코드를 절대 이해할 수가 없을 것 같아서 포스팅..

 

 

일단 문제가 좀 길다. 카카오 기출같은 느낌.. 

def solution(n, words):
    times = [x % n for x in range(len(words))]
    wrong = ""
    ans = []
    
    for i in range(len(words)):
        if words[i] in words[0:i]:
            words[i] += "*"
            wrong = words[i]
            break
        elif i > 0 and words[i][0] != words[i-1][-1]:
            wrong = words[i]
            break

    if wrong == "":
        return [0,0]
    else:
        ans.append(times[words.index(wrong)] + 1)
        ans.append(times[0:words.index(wrong)].count(times[words.index(wrong)]) + 1)
    
    return ans

풀면서 음.. 이렇게까지 잡다하게 하는게 맞나? 싶었지만 깔끔히 정답이라서..

먼저 '몇 번째' 사람이 '몇 번째에' 틀렸는지를 return 해야한다. 따라서 입력된 words의 길이를 참가한 사람의 수인 n으로

나누어서 각 단어를 누가 말했는지 인덱스를 붙여준다. 

["tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"]

라는 words 리스트가 있다면 times 리스트는

[0,1,2,0,1,2,0,1,2]

가 된다.

그 다음은 wrong 단어를 찾아낸다.

for 문을 통해 끝말잇기 라는 규칙을 깬 단어나, 이미 존재했던 단어를 지정한다. 근데 이 단어를 나중에 words에서 몇 번째에 있는지 인덱싱하려니까 이미 앞에 나왔던 단어로 찾아진다.. 그래서 꼼수로 이미 존재하는 단어를 말해서 오답인 경우에는 wrong 단어를 + "*" 로 예를 들어 tank* 로 표시한다. 그리고 원본 단어에서도 tank*로 만들어 나중에 인덱싱이 되게 한다.

위 예시에서는 wrong = tank* 이고, 이를 인덱스를 찾으면 8이다.

그러면 times 리스트에서 times[8] = 2이다. 

따라서 2라는 인덱스를 가진 사람은 3번째 사람이고, (지금 느꼈는데 times 자체를 만들 때 +1을 해서 할걸..)

이를 ans에 넣는다.

그리고 3번째 사람의 몇번째 순서였는지는 times[0:8] = [0,1,2,0,1,2,0,1] 이다. 여기서 2를 카운트하면 2. 따라서 2번째 이후의 차례였으니 이 사람의 3번째 순서다.

따라서 ans = [3,3]

이게 되네 싶었던 코드