오늘도 알고리즘!
TIL 을 가장한 알고리즘 풀이 겸 생각을 써내려가보자 한다
오늘 풀어본 문제는 프로그래머스에서 가져왔으며
2021 Dev-Matching: 웹 백엔드 개발자(상반기)
로또의 최고순위와 최저순위 이다.
문제는 자연수로 1부터 45까지 길이가 6인 리스트 2개 input 값으로 주어지고
예를들면 [1, 13, 4, 5, 12, 45] 이런식으로 로또 구매자의 번호 리스트와 그 회차의 정답 리스트 [8, 7, 2, 12, 1, 4] 가 주어졌을때 그 회차의 로또 등수를 출력하는 형식의 문제이다.
하지만 이렇게 하면 문제가 너무 평이하기에 하나의 조건이 있다.
바로 구매자의 동생이 로또에 낙서를 하여 일부 번호를 알아볼수 없다는 조건이 있는데
이때 식별이 되지 않는 번호를 숫자 '0' 으로 하여 기대 가능한 최고,최저 순위를 출력하는것이 본 문제의 요구사항이다.
즉, 위의 예시에서 구매자의 동생이 0, 1, 5 번째 인덱스에 낙서를 하였다고 가정 하였을때 [0, 0, 4, 5, 12, 0] 의 형태로 주어지게 되고 정답 리스트를 비교해 보았을때 4, 12 두 숫자를 맞추었고 식별 불가한 숫자는 3개 가 된다.
이걸 로또 등수 기준에 미뤄보면
순위 당첨 내용
1 6개 번호가 모두 일치
2 5개 번호가 일치
3 4개 번호가 일치
4 3개 번호가 일치
5 2개 번호가 일치
6(낙첨) 그 외
만약 식별 불가한 숫자가 전부 정답이라면 숫자 5개를 맞추게 되고 2등이 되며 만약 전부 오답이라면 숫자 2개만 맞추게 되며 5등이 된다.
이렇게 기대가능한 최고등수와 최저 등수를 [2, 5] 형태의 배열로 반환하면 된다.
서론이 길었는데.. 내가 풀이한 코드는
def solution(lottos, win_nums):
cnt_c = 0 # 맞춘 번호 카운트 초기화
cnt_z = 0 # 식별불가 번호 카운트 초기화
answer = []
for m_num in lottos: # 구매자 번호 loop
if m_num in win_nums: # 당첨 번호에 있을때 1++
cnt_c +=1
elif m_num == 0: # 식별불가 번호 1++
cnt_z +=1
h_score = 7-(cnt_c + cnt_z) # 최고등수 저장
l_score = 7-cnt_c # 최저등수 저장
if l_score ==7 : # 맞춘 번호 하나도 없을때 최저등수 6등 저장
l_score = 6
if h_score ==7: # 맞춘 번호 하나도 없을때 최고등수 6등 저장
h_score = 6
answer.append(h_score) # 최고 등수 추가
answer.append(l_score) # 최저 등수 추가
return answer
마지막 부분의 조건설정을 빼먹어 한번의 테스트 케이스 실패를 경험하고.. 2트에 성공!
다른 사람들의 풀이에선 set을 이용해 교집합을 이용하기도 하고, 랭크 리스트를 만들어 인덱스로 등수에 접근하기도 하였는데 여러 방법으로 접근 가능한 문제였던 것 같다.
ps. 여담이지만 오늘 백준 그리고 코드포스에 처음 들어가봤다. 가야할 길이 멀지만.. 앞으로 더 다양한 문제를 접해 봐야겠다. 🦦