| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 바킹독알고리즘
- 바킹독
- C#문법
- c#기초문법
- 유니티
- c#
- 유니티게임만들기
- 오블완
- c#코테
- unity3d
- Unity
- c#프로그래머스기초문법
- c#문제
- unity게임만들기
- 유니티공부
- 백준
- c# c#프로그래머스
- 백준 c++ 공부
- unity3d게임만들기
- 백준코테
- 유니티3dui
- 백준 구현문제
- 유니티서바이벌게임만들기
- 백준 C++
- c#코딩기초트레이닝
- unity게임
- 티스토리챌린지
- 백준코딩테스트
- c#기본문법
- unity3dservival
- Today
- Total
나 개발자 진짜 되냐?
백준 C++ 30802번 웰컴키트 ( a를 b개 묶을 때 마법의 공식 ) 본문

오늘은 늦은 점심을 먹고
우리 몸을 위한 검은콩 호두와 아몬드 두유를 마셨다.
오랜만에 먹으니까 너어어무 맛있었다.
거기에 더하여
해리포터 말포이 asmr을 들으면서 했다.
아니 속삭이는 버전과 아닌버전 두 가지였는데
속삭이는 버전이 조회수가 3배나 많길래 틀었는데
옆에서 조잘조잘거리는 게 집중력이 박살 나는 거 같은데 이게 왜 3 배지? 싶었다
하지만 나는 계속 이걸 들었다...
ㅋㅋㅋㅋㅋㅋ
그렇게 오늘의 문제를 풀었다.


문제를 대충 이해하는데만 5분이 걸렸다.
< 주어진 식 >
23 = 인원수
3 1 4 1 5 9 = 옷 사이즈별 필요개수
5 7 = 옷이랑 펜 한 묶음당 몇 개 들었는지
< 나와야 하는 식 >
7 = 옷 필요 개수
( 5묶음이니까 xxl만 2세트 사면 개수가 된다. 그래서 7개 )
3 2 = 펜 3개 사고 2개 따로 사면 23개 완성!
1. t - v 해주기 = 횟수는 1로 고정
2. v - t 해주면 횟수가 늘어날 수 있음,
3. 0이면 안됨.
그래서!

for문을 통해
0은 아니면서 t가 더 클 경우
무조건 한 묶음만 있으면 되니까 +1 만 해주었고
다른 경우, t가 더 작다면
나눠주고 그 몫만큼 더 추가해 주면 될 것 같았다.
근데 틀렸다.
예외가 필요한가 보다.
0이었을 때도 잘 맞췄는데 흠.. 0이면 카운트되지 않는데도 문제가 있나 보다.
제씨에게 물어봤다.
예외적인 부분이 하나 빠졌다고 한다.
그것은 바로 배수일 때였다.
지금은 그냥 v [i]가 t보다 클 때를 하고
나머지가 무조건적으로 나온다고 생각하고 +1을 해주고 있다.
그래서 그 조건을 따로 걸어주어야 한다.

이렇게 배수일 때 즉 나머지가 없을 때는 +1을 안 해주면 된다!
답은 맞았다고 나온다!
최적의 풀이법은 올림(ceiling)이라고 했다.
이 기법은
( v [i] + t -1 ) / t
이 식은 s/t의 올림값을 구하는 가장 최신식 방법이라고 한다.
if문이 줄줄 길 필요가 없다고 한다.
cnt = ( v[i] + t -1 ) / t 해주면 끝이라고 한다.
어떻게 이렇게 될까?!
HOW?!?
자 7 6 2라고 해보자 t는 3이다
7부터 하면
7 + 3 - 1 = 9 / 3 = 3묶음
6 + 3 - 1 = 8 / 3 = 2묶음
2 + 3 - 1 = 4 / 3 = 1묶음
참 특이한 방식이다.
이런 똑 부러지는 계산식이 있다니...
a를 b 개씩 묶을 때 필요한 최소 묶음의 수 를 구할 때 쓰는 마법의 공식!
오래 기억해 두자!

아! 그리고
두번째 cnt 더해줄때
for 이거 말고
for(int n : size) 로 해줘도 된다!
아! 그리고 나 벡터 항상 이거 for문 헷갈려서
자꾸 int a; cin >> a; v.pushback(a); 이렇게 하는데
1. 미리 개수가 정해져 있으면 v() 괄호하고 괄호 안에 개수를 미리 적어둔다.
그리고 for문 안에 cin >> v [i]; 해주면 세줄이 아니라 한 줄!
vector v(6); // 1. 미리 6칸짜리 공간을 만든다.
for (int i = 0; i < 6; i++) cin >> v [i]; // 2. 그 칸에 바로 넣는다.
2. 세상이 좋아지면서 for문의 길이도 짧아졌다.
vector <int> v(6); // 1. 미리 6칸짜리 공간을 만든다.
for (int &x : v) cin >> x; // 2. v의 각 요소를 x라는 이름으로 불러와서 바로 입력!
int x를 만드는데 &이게 꼭 필요하다.
내가 지금까지 char c : s 이런 거 쓸 땐 필요 없었는데 왜지?
했는데
char c : s는 s에서 하나 빼서 c에 잠시 빌려 쓰는 용도이고
int &x : v는 v에 있는 첫 번째 위치를 x로 가져와서 x를 수정하면 v식도 같이 바뀌게 된다.
그게 아니면 그냥 이렇게 3줄로 해야 하는 거 같다.
이것도 저것도 머리 아프긴 하네..ㅎㅋ
또 금방 걸릴 줄 알았던 문제는 한 시간 반이나 걸려버렸다.
그래도 엄청 틀린 건 아니었는데.. 어쩌다 보니...
고생했다.!
말포이 같이 공부해서 즐거웠다.
다음은 헤르미온느인가?!?
'C++을 시작해봐요! > 단계문제를 풀어보아요!' 카테고리의 다른 글
| 백준 C++ 1978번 소수 찾기 ( 에라토스테네스의 체 ) (1) | 2026.02.25 |
|---|---|
| 백준 C++ 4153번 직각삼각형 ( 피타고라스 정리 ) (0) | 2026.02.23 |
| 백준 C++ 3052번 나머지 ( sort, unique, erase, set ) (0) | 2026.02.19 |
| 백준 C++ 10818번 최소, 최대 ( minmax_element ) (0) | 2026.02.12 |
| 백준 C++ 10250번 ACM 호텔 ( 컴퓨터는 0, 나는 1 ) (0) | 2026.02.11 |