오랜만의 문제 풀이 포스팅.
저번에 프로그래머스 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]
이게 되네 싶었던 코드
'CS > 알고리즘 문제풀이' 카테고리의 다른 글
프로그래머스 LV2 - 다음 큰 숫자 (0) | 2022.08.16 |
---|---|
프로그래머스 LV1 - 키패드 누르기 (0) | 2022.08.15 |
프로그래머스 LV1 - 모의고사 (0) | 2022.08.14 |