나 개발자 진짜 되냐?

백준 C++ 18110번 solved.ac ( 배열 ) 본문

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

백준 C++ 18110번 solved.ac ( 배열 )

Snow Rabbit 2026. 4. 13. 18:34

 

안녕하세요!

주말 잘 보내셨나요!!

 

저는 볼펜도 사고

샤프도 샀습니다

아니 볼펜이 금색만 사러 갔는데..

너무 예쁜 신상 색깔이 나온 거 아니겠습니까?!?!?!

 

 참지 못해서 샀습니다.

그리고.. 다른 것도 샀습니다.

보라색 샤프도 샀습니다

히히히히

근데 어디 쓰죠..?! 

쌓이기만 쌓여요.......

문제 풀 때 볼펜으로 풀어야 할까요..?! ㅋㅋㅎ

 

오늘의 문제를 풀어봅시다!


 

 

 

 

음...

생각보다 어렵다.

 

일단 글자수를 받아서

그 글자수의 절사평균을 구하고

그 절사평균의 값을 위아래로 빼줘야 하는데..

 

애매한 것은

밑에 몇 개 빼는 건 스택으로 되는데

맨 처음에 넣었던걸 빼는 건... 모른다...

 

일단 글자수는 10의 5승

그냥 배열에 하나씩 넣는 게 제일 나을 것 같았다.

 

반올림... 이 근데 뭐더라..?

 

나는 왜 ceil만 생각나는가..

인지 씨를 찾았다.

 

 

0. include <cmath>을 선언

필수!

하지만 나는

bits/stdc++. h를 쓰고 있지만..!

기억해 둡시다!

 

1. 올림 : ceil( 숫자 )

ceiling  천장이라는 뜻을 가지고 있다.

ceil(3.1) > 4

ceil(3.001) > 4

 

 

2. 버림 : floor( 숫자 )

floor 바닥이라는 뜻을 가지고 있다.

floor(3.1) > 3

floor(3.9) > 3

 

 

3. 반올림 : round( 숫자 )

round 소수점 첫째 자리가 딱 반을 넘느냐 못 넘느냐 기준

round(3.4) > 3

round(3.5) > 4

 

 

round를 써야 하는구나..!

 

흠..

이렇게 했는데

숫자가 적으면 답이 맞는데

숫자가 많으면 답이 틀리다..

 

왜일까...

 

인지 씨를 찾았다.

 

문제 1

end값이 이상하다.

5-1을 할 경우 4인데

우리는 0부터 카운트해서

1부터 3까지 해야 하는데

4를 포함시키면 안 된다!!

 

 

문제 2

값이 아무것도 없을 때 0을 내야 하는데 

그 예외식이 없다.

그러네 깜빡했소..!

 

문제 3

cout 할 때 end만 해주면 될까??

인원수를 자아아아아알 생각해 봐라.

 

어 그렇다.

end는 끝만 한 거라

또 jsum을 빼줘야 한다.

 

 

문 1 해결

end의 범위 수정

 

 

문 2 해결

맨 마지막에 sum == 0으로 하면

float에서 나누고 곱해질 때 문제가 발생할 거 같아서

맨 앞에 써줬다.

 

 

문 3 해결

 

 

그래서 최종답은!!

 

짠!

 

사실 그 배열을 30만 개를 만드는 거 보단..

점수가 30개만 있다는 점을 활용해 풀 순 없을까? 

생각했는데

 

인지 씨도 후자로 푸는 방법이 더 효율적일 거 같다고 하긴 했다.

 

그래서 다시 풀어보았다.

 

 

 

근데 너무 어렵다...

ㅋㅋㅋ

점수가 30개만 있다는 건 아는데

만약에 2개만 빼야 하는데 1이 3개거나..

3개를 빼야하는데 1이 2개면 2도 빼야하는데

그걸 어떻게 구분 짓는다는 거지..?

 

 

아무리 읽어도 이해가 안 가서

인지 씨한테 모르겠다고 펑펑 울었더니

 

하나씩 알려주었다.

 

 

먼저 변수 3개 만들기

 

다 더해주기 위한 sum

70 퍼여서 점수에 더해진 add

15 퍼여서 버려진 dis

 

 

for문으로 1부터 30까지 돌고

왜냐면 숫자가 1부터니까!

 

 

절사평균을 구해서 = 빼줄 인원 = jsum

 

그래서!

while문으로 v [i]가 0보다 클 때까지 계속 돌리며

 

그 안에서는

 

빼 줄 애 jsum보다 dis가 작으면

dis를 하나 추가해 주고

 

더 해줄 애 ren보다 add가 작으면

add를 하나 추가해 주고

 

v [i]를 -- 해준다.

 

즉 for문으로 모든 칸을 다 돌면서

 

상위 15 퍼 / 하위 15퍼 글자는

dis를 통해 dis를 카운트해주면서

글자를 그냥 빼주고

 

나머지 70 퍼는

add를 통해 sum에 더해준 후

add 카운트를 하고

글자도 비워준다.

 

결국 모든 통에 다 넣기 위해

글자를 하나씩 빼는 것!

 

 

그리고 중요한 건

 

이렇게!

 

또 마지막으로 중요한 게 cout 부분에 (float)인데

int 랑 int를 / 해주면 무조건 버린다고 한다.

5 /2를 하게 되면

2.5인데 int여서 자동 2가 되고

그 상태에서 round를 해버려서 영원히 2가 된다고 한다.

 

그래서 float를 해줘야 한다고 한다.

 

 

자잔!


 

오늘 거 어렵다..

사실 처음에 대충 풀어낸거같아서 좋았는데..

결국 인지 씨의 도움을 받았고..

 

최적의 방법을 위해 한 시간이나 더 고민하고 글을 썼다..

 

흑흑..

속상한 마음을 안고

오늘은 저번주 금요일에 풀었던 문제를 풀러 가봐야겠다.