위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N
이 주어졌을 때, 벌집의 중앙 1에서 N
번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)
이 주어진다.
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개
의 방을 지나는지 출력한다.
13
3
ICPC > Regionals > Asia Pacific > Korea > Nationwide Internet Competition > Seoul Nationalwide Internet Competition 2004 B번
-문제의 오타를 찾은 사람: waylight3
import java.util.Scanner;
public class Code2292 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int count=1;
int first=2;
if(n==1) {
System.out.println(count);
}
else {
while(first<=n) {
first=first+count*6;
count++;
}
System.out.println(count);
}
}
}
https://www.acmicpc.net/board/view/99363
https://calcproject.tistory.com/663
위의 게시글을 보고, 계차수열로 풀었는데 자꾸 42%에서 틀렸다고 떴다.
그래서, 다른 방향으로 접근했다.
1번->0
2번~7번->1
8번~19번->2
20번~37번->3
38번~61번->4
이렇게 되는데,
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
double total=0;
int answer=0;
total=Math.pow((n-1)/3,0.5);
System.out.println(Math.round(total)+1);
}
}
이전에 제출했던 코드이다.
first
는 각 층의 시작 수 (2, 8, 20, 38 등..)이고,
count
는 각 방의 개수를 나타낸다.
first
가 n
보다 작은동안 while문이 동작하며 만약 first가 더 커지면 그것이 방의 수가 된다.