본문 바로가기
python

2020.08.22_알고리즘_예산

by 해맑은 코린이 2020. 8. 22.

2020.08.22__예산 정리노트

 

출처 - 프로그래머스

오늘은 예산이란 알고리즘을 풀어보았다! 

진짜 겁나 우당탕탕..풀어서 정리가 필요하다 느껴서 알고리즘 2일째 포스팅

일단 문제 이해부터 제대로 못해서 쓸모없는거만 붙잡고 있었다.

 

내가 헷갈렸던 부분은 예산이 9라면 정확히 예산을 9원을 다써서 최대로 지원해줄 수 있는 부서인지 알고 

9원을 다쓰는 경우의 수를 구하려고 애썼던 것 같다.

 

하지만 나중에 깨달은 사실

-정확히 예산을 전부 써주는 것이 아니라, 각 부서에서 신청한 예산을 정확하게 지원하였을 때, 예산안에서 몇 개의 부서를 최대로 지원해주느냐가 문제의 포인트였다!

 

그렇게 .. 감을 새벽에 자다 일어나서 잡아서 우당탕탕 풀었다. 

 

 

그래서 푼 맨 처음 풀이... 일단 너무 복잡해서 내가 생각한대로 생각하면,

빈 리스트를 생성해주고, 

크기 상관없는 리스트를 정렬해주고(최대한 많은 부서를 지원해주기 위해서 작은 곳 부터 지원해주자고 생각해서.)

그 리스트를 for문을 돌려 하나씩 빼주고 빈 리스트에다가 담아주는데,  리스트 안의 요소들을 더해주는 함수인 sum을 사용하여, num_list리 안의 합이 예산(budget)을 넘어서면 강제로 함수를 종료(break) 시켜주고, 그렇게 나온 총 num_list의 길이를 구해주면 되겠다! 라고 생각했다. 

 

sum 과 break 설명

 

sum

란 파이썬 내장함수로 리스트나 튜플의 안에 있는 모든 요소 값의 합을 돌려준다! 처음에 몰랐어서 기능을 찾아보니.. 역시 파이썬의 내장함수란 편리한 기능이 많다.

 

break

란 반복문이나 while문에서 자주 쓰는 것으로 조건이 다 끝나게 되면 강제로 함수를 나가게 하는 기능을 말한다. 

보통 while문에서 이까지 수행하고 if로 다끝났다라는걸 표현해주고, break를 쓰게 되면 끝!!

 

여기서 또 모르는 것 while 설명

 

while

란 조건문이 참일 동안 반복문을 계속 수행하는것!

 

while(조건)

수행할 것들1

수행할 것들2

 

말로 하니까 어려워보여서 간단하게 합쳐서 break와 while 코드 표현 

 

 

 

a는 0부터 시작해서 10보다 작을때까지 print(a) 출력, 그리고 10이 될 때 break를 써서 강제로 나오게 된다!

 

 

이롷게 출력된다!

 

++len 함수는 리스트의 길이를 리턴하는 함수로 다른 포스팅에 정리해놓았다.

 

 

 

--정리끝--

 

 


 

 

쨋든 맨 처음 함수를 실행하게 되면,

 

 

하나가 실패하게 된다. 그래서 이유를 생각해보려고 vs코드에서 print로 num_list를 찍어보았다.

 

 

 

이렇게 테스트 케이스를 돌려보았더니,

 

 

ㅇㅎ 예산이 8을 넘었을 때까지 출력을 하는구나, 즉 하나를 더 출력해주는 것이다.

 

그래서 -1을 해주면 되는 것 같지만 예산의 금액과 지원 금액이 같을 때(두번째는 성공했으니)는 한개가 부족해지는 결과가 나온다. 그래서 나는 두 가지의 경우를 둘 다 만족하는 것을 생각해주기로 했다. 

 

 

 

이렇게 예산과 리스트 안의 금액과의 합이 같으면 그대로 그냥 그 리스트의 길이를 출력하고,

위에서 설명했듯이 다르다면, 똑같이 그 과정을 해주고 길이에서 1을 빼주기로 했다. 

실행을 시켰을 때의 2케이스는 모두 만족하지만, 제출을 해주었을 때 20개의 테스트 케이스를 돌려보았을 때,

4가지가 틀리게 되는데, 테스트 케이스를 열어서 볼 수는 없어서 일단 내가 생각해보기로했다. 

 

생각해낸 것이 또 예산이 10이고 지원 원하는 금액의 총합이 10보다 적으면?

 

 

 

이렇게 테스트 케이스를 추가해주고 프린트를 통해 num_list를 출력해보면,

 

 

1,2,2,3 을 더해도 10이 안넘기 때문에 모두 출력해주고, 거기서 -1을 빼준다. 작은 결과도 똑같이 그냥 리스트의 길이를 리턴해주어야한다! 그래서 식을

 

 

같은 경우뿐만 아니라, 작거나 같을 때로 합쳐주어 돌리게 되면!

 

 

후...오늘은 생각보다 빨리 푼 것 같지만..? 일단 생각을 잘못하고 있어 코드를 치기보단 계속 문제가 원하는 바 자체를 잘못 알고있었어서 잘못 소요한 시간도 있었고,

 

맨 처음 내가 제출했던 정답을 보면,

 

 

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ..............

이게뭘까요.. 진짜 오만가지 짬뽕 다시킴  일단 while 필요없는데 써주었다...(밑에 if로 조건써줬는데 똑같이 써줌 ㅠ)

계속 출력하면서 테스트 케이스를 만들어 안되는 경우를 추가했더니.. 이렇게 나왔다.. 새벽은 위험해..

 

이 풀이도 위와 같은 과정이지만, 쓸데 없는 while로 인해 더복잡해졌다.. 다음에는 정신 붙잡고 풀어야지..

 


다른 풀이를 리뷰하면서 보다가 , 여러가지 나보다 더욱 효울적으로 적은 코드들을 리뷰잠시 해보기!

 

 

출처-프로그래머스

 

이 함수는 길이를 리턴해주지 않고, 따로 포문 돌아가는 것의 횟수를 0부터 카운트 해주어 (answer) 나처럼 1을 빼줄 필요도 없고 지원을 원하는 합이 예산보다 작거나 같은 경우만 올리면 되니까 나처럼 else문으로 큰 경우를 빼주지 않아도 된다.. (나는 작거나 같은 경우는 길이만 리턴해주도록 했고 큰 경우는 뽑는 방법을 적었는데, 그냥 애초에 처음부터 작거나 같은 경우의 수만 전체적으로 뽑으면 경우의 수가 필요 없는 것이다... 설명이 되었을까) 흑흑 오늘도 이렇게 다른 분들의 코드를 보며 다짐하는 코린이.. 

 

오늘의 포스팅 끝!

 

 

댓글