문제
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
입력
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
출력
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
예제 입력
13
예제 출력
3
<나의 풀이>
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); } // end of main } |
'규칙 찾기'에 있는 문제다. 다른 규칙찾기 문제보다는 비교적 쉬운 편에 속한다.
가만 보면 벌집1을 둘러싼 벌집 원의 원소들 갯수는 6의 배수로 늘어나고 있으며 input이 어느 숫자든 input이 포함된 원이 1에서부터 몇번째 원인지만 알면 된다.
input = 1은 1부터 계산하기 때문에 2,3,4,5,6,7 이 있는 원에 포함된 숫자는 2번째.
그 다음 원(8,9,10,11,12,13,14,15,16,17,18,19)에 포함된 숫자는 3번째.
fn은 각 원의 원소들의 최대값을 넣는 변수이다.
테스트케이스로 알고리즘을 보자면
input = 13.
첫번째 Turn)
if-input값(13)이 fn(1)보다 작은가? -> no
else if-input값(13)이 fn(1)보다 큰가? -> yes
n++ (몇 번째 원인지 카운트 해주는 변수. 1이 됨)
fn = 1 + ( 6 * n(1)) = 7
두번째 Turn)
if-input값(13)이 fn(7)보다 작은가? -> no
else if-input값(13)이 fn(7)보다 큰가? -> yes
n++ (2가 됨)
fn = 7 + ( 6 * n(2)) = 19
세번째 Turn)
if-input값(13)이 fn(19)보다 작은가? -> yes
n++ (3이 됨)
n 출력 후 check 를 false로 바꾸며 반복문 탈출.
'Tech > Algorithm' 카테고리의 다른 글
백준)Q.10250_ACM 호텔 (0) | 2019.04.15 |
---|---|
백준)Q.1011_Fly me to the Alpha Centauri (0) | 2019.04.12 |
백준)Q.4344_평균은 넘겠지 (0) | 2019.04.09 |
백준)Q.11718,11719_그대로 출력하기(hasNextLine() 이용) (0) | 2019.04.05 |
프로그래머스)level.1_소수 찾기(에라토스테네스의 체) (0) | 2019.04.04 |
댓글