문제
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
입력
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
출력
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
코드
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int count = 1; // 겹 수(최소 루트)
int range = 2; // 범위 (최솟값 기준)
if (N == 1){
System.out.println(1);
}
else {
while(range <= N){
range = range + (6 * count);
count++;
}
System.out.println(count);
}
}
}
풀이
처음에는 아래와 같이 코드를 짰다. 하지만 틀렸다. 출력은 제대로 되었지만 어느 부분에서 틀렸는지는 잘 모르겠다.
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int i = 1;
int before = 1;
while(true){
int after = before + 6 * i;
if (N == 1){
System.out.println(1);
break;
}
if( (before <= N) && (N <= after)){
System.out.println(i+1);
break;
}
before = after +1;
i++;
}
}
}
문제를 보면 벌집들 사이의 규칙이 있는 것을 알 수 있다.
N | 벌집 개수 | COUNT |
1 | 1 | 1 |
2 ~ 7 | 6 | 2 |
8 ~ 19 | 12 | 3 |
20 ~ 37 | 18 | 4 |
38 ~ 61 | 24 | 5 |
이 원리를 사용해서 문제를 풀면 된다.
계속 틀렸습니다가 나와서 구글링을 해서 문제를 풀었다.
if ( N 이 1 일경우 ) 바로 1을 출력한다.
else ( range (범위)가 N 을 넘기 직전까지 ) 최솟값 range를 계속 증가시켜주는 것이다.
그리고 count는 계속 증가 시킨다.
만약 N이 range범위를 넘어가면 해당 범위의 벌집이 아니게 되므로 반복문은 끝나고 이전의 count를 출력하면서 끝난다.
내가 이전에 푼 코드는 두 범위를 다 설정해줘서 코드가 길어졌는데 하나로만 하니 훨씬 간결하고 짧게 끝났다.
'Programming > Algorithm' 카테고리의 다른 글
[백준] 2869번 : 달팽이는 올라가고 싶다 (Java) (0) | 2021.07.31 |
---|---|
[백준] 1193번 : 분수찾기 (0) | 2021.07.30 |
[백준] 1712번 : 손익분기점 (Java) (0) | 2021.07.27 |
[백준] 1316번 : 그룹 단어 체커 (Java) (0) | 2021.07.25 |
[백준] 2941번 : 크로아티아 알파벳 (Java) (0) | 2021.07.25 |
댓글