이 세계에선 내가 개발자?
[14916/Swift] 거스름돈 본문
*** 언어는 Swift! ***
이번에 풀어본 문제는 예전에 크레인 문제와 조금 비슷해보이는 문제였다. 물론 그 때 크레인 문제는 풀지 못했지만 문제 이해는 했었기 때문에 새로운 마음으로 문제 풀이에 도전해보았다.
자세한 문제는 아래와 같다.
여기서 중점은 2원짜리와 5원짜리를 최대한 최소가 되도록 거슬러주어야한다는 것이다.
나는 일단 숫자들을 가져와 2와 5로 빼보면서 어떤 규칙이 있는지 찾아보았다.
내가 찾은 규칙은 n이 홀수면 5로 먼저 빼주고, n이 짝수면 2로 먼저 빼주면 된다는 것이었다.
한 번 빼고 난 뒤 다시 홀수인지 짝수인지 파악해 5와 2를 빼주면 된다.
자 그럼 문제를 쪼개보자.
1. 첫째 줄에 거스름돈 액수 n이 주어진다.
2. 만약 짝수인 경우 2부터 빼주고 짝수인데 5의 배수라면 5를 빼준다.
3. 만약 홀수인 경우 5부터 빼준다.
4. 만약 남은 거스름돈이 0보다 적으면 -1을 출력한다.
천천히 하나씩 해보자.
1. 첫째 줄에 거스름돈 액수 n이 주어진다.
let n = Int(readLine()!)!
var rest: Int = n
var chargeCount: Int = 0
입력받을 n과 남은 거스름돈을 계산할 rest, 그리고 갯수를 구할 chargeCount를 선언해준다.
2 ~ 3
// 돈을 계속 거슬러 줄 수 있을 때까지 반복
while rest > 0 {
// 만약 액수가 2보다 작으면 -1 또는 -가 되면
if n < 2 {
chargeCount = -1
break
}
// 만약 짝수인 경우 2부터 빼준다.
if rest % 2 == 0 {
// 만약 짝수인데 5의 배수라면 5로 제거해준다.
if rest % 5 == 0 {
rest = rest - 5
chargeCount += 1
} else {
rest = rest - 2
chargeCount += 1
}
} else if rest % 2 == 1 { // 만약 홀수인 경우 5부터 빼준다.
rest = rest - 5
chargeCount += 1
}
}
while문을 이용해 거스름돈이 0보다 클 때 까지만 반복한다. 0보다 작으면 거슬러줄 수 없기 때문에 끝나야하기 때문이다.
먼저 액수가 2보다 작은 수가 들어올 경우 아예 거슬러 줄 수 없기 때문에 -1을 출력한다.
다음은 짝수인지, 홀수인지 구분한다.
예제 입력 중 14라고 한다면 14는 짝수이기 때문에 if문을 탈 것이다.
if문 안에서도 5의 배수인지 체크한다. 그 이유는 현재 남은 금액이 10이어서 짝수지만 5의 배수이기 때문에 2원을 5개 거슬러 주는 것보다 5원을 2개 거슬러주는 게 최소가 되기 때문이다.
자 다시 n이 14라면 if문을 타고 들어와서 5의 배수인지 확인했지만 아니기 때문에 else를 타 14에서 2를 빼준다.
그럼 남은 잔액은 12가 된다.
12가 된 잔액은 다시 while문을 타서 짝수이기 때문에 if문을 탄다. 역시나 5의 배수가 아니기 때문에 2를 빼면 나머지는 10이 된다.
10이 된 잔액은 또 다시 while문을 타 짝수이기 때문에 if문을 탄다. 그러나 이번엔 5의 배수이기 때문에 5를 빼주게 된다. 그럼 나머지는 5가 된다.
5가 된 잔액도 마찬가지로 if로 들어와 5의 배수이기 때문에 5를 빼주면 남은 잔액은 0이 된다. 0이 되었으니 while문을 반복하지 않는다.
이렇게 되면 n이 14일 때 동전의 갯수는 2, 2, 5, 5 이렇게 4개가 된다.
4. 만약 남은 거스름돈이 0보다 적으면 -1을 출력한다.
if rest < 0 {
chargeCount = -1
}
마지막으로 위의 프로세스를 모두 끝냈지만 결국은 0보다 작은 경우에는 완벽히 거슬러줄 수 없기 때문에 -1을 출력한다.
이렇게 하면 최소 동전의 갯수를 구할 수 있게 된다!
이번에도 한 건 해결 /(^p^)/
'알록리즘 > BAEKLOG' 카테고리의 다른 글
[13699/Swift] 점화식 (0) | 2023.06.26 |
---|---|
[9095/Swift] 1, 2, 3 더하기 (2) | 2023.06.15 |
[14495/Swift] 피보나치 비스무리한 수열 (0) | 2023.06.14 |
[4358/Swift] 생태학 (0) | 2023.06.02 |
[14582/Swift] 오늘도 졌다 (0) | 2023.05.12 |