문제
https://www.acmicpc.net/problem/2292
코드
#include<iostream>
using namespace std;
int main() {
int room;
int sum = 1; //방 갯수 누적 합(no.1은 미리 카운트)
int n = 2; //거치는 방의 갯수(no.1은 미리 카운트)
int cnt = 1; //더한 수의 갯수(1은 미리 카운트해준다.)
cin >> room;
//입력받은 방 번호보다 누적 합이 커지면 반복문 종료
while (sum < room) {
sum += (n - 1) * 6;
n++;
cnt++;
}
cout << cnt;
return 0;
}
코드 설명
알아보기 쉽도록 사진에 색을 입혀 패턴을 확인해 본다.
no | 방 번호 | 방 갯수 | 거치는 방의 갯수 |
1 | 1 | 1 | 1 |
2 | 2 3 4 5 6 7 | 6 | 2 |
3 | 8 9 10 11 12 13 14 15 16 17 18 19 | 12 | 3 |
4 | 20 21 22 23 24 25 26 ... 36 37 | 18 | 4 |
5 | 38 39 40 41 42 43 44 45 46 ... 60 61 | 24 | 5 |
방의 갯수 = (거치는 방의 갯수 - 1) * 6
(no. 1은 방의 시작점이므로 제외)
이 문제에서 요구하는 것은 거치는 방의 갯수이다.
만약 사용자가 43을 입력했다면, 43이 되기 위해서는 1 + 6 + 12 + 18 + 6이 필요하다.
해당 식의 덧셈연산을 수행한 숫자의 갯수가 바로 거치는 방의 갯수이다.
이를 코드로 구현해 보면,
int room;
int sum = 1;
int n = 2;
int cnt = 1;
int room ☞ 사용자에게 입력받을 방의 갯수
int sum = 1 ☞ 방 갯수 누적 합(no.1은 미리 카운트)
int n = 2 ☞ 거치는 방의 갯수(no.1은 미리 카운트)
int cnt = 1 ☞ 더한 수의 갯수(1은 미리 카운트해준다.)
while (sum < room) {
sum += (n - 1) * 6;
n++;
cnt++;
}
cout << cnt;
사용자에게 입력받은 방 번호가 누적 합보다 커지면 반복문을 종료한다.
만약 사용자가 room에 43을 입력했다면, 누적합 계산은 43보다 작을 때까지 반복.
☞ sum = 1(sum기본 값) (반복문 시작)+ 6 + 12 + 18 + 24 = 61 (반복문 4회 진행 후 종료)
(반복문 다섯 번째 진행 시도 -> room(43)보다 sum(61)이 더 큰 수이므로 while문 종료)
☞ n = 2(기본 값) → (반복문 시작)3 → 4 → 5 → 6
☞ cnt = 1(기본 값) → (반복문 시작)2 → 3 → 4 → 5
마무리
한 시간 동안 고민하던 걸 디버깅 한번으로 해결.
역시 갓디버깅...
비주얼 스튜디오 디버깅에도 익숙해지자.
↓디버깅 사용법 참고한 블로그
'Problem Solving > 백준' 카테고리의 다른 글
[백준|C++] 2750: 수 정렬하기 (0) | 2021.09.10 |
---|---|
[백준|C++] 2869: 달팽이는 올라가고 싶다 (0) | 2021.09.02 |
[백준|C++] 10250: ACM 호텔 (1) | 2021.09.01 |
[백준|C++] 1712: 손익분기점 (0) | 2021.08.31 |
[백준|자바] 5622: 다이얼 (0) | 2021.08.28 |
[백준|자바] 2908: 상수 (0) | 2021.08.28 |