코드
def solution(lottos, win_nums):
answer = [0,0] # 최고순위, 최저순위
c = 0 # 일치한 숫자 개수
n = lottos.count(0) # 알아볼 수 없는 번호(0) 개수
lot = {6:1, 5:2, 4:3, 3:4, 2:5, 1:6, 0:6}
for i in lottos:
if i in win_nums:
c += 1
answer[0], answer[1] = lot[c+n], lot[c]
return answer
실제 코딩테스트에서 진행했던 문제들을 풀 때마다 이상한 긴장감이 생겨 어렵게 생각하게 되는 것 같다.
하지만 실제로 풀어보면 그리 어렵지 않은 문제들도 있다는 거!
이 문제는 로또 번호가 몇 개 일치했는지 파악해서 등수를 리턴하면 되는 문제이다.
lottos=[44, 1, 0, 0, 31, 25]이면 44, 1, 31, 25를 제외한 0은 지워진 번호이다. 지워진 번호가 정답 번호였을지, 꽝이었을지 그에 따라 등수가 달라지는 것을 생각하고 풀면 된다.
먼저, 최고 순위와 최저 순위를 담을 answer를 길이가 2인 리스트로 만든다.
그다음으로 일치한 숫자 개수와 지워진 번호 0의 개수를 저장할 변수 c와 n을 선언한다.
일치하는 번호의 개수에 따라 등수가 달라지므로 일치한 숫자 개수:순위 형태로 딕셔너리 lot를 만든다.
6등은 1개 번호가 일치하거나 0개 번호가 일치하는 경우이므로 두 가지로 나눠 1:6, 0:6으로 해주어야 한다.
이제 lottos의 요소들이 win_nums에 존재하는지 확인하여 win_nums에 존재하면 일치하는 로또 번호이므로 c+1을 한다.
c와 n을 모두 구했으면 가능한 최고 순위와 최저 순위를 찾아야 한다.
지금까지 c개의 일치하는 숫자를 찾았으니 더 높은 순위가 되려면 일치하는 수가 더 있어야 한다.
그러므로 n개의 0이 모두 정답 번호이면 최고 순위가 될 것이고, 그때의 일치하는 수는 c+n개다.
반대로 최저 순위는 n개가 모두 오답이면 된다.
c개의 수가 일치하므로 c개 이하로는 될 수가 없으니 c개일 때의 순위가 최저 순위가 된다.
따라서 c+n개가 일치할 때 순위와 c개가 일치할 때의 순위를 각각 딕셔너리 lot에서 찾아주면 구하고자 하는 답을 구할 수 있다.