본문 바로가기
Problem Solving/BOJ

백준 2292번 벌집 - 스위프트(Swift) 풀이

by 어멘드 2022. 1. 13.
반응형

 자료형 범위 신경 안 써서 틀려버린 문제.......ㅎㅎ 브론즈라 방심했다.

 중심인 1을 기준으로 한 겹(?)씩 늘어나면서 육각형 모양이 점점 커지는데, 한 겹 늘어날 때마다 전체 육각형의 한 변의 길이는 1씩 늘어난다. 따라서 최초를 0겹이라 하면, n겹 차에는 n*6개(모든 변의 길이의 합만큼)가 새로 추가된다.

 예를 들어서 설명하면 처음에 1만 있는 상황은 0겹차고, 이제 1겹 차에는 1*6 = 6개, [2, 3, 4, 5, 6, 7]가 추가된다. 2겹차에는 2*6 = 12개, [8, 9, 10, 11, ..., 19]이 추가된다. 이렇게 n겹 차에 추가되는 수 중 가장 작은 수를 lo라고 하고 가장 큰 수를 hi라고 두어서, 이번 겹 차에 N이 들어가는지 체크해주는 방식으로 구현했다. 방금 예로 든 2겹 차에서는 lo=8이고 hi=19이므로 만약 이 사이에 들어가는 수라면, 2겹 차에 등장하는 수라는 뜻이다.

 자료형 범위는 N이 최대 1,000,000,000까지 들어올 수 있는데, 이때의 lo, hi는 Int범위를 넘어갈 수도 있다. (hi는 count에 6이나 곱해서 더해준 수이기 때문에.) 따라서 더 큰 Int64 자료형을 써주면 된다.

import Foundation

let N = Int64(readLine()!)!

var count: Int64 = 1
var lo: Int64 = 1
var hi: Int64 = 1

while true {
    if lo <= N && N <= hi {
        print(count)
        break
    }
    
    lo = hi + 1
    hi = lo + count * 6 - 1
    count += 1
}
반응형

댓글