본문 바로가기
Algorithm

[백준/BOJ] 2292번 벌집 C++

by SoyeonCha 2024. 10. 15.

문제 링크 : https://www.acmicpc.net/problem/2292

 

문제

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.

 

풀이

수열로 생각.

1, 7(= 1+6), 19(= 1 + 6*1 + 6*2), ... 이런식으로 늘어남.

N이 위치한 층의 번째 수 알아내면 됨.

13은 2번째 항인 7보다 크고 3번째 항인 19보다 작은 수니까 13에 해당하는 값은 3.

while문 안에 넣어서 1, 6, 12, 18, ... 이렇게 빼가면서 주어진 값이 속하는 번째 수 구하기

 

틀린 코드

while문 내에서 N==0인 경우와 N>0&&N<result*6인 경우를 분리했어야 되는데 N==0인 경우에도 reult ++; 연산을 하도록 작성해서 틀렸음. 19와 같이 해당 층의 마지막 숫자인 경우를 제대로 처리하지 못했음.

#include <iostream>
using namespace std;
int N;

int main(void){
    cin >> N;
    int result = 1;
    N --;
    while(true){
        if (N >= result*6){ 
            N -= result*6;
            result ++;
        }
        else{
            if (N>=0){
                result ++;
                break;
            }
            return 0;
        }
    }
    cout << result;
}

 

맞힌 코드

#include <iostream>
using namespace std;
int N;

int main(void){
    cin >> N;
    int result = 1;
    N --;
    
    while(true){
        if (N >= result*6){ 
            N -= result*6;
            result ++;
        }
        else if(N==0){
            break;
        }
        else{
            if (N>0){
                result ++;
                break;
            }
        }
    }
    cout << result;
}

 

'Algorithm' 카테고리의 다른 글

[백준/BOJ] 20125번 쿠키의 신체 측정 C++  (0) 2024.11.07
[백준/BOJ] 9655번 돌 게임 C++  (0) 2024.11.07
[소프티어/Softeer] 나무 공격 C++  (0) 2024.11.01
[백준/BOJ] 23971번 ZOAC 4  (0) 2024.10.15
[알튜비튜] 01. 정렬  (0) 2023.07.04