| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- solved class 2
- c#
- c#코테
- unity3dservival
- 바킹독
- unity게임만들기
- 백준 c++ 공부
- 유니티서바이벌게임만들기
- 유니티
- 백준
- Unity
- c#기본문법
- 티스토리챌린지
- 바킹독알고리즘
- 오블완
- c#코딩기초트레이닝
- c#기초문법
- 유니티게임만들기
- 유니티공부
- 백준코딩테스트
- unity게임
- 리그오브레전드턴제게임
- c++ solved.ac
- C#문법
- c++ 백준
- unity3d게임만들기
- 백준코테
- 백준 C++
- C++
- 백준 구현문제
- Today
- Total
나 개발자 진짜 되냐?
백준 C++ 2839번 설탕 배달 ( 그리디 ) 본문

이번 주는 조금 바쁩니다.
4월에 일정이 꽤 많네요.
저번주말에 사람들이 다들 꽃구경을 갔더라고요.
저는 알바를 했습니다....
아쉬운 일이지만.. 네 그렇습니다.
오늘은 엄마아빠 생신이라서
후딱 문제 풀고
저녁에 이벤트를 후딱 준비해야 합니다.
사실 별건 없고
전날 생각한 이벤트인데
카드를 뽑아서 좋은 카드를 3장 모으면 현금을 주는
그런 걸 생각했습니다.
기대되네요 ㅎ
오늘은 설탕을 배달하러 가봅시다.
시작하기 전에 초콜릿을 먹고 하겠습니다.
몰티져스를 샀거든요 ㅎ!!


설탕을 배달하는데
최소한으로 받고 싶다...
아 예전에 그 최소한으로 하는 거 있었는데 기억이 잘 안 나네요.
정답률이 38 퍼입니다..
원래 5로 나누고
0이랑 3이 나올 때 그리고 안 나올 때로 생각했는데
문제는 나머지가 4가 나올 때가 문제다.
9의 경우겠다.
5 하고 4 하면 사실 이건 안된다며 -1을 낼 텐데
3으로 하면 3으로 딱 떨어진다.
이 4 부분만 생각하면 될 거 같다.
써보고 생각하니 제약이 많았다..
6은 3으로 나누면 2로 딱 떨어지는데
5로 나누면 1이 남고
12는 3으로 나누면 4로 되는데..
5로 나누면 2가 남는다...
..
이러면 숫자를 4로 생각하면 안 된다.
일단 나머지가 3이 나오는 경우와 0이 나오는 경우만 해주고
나머지는 또 다른 예외식이 필요하다.
1,2,4의 경우
일단 3으로 나눠보는 게 맞을 거 같다.
일단 5로는 절대 안 나오기 때문..
21, 12, 9가 그런 경우겠지..
하며 작성했다.

어...
근데 예제 마지막이 문제였다.
11인데...
11은 5 한개 3 두 개로 된다.
근데 이식으로는 -1이 나온다.
.. 긁적..
근데 만약에 51이라고 치자.
5를 45개까지 하고 9개
3을 2개 하면.. 총 11개이다.
이러면 흠.. 6을 남겨놔야 하는 상황인가?
다시 생각하니 54도 문제다.
3으로 나눠 떨어지는데.. 위 식으로 하면..
그냥 tmp /3이어서 최소로 나오지 않는다.
그럼
예외가 참 많을 거 같은데..
에잇.. 모르겠다.
패턴을 못 찾은 느낌이다.
인지 씨에게 주절주절 쓰던 중..
뭔가 알아낸 느낌이다.
5로 나눴을 때
0이면 그냥 5 개수만 쓰기
1일 경우 5를 한 개 빼고 3을 2개 쓰면 되고
2일 경우 5를 두 개 빼고 3을 4개 쓰면 된다.
3일 경우 5를 빼지 않고 3을 1개 쓰면 되고
4의 경우 5를 한 개 빼고 3을 3개 쓰면 된다.
미쳤다!!
해보자!
4와 7은 3으로도 5로도 못 만들지만
그 이상은 다 만들 수 있다.
두 시간에 걸쳐 짠 코드..
과연 답이 맞을까..?

맞았다..!!
두 시간 만에.. 푼 문제..
하지만 이 문제는 뭔가 최적의 효율일 거 같지 않았다.
인지 씨를 찾은 나.
이 문제는 그리디 문제라고 했다.
그리디? 누구 쇼
그리디
당장 눈앞에 보이는 최선의 선택만 고르는 방식
탐욕.. 알고리즘이라고 한다.
800원을 줄 때
우리는 본능적으로 500원부터 꺼낸다.
그리고 100원짜리를 차액으로 준다.
가장 큰 거부터 빠르게 하는 거지!
하지만 우리는 지금
얼마를 줘야 할지 모르니까
일단 작은 걸로 주다가
큰 걸 줄 수 있을 때 주는 것.
지금은 5로 줘야 하는데 5로 못주는 예외들을
if문으로 처리했는데
이런 그리디 문제는
5kg으로 줄 수 있는지 보고
안되면 3kg짜리로 하나씩 주면서 깎아서
5kg로 줄 수 있는지 보는 것!!
그래서 while문으로 계속 나눠주면서
안 나눠지면 cnt 해주고 3씩 빼주는 것이다.
그다음에 5로 나눠지면? 출력하게 되는 것 3의 횟수와 함께!
이 while문을 탈출했다면?
그 녀석은 애초에 5로 나눠지지 않는 친구로 -1을 출력해 주면 된다.

이렇게 풀어주면
if else가 많아서 헷갈리진 않는다.
두 시간 동안 패턴을 찾았다..
근데 이 패턴도 그리디라고 할 수 있을 거 같긴 하다.
뭐랄까.. 결국 나도 5로 나눠지는 걸 찾았고
5로 나눠지면 나머지가 1 2 3 4인데
3은 그냥 하나 더 해주면 되고 1,2,4 만 패턴을 찾아주면 됐다.
사실 뭐 3의 배수 뒷자리를 보려고 했는데
3 6 9 2 5 8 1 4 7 0
으로 뭐 ㅋㅋㅋㅋㅋㅋ
모든 숫자가 다 들어가서 탈락
그래도 풀었다.
오래 걸렸다.
머리가 아프다.
이제 얼른 케이크 사가지고 와야지 ㅎㅅㅎ
'C++을 시작해봐요! > 단계문제를 풀어보아요!' 카테고리의 다른 글
| 백준 C++ 11650번 좌표 정렬하기 ( sort ) (0) | 2026.04.08 |
|---|---|
| 백준 C++ 4949번 균형잡힌 세상 ( stack, getline ) (0) | 2026.04.07 |
| 백준 C++ 1920번 수 찾기 ( 이중탐색 ) (0) | 2026.04.03 |
| 백준 C++ 2751번 수 정렬하기 2 ( sort ) (0) | 2026.04.02 |
| 백준 C++ 1676번 팩토리얼 0의 개수 ( 감별, 소인수분해 ) (0) | 2026.04.01 |
