알고리즘 공부
알고리즘 공부 16일차
jaekwanyda
2023. 1. 15. 06:14
오늘은 프로그래머스 이모티콘 할인행사 문제를 풀어보았다. 이 문제를 처음 봤을때 떠올린 아이디어는 각각의 이모티콘 별로 10%~40%까지 4가지 경우이므로 총 4^7의 경우를 생각할 수 있었다. 이는 약 16000 정도고 이용자의 최대는 100이므로 시간 복잡도도 충분해 보일 것 같았다. 그래서 나는 dfs문제라고 생각하고 접근하였다.
def dfs_emo(users,emoticons,sales,max_list):
if len(emoticons)==len(sales):
plus_sum=0;sale_sum=0
for i,j in users
q=0
for k in range(len(sales)):
if sales[k]>=i:
q+=emoticon[k]*(1-sales[k])
if q>=j:
plus_sum+=1
else:
sale_sum+=q
if plus_sum>=max_list[0]:
if sale_sum>=max_list[1]:
max_list[0]=plus_sum
max_list[1]=sale_sum
sales=[]
else:
for i in range(1,5):
sales.append(i*0.1)
dfs_emo(users,emoticons,sales,max_list)
def solution(users, emoticons):
sales=[]
max_list=[0,0]
dfs_emo(users,emoticons,sales,max_list)
return max_list
이런식으로 짜보았다. 그런데 지금 프로그래머스가 채점이 지연되는 상황이어서 아직 맞은지는 확인하지 못하였다. 그래서 주피터로 돌려보았는데 계속해서 오류가 발생했다. dfs를 작동하는 과정에서 무한 감옥에 갇힌 것처럼 보인다. 이 부분에 대해서는 조금 더 자고 오후에 다시 고쳐봐야겠다.
추가:
예상대로 dfs가 문제가 있었다. 전체적인 코드 방향은 맞았지만 sales 리스트를 다시 사용하지 않고 다른 리스트를 이용하면 좀 더 직관적으로 재귀함수를 돌릴 수 있을 것 같았다. 그리고 sales의 내용물들은 0~1사이의 수로 저장해두었기 때문에 users[0]의 값과 비교하려면 *100을 취해주어야 했다. 아래는 수정한 소스코드이다.
def dfs_emo(users,emoticons,sales,max_list):
if len(emoticons)==len(sales):
plus_sum=0;sale_sum=0
for i,j in users:
q=0
for k in range(len(sales)):
if sales[k]*100>=i:
q+=emoticons[k]*(1-sales[k])
if q>=j:
plus_sum+=1
else:
sale_sum+=q
if plus_sum>max_list[0]:
max_list[0]=plus_sum
max_list[1]=sale_sum
elif plus_sum==max_list[0]:
if sale_sum>=max_list[1]:
max_list[0]=plus_sum
max_list[1]=sale_sum
sales=[]
return max_list
for i in range(1,5):
a=sales+[i*0.1]
dfs_emo(users,emoticons,a,max_list)
def solution(users, emoticons):
sales=[]
max_list=[0,0]
dfs_emo(users,emoticons,sales,max_list)
return max_list
항상 수정할 때 나는 중간에 print구문을 끼워서 어떤식으로 출력되고 있는지를 확인하는 식으로 디버깅을 한다. 그렇게 하면 어디서 작동이 안되는지, 어떻게 작동이 되는지를 확인할 수 있어서 보기 편하기 때문이다. 한동안은 프로그래머스 레벨 2단계를 계속 풀어보자!