일단 백준이 아니라 프로그래머스를 선택한 이유는 프로그래머스 홈페이지가 훨씬 user-friendly하게 구성되어있어서이다.
거의 처음으로 풀어보는 코딩테스트 문제인데 머리로는 쉽게 생각했지만 아직 실전에서의 문법이 익숙하지 않아 비교적 오래 걸렸다.
이번 문제는 임의의 0을 포함한 로또번호와, 당첨 로또번호를 input
으로 받았을 때 최선과 최악의 상황을 output
으로 return 하는 문제였다.
일단 최선의 상황은 0으로 표기된 로또번호까지 당첨번호와 일치할 때고, 최악의 상황은 0으로 표기된 로또번호가 당첨번호와 모두 일치하지 않을 때이다.
그래서 먼저 당첨 번호와 몇 개의 번호가 같은지 count하고 여기에 0이 나온 횟수를 더하면 best case, 0을 제외하고 count만 하면 worst case로 분류해서 답을 도출하였다.
내가 작성한 코드
def solution(lottos, win_nums): zero = 0; same = 0; best = 0; worst = 0; for i in range(6): if lottos[i] == 0: zero = zero + 1 for j in range(6): if lottos[i] == win_nums[j]: same = same + 1 ㅤ ㅤ if same == 0 or same == 1: worst = 6 elif same == 2: worst = 5 elif same == 3: worst = 4 elif same == 4: worst = 3 elif same == 5: worst = 2 else: worst = 1 ㅤ if zero + same == 0 or zero+same == 1: best = 6 elif zero + same == 2: best = 5 elif zero + same == 3: best = 4 elif zero + same == 4: best = 3 elif zero + same == 5: best = 2 else: best = 1 ㅤ print(zero+same, same, best, worst) return [best, worst]
모범답안
def solution(lottos, win_nums): ㅤ rank=[6,6,5,4,3,2,1] ㅤ cnt_0 = lottos.count(0) ans = 0 for x in win_nums: if x in lottos: ans += 1 return rank[cnt_0 + ans],rank[ans]
일단 반성해야할 부분이 굉장히 많다.
rank와 count를 이용해서 복잡한 코드를 굉장히 단순화 시킨 것이 놀라웠다.
참고
문자열
count(a) find (‘a’) (위치 return) 없으면 -1 index (‘a’) (위치 return) 없으면 오류
join (문자열 삽입) ex) “,”.join(‘abcd’) -> ‘a,b,c,d’
upper(), lower() lstrip(), rstrip(), strip : 왼쪽 오른쪽 양쪽 공백 지우기 replace(“Life”, “Your leg”) : 문자열 대체 split(‘:’) : 문자열 나누기, 리스트로 반환
문자열 -> 리스트 list(a) or split 리스트 -> 문자열 “”.join(a)
리스트 추가
.append(a) .insert(index, a)
리스트 더하기 +
.extend(추가할 리스트)
리스트 삭제
list.remove(a) = del a[a.index(3)
>> l = [1,2,3,4,5] >> for i in l[:]: ... print(i) ... l.remove(i)