컴퓨터 공부/📚 Baekjoon(백준)

[백준/알고리즘/python/java] 2839번 - 설탕 배달

letzgorats 2021. 1. 28. 13:53

이미지를 누르면 문제링크를 보실 수 있습니다.
이미지를 누르면 문제링크를 보실 수 있습니다.
[2839번 - 설탕 배달]

 

 어떤 수가 주어질 때, 그 수가 5로 나누어 떨어지는 수 라면 5로 하나씩 빼고

3으로 나누어 떨어지는 수라면 3을 하나씩 빼면 될 것 같았다. 약간 그리디 알고리즘처럼 말이다. 하지만, 예외가 있었다.

 

(처음 풀었던 python 코드)

n = int(input())
cnt = 0
while(n != 0):
    if(n % 5 == 0):
        n -= 5
        cnt += 1
    elif(n % 3 == 0):
        n -= 3
        cnt += 1
    else:
        cnt = -1
        break
print(cnt)

하지만, 위 코드처럼 풀면, 8이라는 수는 2가 나와야 정상인데, -1을 출력하고 만다.

다시 고민해봤다.

 

(두번 째로 고친 python 코드)

n = int(input())
cnt = 0
while(n != 0):
    if(n % 5 == 0):
        n -= 5
        cnt += 1
    elif(n % 3 == 0):
        n -= 3
        cnt += 1
    elif(n >= 5):
        cnt += n//5
        n = n % 5
    else:
        cnt = -1
        break
print(cnt)

n >=5 라는 제어문을 처리를 해주었지만, 역시 틀렸다. 관점을 바꿔보았다.

3씩 항상 빼되, 5로 나누어지는 수라면 그 몫을 그대로 cnt에 더해주면 될 것 같았다.

 

(최종 python 코드)

n = int(input())
cnt = 0
while(n != 0):
    if(n % 5 == 0):
        cnt += n//5
        break
    elif(n <= 0):
        cnt = -1
        break
    n -= 3
    cnt += 1
print(cnt)

쉬운 문제라고 생각했지만, 시간이 좀 걸렸다...

 

(자바 코드)

import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int bag =0;
		while(true) {
			if(N%5 ==0) {
				System.out.println(N/5+bag);
				break;
			}
			else if(N<=0) {
				System.out.println(-1);
				break;
			}
			N = N -3;
			bag ++;
		}
		sc.close();
	}
}

 

반응형