[python_파이썬]백준_2292번_벌집_막막한 풀이

2024. 4. 21. 21:56코드리뷰

728x90
반응형

공부하는 허딩크 : https://www.youtube.com/live/Oxb1EL00IUA?feature=shared

 

 
다른 사람들은 천재인가봐.... 나는 이 문제를 딱 봤을때 어떤 공식이나 접근법이 떠오르지 않았다.
최근에 DFS를 공부해서 배열을 사용해야 하나.... 재귀를 사용해야 하나.... 엄청 고민했다.
 
하지만, 고민하는게 너무 시간이 오래 걸리니까 이게 더 스트레스가 쌓여서 공부를 포기할 것 같다.
그냥 다른 사람이 작성한 코드를 보자. 앞으로 30분동안 고민해서 답 안나오면 그냥 답을 보고 외워버릴거야.
 
<다른 사람이 작성한 코드>

num = int(input())
numbox = 1
cnt = 1

while num > numbox:
    numbox += 6 * cnt
    cnt += 1
print(cnt)

이걸 딱 보는 순간...... 와 나는 왜 이 생각을 못했지....와 이걸 어떻게 생각하지... 라는 생각을 하면서... 봐도 이해가 가지 않는다.

내가 고민한 흔적

이렇게 고민 고민을 했는데도 답이 나오지 않았다.
 
자 그럼 이제 답을 보면서 고민을 해보자.
1. 일단 첫번째 방향을 잡은 건 1 주위에 6개의 숫자가 있고. 6개의 숫자 주위에는 12개의 숫자가 있다.
   ㄴ 계속 나아가면 12개 주위에 18개가 있고, 18개 주위에 24개가 있다.
2. 여기서 규직은 1 이후에 6, 12, 18, 24 이렇게 공통 요소를 뽑을 수 있다.
3. 1은 예외로 두고, 
     6 = 6 * 1
   12 = 6 * 2
   18 = 6 * 3
   24 = 6 * 4
  이렇게 반복된다. 여기까지는 내가 잡은 방향에 오류는 없는 듯 하다.
4. 2~7이 주어지면 cnt는 + 1이 되어야 하고, 8~19번까지 주어지면 cnt + 2가 되어야 하고, 각각 + 3, + 4가 또 반복 되겠지.
   ㄴ 여기까지도 생각했음.
5. 4번을 코드로 어떻게 작성할 것인가?
   ㄴ 답은 while문으로 반복을 돌리면서 조건을 주었다. num(주어진 수) > numbox(기본값 1)
   ㄴ n = 13일때 첫번째 반복 
        while 13 > 1:   => 참
             numbox = 1 + 6 * 1(cnt 기본값 1)  ==> numbox = 7
             cnt += 1 ==> cnt = 2
   ㄴ 두번째 반복
        while 13 > 7:   => 참
           numbox = 7 + 6 * 2  ==> numbox = 19
           cnt += 1 ==> cnt = 3
   ㄴ 세번째 반복
       while 13 > 19: ==> 거짓
           반복 종료
   ㄴ 즉 num = 13이 주어질때 cnt = 3이 되어서 출력하면 3이 나와서 정답이 된다. 
자 여기까지 풀이를 봤는데 그래도 어떻게 이 코드가 정답으로 나왔는지 이해가 안된다.
 
더 고민해보자.
1. 조건 : 아래와 같이 반복된다.
   1번 : 1          => 이건 예외
   2번 : ~7        => 6 * 1 + 1
   3번 : ~19      => 6 * 2 + 7
   4번 : ~37      => 6 * 3 + 19
  이렇게 보니 각 번지에 1, 7, 19는 앞의 결과값을 그대로 가지고 오네.
  그래서 numbox += 6 * cnt의 코드가 나오는군.
 
2. 즉, 1, 7, 19, 37을 기준으로 각 값보다 num의 숫자가 크면 계속 반복하는 조건을 만들었네.
   ㄴ 일단 num = 1이면 while문이 거짓이라서 바로 1이 출력되게끔 numbox와 cnt를 1로 초기화 => 어차피 1은 예외조건
   ㄴ num = 2가 주어지면 일단 while조건에서 2 > 1이라서 조건 참 => numbox = 1 + 6 * 1 = 7
   ㄴ 두번째 while조건에서 2 > 7이 되면서 반복 종료.
   ㄴ num = 3이 주어지면 일단 while조건에서 3 > 1이라서 조건 참 => numbox = 1 + 6 * 1 = 7
   ㄴ num이 4, 5, 6, 7까지 동일함.
   ㄴ num = 8이 주어지면 일단 while조건에서 8 > 1이라서 조건 참 => numbox = 1 + 6 * 1 = 7
   ㄴ 두번째 while조건에서 8 > 7이 되면서 또 반복, 이때 cnt = 2 => numbox = 7 + 6 * 2 = 19 => 세번째 반복은 없음
 ※ 여기까지 이해했음. 그런데 문제를 다시 봐도 내가 스스로 이 조건을 찾기 어려워보임
     즉, 그냥 외워야지. 나중에 또 이 문제를 봤을 때 이해가 가길 기대하며.....
 
3. 계속 보다 보니 조금 이해됨.
   ㄴ 1은 예외임
   ㄴ num이 2부터 7까지 주어질때 numbox는 무조건 7이 나옴 => 그 이후 num > numbox조건에서 2~7까지는 2번 반복이 안되면서 반복 종료되고 cnt = 2에서 멈춤
   ㄴ num이 8부터 19까지 while은 2번 반복됨.
   ㄴ 첫번째 while 8~19 > 7, 두번째 while 8~19 > 19 의 조건이라서 8~19까지 숫자가 나오면 cnt = 3에서 반복 종료

728x90
반응형