✏️기록하는 즐거움
article thumbnail

Link

 

2292번: 벌집

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌

www.acmicpc.net

 

 

문제


위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 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까지인 것을 보고

처음부터 반복문을 배제하고 생각했다.

그래서 규칙을 거의 다 찾아놓고서 등차수열,,,등을 생각하면서 계속해서 규칙을 찾아내고 있었는데

이 문제는 그럴 필요가 없었다. 사고력을 요하는 문제들을 풀어보니까 내 실력이 들통나는 것 같다😂

 

profile

✏️기록하는 즐거움

@nor_coding

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!