문제
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
입력
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
출력
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
추상화
1) 벌집 껍질마다 가장 큰 수들을 나열해본다
→ 1, 7, 19, 37, 61 ...
2) 차이를 계산하면 각 항의 차이가 등차수열을 이룬다
→ 6, 12, 16, 24...
3) 1번 방에서 출발할 변수 num을 만들고 출발시킨다
num이 껍질을 하나씩 지날 때마다 6*지나온 방의 개수) 만큼 더한다. 즉 반복문을 이용한다
4) 입력값 N보다 커지는 순간 num은 멈추고 그동안 지나간 방의 개수를 출력한다
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int num = 1;
//num을 N보다 커질 때까지 증가시켜줄 것이다
int room =0;
//증가시키면서 방의 개수가 하나씩 증가한다
if(N ==1) {
System.out.print(1);
//1이면 1을 출력해줘야한다
}else {
for( int i =0; num < N; i++) {
num += 6*i;
//각각 항의 차이가 등차수열이다
room ++;
//항이 증가할 때 방의 수도 증가한다
}System.out.print(room);
}
}
}
'Study > Baekjoon' 카테고리의 다른 글
Baekjoon2869: 달팽이는 올라가고 싶다, 코드 길이는 연산속도와 비례하지 않는다 (0) | 2021.10.12 |
---|---|
Baekjoon1193: 분수찾기 (0) | 2021.10.12 |
Baekjoon1712: 손익분기점, Scanner의 위대함 (0) | 2021.10.12 |
Baekjoon1316*: 그룹 단어 체커 (0) | 2021.10.11 |
Baekjoon2941*: 크로아티아 알파벳 (0) | 2021.10.11 |