마이구미+ 2023. 7. 13. 18:34

문제링크

 

프로그래머스

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

programmers.co.kr

<로직 고민/>

  • 일단 최대한 많은 부서를 지원해 주려면 적은 금액을 지원한 부서부터 선택하면 될 것 같다
  • 그러니 d의 요소들을 오름차순으로 정렬하고 for문을 돌려 budget보다 커지기 전까지 더해주면서 answer를 1씩 올린다
def solution(d, budget):
    total, answer = 0, 0
    d.sort()
    for apply in d:
        total += apply
        answer += 1
        if total > budget:
            answer -= 1
            return answer
        elif total == budget:
            return answer
  • 이렇게 코드를 짜봤다
  • total이 budget보다 커졌을 때 마지막에 더한 건 빼야 하니까 answer에서 1을 뺀 후에 리턴하고, 값이 같을 때는 마지막에 더한 것까지 포함하니까 answer를 그대로 리턴한다
  • 근데 테스트2, 6, 18, 19에서 실패가 떴다
  • 흠..ㅎ..~ 무조건 작은 수부터 더하는 게 최선은 아닌가보다
  • 찾아보니 부서가 1개인 경우도 생각해야 한다고 해서 코드를 수정했다
def solution(d, budget):
    total, answer = 0, 0
    d.sort()
    for apply in d:
        total += apply
        answer += 1
        if total > budget:
            answer -= 1
            return answer
        elif (total == budget) or (total < budget and len(d) == 1):
            return answer
  • 이렇게 하니 2번은 통과하는데 여전히 6,18,19번 케이스에서 실패가 뜬다,,,
  • 아 풀렸다
  • 어처구니없지만 return answer가 반복되는 게 보기 안 좋아 보여서 return answer를 가장 바깥에 두고 if문이나 elif문을 통과하게 되면 break를 걸었더니 통과됐다...!!!
  • 무슨 차이지....? break 대신 return 값이 있을 때도 똑같이 for문은 더이상 돌리지 않고 바로 값을 반환하는 거 아닌가?
  • 뭐 여튼 최근에 계속 1점 아님 2점만 받았는데 이 풀이로 7점을 받았다..!!
  • 왜죠?

<완성된 풀이/>

def solution(d, budget):
    total, answer = 0, 0
    d.sort()
    for apply in d:
        total += apply
        answer += 1
        if total > budget:
            answer -= 1
            break
        elif (total == budget) or (total < budget and len(d) == 1):
            break
    return answer

<다른 사람 풀이/>

- 천재풀이1

def solution(d, budget):
    d.sort()
    while budget < sum(d):
        d.pop()
    return len(d)
  • 난 진짜 바보같이 풀었구나 깨닫는다
  • 내 나름대로 풀이를 하자면 budget이 d 요소들의 합보다 작아질 때까지 while문이 도는데 한 바퀴 돌 때마다 d에서 pop을 한다 그럼 가장 큰 수부터 삭제된다(sort로 오름차순 정렬했으니까)
  • sum(d)가 budget보다 작아져서 while문을 빠져나오게 되면 d 요소들의 개수를 반환한다
  • 와 진짜 소름 어케 이런 생각을..!!!

- 천재풀이2

def solution(d, budget):
    d.sort()
    cnt = 0
    for i in d :
        budget -= i
        if budget < 0 :
               break
        cnt += 1
    answer = cnt
    return answer
  • 이건 내 풀이와 비슷하지만 budget에서 빼는 방식이고 if문을 하나만 쓰고 카운팅도 if문 다음에 한다...!!
  • 카운팅을 if문 다음에 하는 방식으로 나도 바꿔야지...ㅎㅎ

<수정/>

def solution(d, budget):
    total, answer = 0, 0
    d.sort()
    for apply in d:
        total += apply
        if total > budget:
            break
        answer += 1
    return answer
  • 천재풀이2를 참조해서 기존 내 코드를 좀 더 간결하게 바꿔보았다
  • 이렇게 했으면 7점보다 더 많이 받았으려나...?!