https://www.acmicpc.net/problem/2292
2292번: 벌집
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌
www.acmicpc.net
1. 문제
💡 문제
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
💡 입력
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
💡 출력
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
2. 풀이
#include <stdio.h>
int main(){
long room = 0, result = 0, check = 6;
scanf("%ld", &room);
room -= 1;
result++;
if (room > 0){
do{
result++;
room -= check;
check += 6;
} while(room > 0);
}
printf("%ld\n", result);
}
3. 메모
문과 출신인 내게는 문제를 이해하는 것도 버거웠다.. 그래서 일단 그림을 그렸다.
흠.. 가만 보니 의외로 쉽게 규칙성을 찾을 수 있었다. 하나의 육각형들이 테두리가 되어 다시 큰 육각형을 그리는데, 첫 번째 육각형 (1)을 제외한 나머지 육각형들은 6, 12, 18, 24, ..., 이런 식으로 6 X A 만큼 증가한다. 이를 바탕으로 코드를 짜보았다.
#include <stdio.h>
int main(){
// 몇 번째 칸을 체크할지 입력 받을 room
// 몇 개의 칸을 지나야 해당 칸에 도착하는지를 체크하는 result
// 위에서 6 x A 만큼 육각형의 각 변에 해당하는 칸들이 증가하기에 그 값을 체크해줄 check
long room = 0, result = 0, check = 6;
scanf("%ld", &room);
// 첫 번째 칸은 규칙에 해당하지 않기에 -1을 더하고 result 값을 1만큼 증가시킨다.
room -= 1;
result++;
// 칸의 값이 2 이상이라면 위에서 체크하고도 값이 남기에 아래 do ~ while ... 을 실행한다.
if (room > 0){
// result 값을 1만큼 증가시키고, room에서 check만큼 값을 빼준다.
// 그리고 check 값을 6만큼 증가시킨다.
// 이렇게 되면 check 값은 계속해서 6만큼 증가하며 그 값만큼 room에서 빠져나갈 것이다.
// 그리고 result 값은 위 조건이 실행될 때마다 1만큼 증가한다.
do{
result++;
room -= check;
check += 6;
// room의 값이 0보다 크다면 위 do 실행문을 실행한다.
} while(room > 0);
}
printf("%ld\n", result);
}
P.S. 나.. 의외로 강할지도..?
'프로그래밍 > 백준 알고리즘' 카테고리의 다른 글
[C] 달팽이는 올라가고 싶다 (백준 알고리즘 2869번) (0) | 2021.08.20 |
---|---|
[C] 분수찾기 (백준 알고리즘 1193번) (0) | 2021.08.19 |
[C] 손익분기점 (백준 알고리즘 1712번) (0) | 2021.08.18 |
[C] 그룹 단어 체커 (백준 알고리즘 1316번) (0) | 2021.08.16 |
[C] 크로아티아 알파벳 (백준 알고리즘 2941번) (0) | 2021.08.11 |