자료구조&알고리즘/백준
[JAVA] 2839번 - 설탕 배달
celinayk
2024. 8. 17. 23:39
반응형
문제 탐색하기
- 문제에서 구해야 하는 최종 정답은 무엇인지 탐색한 과정
- 그 정답을 구하기 위해 어떻게 코드를 구현해야 할지 고민한 과정
- 문제에 들어오는 범위를 파악하여 어떤 알고리즘을 쓸 수 있을지 고민해 가는 과정
그리디 문제이다
키로 수가 큰 봉지부터 계산을 하면 최소의 봉지 수로 옮길 수 있다
그럼 각 단계의 최적해가 전체 문제의 최적해를 만족한다
거스름돈이랑 비슷한데 예를들어 6키로 같은경우는 5키로 봉지를 쓰면 나눠떨어지지 않아서 3키로 두개가 되어야 한다.
먼저 5키로로 최소한의 봉지수로 설탕을 옮길 수 있게 구하고,
남은 키로수를 3키로로 채울수 있는지 확인하면 된다.
6키로의 경우 5키로를 하면 1키로라서 나눠떨어지지 않는다
3키로를 두개 쓰면 딱 나눠 떨어진다
결국 실제로 가능한 해인지 점검을해야한다
코드 설계하기
위의 문제 탐색하기에서 고민한 과정을 토대로 문제 풀이에 대한 실마리를 잡았다면, 문제 풀이를 본격적으로 하기전, 문제를 풀이 위한 로드맵을 그려본다
어떤 순서로 코드를 작성해야 할지, 어떤 함수들을 작성해야 할지 등을 작성
1. N을 입력받5는다.
2. 5키로로 가능한지 먼저 시도를해보고 불가능일 경우
3. 3키로로 가능한지 N-3키로 이렇게 진행하고 다시 5키로로 가능한지 확인한다
시도 회차 수정 사항
- 무분별하게 "맞았습니다" 가 나올때까지 수정하는 형태의 문제 풀이를 반복하면, 내가 어떤 실수를 해서 해당 문제를 틀렸는지 모르게 된다
- 틀렸습니다를 받았다면 왜 틀렸는지 고민핸보고, 어떻게 수정할 수 있는지 고민하는 과정을 작성
- 위에 내가 세울 설계에서 어떤 부분이 틀렸는지도 함께 점검public class Main { public static void main(String[] args) throws Exception, IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int cnt=0; while(n%5!=0) { if(n%5==0) { System.err.println(n/5); return; } else { n-=3; cnt++; } } if(n<0) { System.out.println(-1); } else { System.out.println(cnt+(n/5)); } } }