문제 링크 : 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 |