Algorithm/Programmars

[Python/level.1] 로또의 최고 순위와 최저 순위 [2021 Dev-Matching: 웹 백엔드 개발자(상반기]

mopipi 2022. 7. 7. 22:41
반응형

# 2021 Dev-Matching: 웹 백엔드 개발자(상반기)

문제

https://school.programmers.co.kr/learn/courses/30/lessons/77484

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

  • 0을 제외한 숫자 中 일치하는 숫자 개수 = 최소
  • (0이 모두 hit했다고 가정) 최소값 + 0 개수 = 최대
  • switch 대신에 딕셔너리형 사용
    • 파이썬에서는 switch/case 대신 dictionary 나 elif를 사용한다.

코드

def solution(lottos, win_nums):
	first, last, dk = 0

	for lotto in lottos:
		if(win_nums.count(lotto)): #일치하는 로또 번호가 있을 경우
			last += 1 #최소 개수+1
		if(lotto == 0):first +=1 # 0일 경우 최대값에 +1
	first += last #최대 = 최소 + 0 개수

	rank={0:6,1:6,2:5,3:4,4:3,5:2,6:1]
return 	rank[first],rank[last]

다른 풀이

  • 1. 리스트의 인덱스 이용하기 : rank=[6,6,5,4,3,2,1]
    • 딕셔너리 대신에 아예 맞은 개수 = index로 치환 가능하므로 list를 이용하는게 더 나은 것 같다. 딕셔너리 쓰면서 왜 리스트 생각을 못했을까…
  • list에 intersection 사용
rank[len(set(lottos) & set(win_nums)) + lottos.count(0)], rank[len(set(lottos) & set(win_nums))]

로또번호 ㅅ 당첨번호 -> 맞는 번호 개수 (최소)

0의 개수를 count를 이용해 구한다음 더함 (최대)

+

1. if 식으로 in을 사용할 수 있다.

 for x in win_nums:
 	if x in lottos:

2. 리스트끼리도 교집합 연산이 가능하다.

 

반응형