| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 백준코딩테스트
- 리그오브레전드턴제게임
- Unity
- c#코딩기초트레이닝
- unity3d게임만들기
- 오블완
- C++
- 유니티
- 백준
- 백준 C++
- unity게임만들기
- 유니티게임만들기
- c#기초문법
- c++ 백준
- solved class 2
- 바킹독
- unity3dservival
- c#기본문법
- C#문법
- unity게임
- 유니티서바이벌게임만들기
- c#
- 유니티공부
- 백준 c++ 공부
- 티스토리챌린지
- c++ solved.ac
- c#코테
- 백준 구현문제
- 바킹독알고리즘
- 백준코테
- Today
- Total
나 개발자 진짜 되냐?
백준 C++ 18110번 solved.ac ( 배열 ) 본문

안녕하세요!
주말 잘 보내셨나요!!
저는 볼펜도 사고
샤프도 샀습니다
아니 볼펜이 금색만 사러 갔는데..
너무 예쁜 신상 색깔이 나온 거 아니겠습니까?!?!?!
참지 못해서 샀습니다.
그리고.. 다른 것도 샀습니다.
보라색 샤프도 샀습니다
히히히히
근데 어디 쓰죠..?!
쌓이기만 쌓여요.......
문제 풀 때 볼펜으로 풀어야 할까요..?! ㅋㅋㅎ
오늘의 문제를 풀어봅시다!



음...
생각보다 어렵다.
일단 글자수를 받아서
그 글자수의 절사평균을 구하고
그 절사평균의 값을 위아래로 빼줘야 하는데..
애매한 것은
밑에 몇 개 빼는 건 스택으로 되는데
맨 처음에 넣었던걸 빼는 건... 모른다...
일단 글자수는 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를 해줘야 한다고 한다.

자잔!
오늘 거 어렵다..
사실 처음에 대충 풀어낸거같아서 좋았는데..
결국 인지 씨의 도움을 받았고..
최적의 방법을 위해 한 시간이나 더 고민하고 글을 썼다..
흑흑..
속상한 마음을 안고
오늘은 저번주 금요일에 풀었던 문제를 풀러 가봐야겠다.
'C++을 시작해봐요! > 단계문제를 풀어보아요!' 카테고리의 다른 글
| 백준 C++ 1929번 소수 구하기 ( 에라토스테네스의 체 ) (1) | 2026.04.15 |
|---|---|
| 백준 C++ 1018번 체스판 다시 칠하기 ( 2차원 배열, for ) (0) | 2026.04.14 |
| 백준 C++ 10816번 숫자 카드 2 ( map, upper & lower ) (0) | 2026.04.10 |
| 백준 C++ 11651번 좌표 정렬하기 2 ( sort ) (0) | 2026.04.09 |
| 백준 C++ 11650번 좌표 정렬하기 ( sort ) (0) | 2026.04.08 |
