Link
문제
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
입력 > 첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
출력 > 입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
| 예제 입력
13
| 예제 출력
3
제출
const input = (
process.platform == "linux"
? require("fs").readFileSync("/dev/stdin").toString()
: `58`
).trim();
const N = input;
let range = 1,
limit = 1;
while (limit < N) {
limit += 6 * range;
range++;
}
console.log(range);
풀이과정
중심으로 부터 멀어질수록 숫자의 범위는 6씩 증가하고, 최소 개수의 방은 1씩 증가하는 것을 볼 수 있다.
ex)
N이 1일 때, 최소 개수의 방은 1개
N이 2~7일 때, 최소 개수의 방은 2개
N이 8~19일 때 최소 개수의 방은 3개
.....
따라서 범위의 마지막 숫자를 limit라고 했을 때, limit는 (6 * 범위의 합)이라는 걸 알 수 있다.
ex)
limit가 7 일 때, limit === 1 + 6 * 1
limit가 19 일 때, limit === 1 + 7 + 6 * 2
주어진 N의 값이 limit보다 크다면 반복문을 종료시키고, 해당 범위의 값을 출력하면 된다.
Comment
이전 손익분기점 문제를 풀었을 때 반복문을 사용하면 시간 초과가 뜬다는 생각에, 범위가 1,000,000,000까지인 것을 보고
처음부터 반복문을 배제하고 생각했다.
그래서 규칙을 거의 다 찾아놓고서 등차수열,,,등을 생각하면서 계속해서 규칙을 찾아내고 있었는데
이 문제는 그럴 필요가 없었다. 사고력을 요하는 문제들을 풀어보니까 내 실력이 들통나는 것 같다😂
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준] 2869: 달팽이는 올라가고 싶다 (javascript) (0) | 2022.07.06 |
---|---|
[백준] 1193: 분수찾기 (javascript) (0) | 2022.07.06 |
[백준] 1712: 손익분기점 (javascript) (0) | 2022.07.06 |
[백준] 1316: 그룹 단어 체커 (javascript) (0) | 2022.07.06 |
[백준] 2941: 크로아티아 알파벳 (javascript) (0) | 2022.07.05 |