본문 바로가기

개발일지/TIL

TIL 23-04-22 백준 알고리즘 - 벌집

1. 백준 알고리즘 - 벌집

 문제점

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

입력
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.

출력
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
# 입력 도착점
# 출력 1에서 도착점까지의 최단거리
# 1을 둘러싼 육각형
# 1, 6, 12, 18, 24 증가폭
# 1, 7, 19, 37, 61 실제 숫자 
# 밖의 테두리로 갈수록 각 육각형이 +6개씩 추가됨

 시도해 본 것들

while문으로 조건 구현하기 

count = 1
num = int(input())
search_num = 1
while search_num <= num:
    count += 1
    search_num += 6 * count
print(count)

코드 구조가 num이 1이어도 반복문 진입 count = 2 출력 & find_num에 더해지는 값 자체가 문제 있음 <- 6 * 2가 최초 시작값이 되면서 모든 결과가 달라짐 

 

count = 0으로 설정해 보기 <-  num = 1인 경우만 통과, 나머지 틀림

 

count = 1로 두고 num이 1인 경우 if 문 설정 

if num == 1:
    print(count)

일단 num이 1인 경우는 처리했는데 이 이후에 while문 자체가 문제 있음을 깨달았다.

 

while 문 조건 수정, count 순서 변경 

count = 1
num = int(input())
search_num = 1
if num == 1:
    print(count)
else:
    while True:
        search_num += 6 * count
        count += 1
        if search_num >= num:
            print(count)
            break

num이 1인 경우만 문제가 아니라 while문의 count가 2로 시작함을 깨닫고 수정

 

 해결 방법

불필요한 if문 삭제 

count = 1
num = int(input())
search_num = 1
if num == 1:
    print(count)
else:
    while search_num <= num:
        search_num += 6 * count
        count += 1
    print(count)

문제를 읽고 코드를 어떻게 짜야할지 명확히 떠올라서 그 부분에 취해 정작 코드를 잘못 만들었지만, 문제 해석 자체는 알맞게 해서 기분은 좋다.

 

최단거리 찾는 로직 변경

count = 1
num = int(input())
# while문을 num > 1로 설정하면서 num이 1인 경우 while문 pass
while num > 1:
    num -= 6 * count
    count += 1
print(count)

기존의 while문 구조로는 num이 1인 경우 while문 진입을 막을 수 없는 조건이어서 if문을 따로 설정하고 코드를 작성했다.

if문을 지우고 싶어서 고민한 결과 1을  while문으로 끌어오고 반대편의 num을 조작하면 된다는 점을 깨달았다.

바로 이렇게 작성하기에는 문제는 +를 해가며 길을 찾는데 현재 코드는 -를 하며 찾기 때문에 바로 떠올리기는 쉽지 않은 것 같다. 

 알게 된 점

다 만들고 틀렸던 코드들에서 print를 찍어보니 내가 생각한 코드와 다르다는 것이 바로 나타났다. 역시 print를 애용해야겠다.

문제를 제대로 해석하고 주석으로 작성하고 시작하는 일의 효과를 마지막 결과만 출력하면서 반례를 찾았는데도 금방 찾은 부분에서 체감할 수 있었다. 

주말이라 한 문제에 오랜 시간을 투자하면서 코드 개선이 가능했는데 이렇게 될 것 같은데? 싶은 부분은 대부분 더 나은 방법이 있다.