[Swift] lv.1 예산 | Programmers

2024. 3. 29. 11:03· iOS/Programmers
목차
  1. 문제 설명
  2. 제한 사항
  3. 1차 고민
  4. 1차 코드
  5. 1차 결과
  6. 2차 고민
  7. 2차 코드
  8. 2차 결과
  9. 보완점

문제 설명

S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는 없습니다. 그래서 최대한 많은 부서의 물품을 구매해 줄 수 있도록 하려고 합니다.

물품을 구매해 줄 때는 각 부서가 신청한 금액만큼을 모두 지원해 줘야 합니다. 예를 들어 1,000원을 신청한 부서에는 정확히 1,000원을 지원해야 하며, 1,000원보다 적은 금액을 지원해 줄 수는 없습니다.

부서별로 신청한 금액이 들어있는 배열 d와 예산 budget이 매개변수로 주어질 때, 최대 몇 개의 부서에 물품을 지원할 수 있는지 return 하도록 solution 함수를 완성해주세요.

제한 사항

d는 부서별로 신청한 금액이 들어있는 배열이며, 길이(전체 부서의 개수)는 1 이상 100 이하입니다.
d의 각 원소는 부서별로 신청한 금액을 나타내며, 부서별 신청 금액은 1 이상 100,000 이하의 자연수입니다.
budget은 예산을 나타내며, 1 이상 10,000,000 이하의 자연수입니다.

1차 고민

일단 필요한 고차함수는 sort()밖에 모르겠다. 나머지는 for문을 돌려야 할 것 같은 느낌...

1차 코드

import Foundation

func solution(_ d:[Int], _ budget:Int) -> Int {
    var arr: [Int] = d
    var limit = budget
    var count = 0

    arr.sort()

    for i in arr {
        if limit == 0 {
            return count
        }
        if limit < 0 {
            return count-1
        }
        limit -= i
        count += 1
    }
    return count
}

1차 결과

뭔가...

2차 고민

어떤 특정한 조건에서만 에러가 나는 것 같다. 내가 짜놓은 로직의 논리대로 따라가면서 점검해볼 필요가 있다.
돈을 딱 맞게 쓴다고 가정했을 떄 count가 올라가는 위치와 limit에서 i를 빼는 위치가 동일하고 if문이 위에 작성되어있어 예산이 초과하여 지원해줄 수 없음에도 카운트가 하나 올라간 채로 리턴이 나오는 오류가 있었다.
[1,2,3,4]를 요청했고 7의 budget이 있다면, 1,2,3만 지원 가능하고 4는 지원 불가인데 count가 4가 된다.
이 문제를 해결하기 위해서 일단 limit와 count를 올리고 if문 두 개를 아래로 내려서 0이 되는 즉시 혹은 마이너스가 되는 즉시 return이 유효하도록 변경한다.

2차 코드

import Foundation

func solution(_ d:[Int], _ budget:Int) -> Int {
    var arr: [Int] = d
    var limit = budget
    var count = 0

    arr.sort()

    for i in arr {
        limit -= i
        count += 1
        if limit == 0 {
            return count
        }
        if limit < 0 {
            return count-1
        }
    }
    return count
}

2차 결과

일단 맞았다.

보완점

근데 뭔가 코드가 뭔가뭔가다... 잘 돌기는 하는데 너무 안예쁘다...
리턴 조건도 너무 많고 결론적으로 return이 예산 딱맞을 경우, 모자를 경우, 남을 경우 3가지로 나누어서 존재한다는 게 마음에 좀 걸린다.
arr의 index는 전부 돌리되 중간 탈출 조건을 하나만 주는 방법으로 고칠 수 있을 것 같다는 생각이 든다.

import Foundation

func solution(_ d:[Int], _ budget:Int) -> Int {
    var arr: [Int] = d
    var limit = budget
    var count = 0

    arr.sort()

    for i in arr {
        if limit < i {
            break
        }
        limit -= i
        count += 1
    }
    return count
}

이렇게 하면 리턴값을 하나만 사용하고 if문도 하나로 줄어들지만 결과는 똑같이 나온다. 처음부터 이게 하고싶었다...

저작자표시 (새창열림)

'iOS > Programmers' 카테고리의 다른 글

[Swift] lv.1 삼총사 | Programmers  (0) 2024.04.02
[Swift] lv.1 이상한 문자 만들기 | Programmers  (0) 2024.04.01
[Swift] lv.1 3진법 뒤집기 | Programmers  (0) 2024.03.28
[Swift] lv.2 이진 변환 반복하기 | Programmers  (0) 2024.03.27
[Swift] lv.1 최대공약수와 최소공배수 | Programmers  (0) 2024.03.26
  1. 문제 설명
  2. 제한 사항
  3. 1차 고민
  4. 1차 코드
  5. 1차 결과
  6. 2차 고민
  7. 2차 코드
  8. 2차 결과
  9. 보완점
'iOS/Programmers' 카테고리의 다른 글
  • [Swift] lv.1 삼총사 | Programmers
  • [Swift] lv.1 이상한 문자 만들기 | Programmers
  • [Swift] lv.1 3진법 뒤집기 | Programmers
  • [Swift] lv.2 이진 변환 반복하기 | Programmers
sngsp
sngsp
야구돌이 집사의 코딩 그리기
sngsp
[Sngsp] Coding Drawing
sngsp
전체
오늘
어제
  • 분류 전체보기 (90)
    • C (12)
      • BaekJoon (12)
    • iOS (78)
      • Programmers (48)
      • Allen Swift School (1)
      • TIL (Today I Learned) (29)

블로그 메뉴

  • 홈
  • C
  • Swift

공지사항

인기 글

태그

  • Programmers
  • 코딩
  • baekjoon
  • 백준
  • 공부
  • 개발
  • 알고리즘
  • c언어
  • 문법
  • 엑스코드
  • til
  • 프로그래머스
  • 개발자
  • UIkit
  • Swift
  • 애플
  • algorithm
  • ios
  • 스위프트
  • XCode

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
sngsp
[Swift] lv.1 예산 | Programmers
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.