[백준] 1920번 수 찾기
https://www.acmicpc.net/problem/1920
문제
육각형으로 이루어진 벌집이 있다. 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
입력 :
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
출력 :
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
나의 답안
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int count = 1;
int a = 1;
for (int i=0; i<N/6; i++) {
a += 6*i;
if(a >= N) {
System.out.println(count);
break;
}
count++;
}
}
}
계차수열처럼, 1칸씩 바깥으로 나갈수록 그전 값이랑 6*n만큼 차이가 나는 것을 알 수 있다.
따라서 N=1 이면 1칸, N=2~7이면 2칸, N=8~19이면 3칸 이런 방식.
for문을 사용해 a값을 6*i만큼 늘려가며 범위를 넓혔고,
count를 사용해 값을 반환하도록 작성했다.
다만, for문을 사용할 경우 i의 값을 N/6까지로 설정했는데,
break;를 사용하긴 했지만 불필요한 반복이 발생할 수도 있고
그렇게 보기 좋은 코드는 아닌 것 같다.
개선 사항
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
sc.close();
int count = 1;
int range = 1;
while (N > range) {
range += 6 * count;
count++;
}
System.out.println(count);
}
}
- 변수를 a 대신 range로 바꿔 가독성을 높였다.
- for문 대신 while문을 사용하여 불필요한 반복의 가능성을 제거했다.
- 코드가 한결 간결해졌다.
계차수열을 어떻게 반복문에 표현할까를 생각보다 오래 고민했다.
바로바로 나오는 수준이 되어야 할텐데..
더 열공하자