문제
https://school.programmers.co.kr/learn/courses/30/lessons/150368
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
완전탐색을 곁들인 단순 구현문제이다. 최대 7개의 이모지가 들어오는데, 해당 이모지가 할인할 수 있는 모든 경우의 수를 적용시키고 유저와 비교해본다. 그 중에 우리의 목표와 가장 알맞는 값을 가져오면 된다.
어려운 문제는 아니지만, 유의미한 아이디어라고 하면
import itertools
순열이나 조합등을 다루는 itertools 라이브러리의 product를 사용했다면 좀 편하게 풀 수 있는 거 같다.
해당 메소드는 데카르트 곱, 즉 중첩된 for루프와 같은 역할을 함으로써 우리가 경우의 수를 편하게 구할수 있도록 도와준다.
코드
import itertools
def solution(users, emoticons):
discount = (10, 20, 30, 40)
# 할인하는 모든 경우의 수를 구해본다.
cases = list(itertools.product(discount, repeat=len(emoticons)))
answer = [0, 0]
for case in cases:
sum_user = [0] * len(users)
dis_emoji = []
for i in range(len(emoticons)):
# 할인한 이모티콘 값들을 구하고, [할인율, 할인된값] 으로 저장해준다.
dis_emoji.append([ case[i], int(emoticons[i] - emoticons[i] * (case[i]/100))])
# 할인한 값으로 유저기준과 비교해본다.
# 특정 할인율이 유저가 만족하는 할인율이라면 sum user에 추가해준다.
for i in range(len(users)):
for j in range(len(dis_emoji)):
if dis_emoji[j][0] >= users[i][0]:
sum_user[i] += dis_emoji[j][1]
reg = 0
val = 0
# 특정 유저가 구매한 값이 기준선이 넘어간다면 플러스를 사고, 아니라면 매출액만 늘려준다.
for i in range(len(users)):
if sum_user[i] >= users[i][1]:
reg += 1
else:
val += sum_user[i]
# 값의 갱신이 필요하면 해준다.
if answer[0] < reg:
answer[0] = reg
answer[1] = val
elif answer[0] == reg and answer[1] < val:
answer[1] = val
return answer
후기
난 수학머리가 없는 사람이라, for문이 3개이상 중첩되면 굉장히 두려워한다. ( 내 나름대로 계산은 하고 큰 문제는 없을거라 생각했지만 나를 못믿는다.) 하지만 다행스럽게 다른 사람의 풀이를 보니 비슷한 방식으로 풀었고, 내 접근법도 맞았던 거 같다.
택배문제도 같은 2레벨로 분류되어있었고 4시간만에 풀었는데, 해당 문제는 훨씬 쉬워서 30-40분만에 해결했다. 한번에 풀려서 조금 당황스러웠지만 아무튼 좋았다.
'프로그래머스' 카테고리의 다른 글
LV2 [KAKAO] 후보키 (0) | 2023.06.11 |
---|---|
LV2 [KAKAO] n진수 게임 (1) | 2023.06.09 |
LV2 [KAKAO] 순위 검색 (0) | 2023.06.05 |
LV2 [KAKAO] 양궁대회 (0) | 2023.06.01 |
LV2 [KAKAO] 택배배달과 수거하기 (0) | 2023.05.29 |