이 문제는.... 쉬울 거 같은데 은근 생각이 안났다. 처음 문제를 읽었을 때 내가 눈으로 보면 당연히 바로 구할 수 있지만 이걸 어떻게 코드로 구현하지..? 이런 생각이 들었다.

 

 이 문제는 '벌집' 자체가 핵심이다. 육각형으로 이루어진 것에서 규칙을 생각해 그대로 구현하면 되는 문제다. 1을 중심으로 주변을 둘러쌀 때 2칸, 3칸 등 칸이 증가할수록 둘러싸는 개수는 6개씩 증가한다. 이걸 생각해내는 게 첫 번째 포인트이다.

 

 두 번째로 막혔던 부분이다. 처음엔 수열공식을 생각해 

 

1 : 1칸

2~7 : 2칸

8~19 : 3칸

20~37 : 4칸

.

.

.

 

이런 식으로 경계값을 이용해 해당 범위 내에 있으면 칸을 구하게끔 로직을 짜서 했다. 하지만 어째서인지 채점 마지막 100% 직전에 틀렸습니다 하고 오답처리가 됐다. 아무리 생각해도 이해가 안되서 그럼 1,7,19,37 ... 등 구간의 마지막 수를 이용해 칸의 개수를 구해보자 라고 생각이 들어 로직을 짜보았다. 난 왜 여기서 공식을 생각해내는 데 오래걸렸을까? 바보 멍청이이기 때문이다.

마지막 수를 기억해 다음에 더해주면 되는데 이걸 생각못해서 조금 생각하는 시간이 길었다.  첫번째 방법으로 풀었을 때보다 훨씬 로직이 간단해서 이 방법을 채택했다. 결국 문제를 풀었고 또 하나의 교훈점을 얻어가는 문제였다.

(역시 아직도 알고리즘 문제풀 때 뭔가 불안?해서 그런지 뇌가 굳는다. 왜 생각이 안나지 이상하다.) 

 


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Main {

public static void main(String[] args) throws IOException {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
int prev = 1;

if(num == 1) {
System.out.println("1");
return;
}
int n=1;
while(true) {
int pNum = 6*n + prev;
if(num <= pNum) {
System.out.println(n+1);
break;
}else {
prev = pNum;
}
n++;
}

}


}

 


 

 

 

+ Recent posts