문제
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
입력
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
출력
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
예제입력 |
예제출력 |
13 | 3 |
문제풀이
어떻게 풀까 많은 고민을 했다...
1. 1,000,000,000 / 6 = 166,666,666 / 2 -> 88,888,888 중간을 기점으로 큰지 작은지 부터 해서 점차 좁혀가는 식으로 할 것인가?
2. 배열에 6 * count 단위를 저장해놓고 1부터 비교하면서 확인하도록 할까?
3. 등등.. 지금은 생각이 나지않는다.
여튼, 다양한 생각을 했는데 결국은 앞에서부터 -1, -6, -12, -18 .... 을 통해 count 즉 몇 번째인지 확인하도록 했다.
문제의 조건 다음과 같이 분석했다.
1) 1 ~ 부터 시작을 하기 때문에 무조건 1 이상은 존재한다.
2) 값의 위치는 시작점부터 끝점이니 무조건 1칸은 존재한다.
3) 1일 경우 count는 1, 1 이상일 경우 6 * count의 개수가 달라지기 때문에 코드가 다소 길어질 수 있다.
그래서 삼항 연산자를 다소 많이 사용했다.
4) 1이 아닐 경우 0 보다 N이 클 경우 반복문을 통해 N - (6 * count) 값을 통해 0보다 작아질 경우...
답을 찾아내는 형식으로 작성하였고
위에서 1칸 이었을 경우에 대한 boolean을 작성하여 마지막에 ++ 해줄지 말지를 결정하도록 했다.
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int N = scan.nextInt()-1;
int cnt = N == 0 ? 1 : 0;
boolean bool = cnt == 0;
while( N > 0) {
cnt++;
N -= (6 * cnt);
}
System.out.println(bool ? ++cnt:cnt);
}
}
'Etc > problem solving' 카테고리의 다른 글
백준 1193, 분수찾기 (0) | 2021.11.23 |
---|---|
백준 1712, 손익분기점 (0) | 2021.11.12 |
백준 1316, 그룹 단어 체커 (0) | 2021.11.06 |
백준 2750, 수 정렬하기 (0) | 2021.11.04 |
백준 2941, 크로아티아 알파벳 (0) | 2021.11.03 |