나 개발자 진짜 되냐?

백준 C++ 30802번 웰컴키트 ( a를 b개 묶을 때 마법의 공식 ) 본문

C++을 시작해봐요!/단계문제를 풀어보아요!

백준 C++ 30802번 웰컴키트 ( a를 b개 묶을 때 마법의 공식 )

Snow Rabbit 2026. 2. 24. 19:13

 

오늘은 늦은 점심을 먹고

우리 몸을 위한 검은콩 호두와 아몬드 두유를 마셨다.

오랜만에 먹으니까 너어어무 맛있었다.

 

거기에 더하여

해리포터 말포이 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 : ss에서 하나 빼서 c에 잠시 빌려 쓰는 용도이고

int &x : vv에 있는 첫 번째 위치를 x로 가져와서 x를 수정하면 v식도 같이 바뀌게 된다.

 

그게 아니면 그냥 이렇게 3줄로 해야 하는 거 같다.

 

이것도 저것도 머리 아프긴 하네..ㅎㅋ

 


 

또 금방 걸릴 줄 알았던 문제는 한 시간 반이나 걸려버렸다.

그래도 엄청 틀린 건 아니었는데.. 어쩌다 보니...

고생했다.!

말포이 같이 공부해서 즐거웠다.

다음은 헤르미온느인가?!?