문제 설명
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 |
문제 설명
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 |