글로만 쓰기 힘들어서 그림으로 가져왔다.
우선 해당 벌집을 각 층으로 나누었을 때 가장 큰 수가 1, 7, 19, 37 ,61인 것을 확인할 수 있다.
이 숫자는 각 1 -> 1 + (1*6) -> 1 + (1*6 + 2*6) -> 1 + (1*6 + 2*6 + 3*6) .. 으로 점점 커지고 있다.
그런데 1*6 + 2*6 + 3*6 + 4*6 + 5*6 ... 은 6 * (1 + 2 + 3 + 4 + 5 + 6 + ... )으로 치환할 수 있다.
1 + 2 + 3 + 4 + 5 + 6 + ... n ?
등차수열의 합을 구하는 공식은 위와 같이 정해져 있다.
우리는 수학자가 되려는 것이 아니기 때문에 그냥 공식에 대입해서 정답만 구하면 된다.
위 공식에 따르면 각 층의 최대값은 6 * ( 6 * ( n * (n+1) ) ) + 1이다.
그런데 함정이 있으니, 수열이 시작되는 층이 1층이 아니라 2층이라는 것이다. 따라서 n+1을 n-1로 바꿔준다.
// 이동 횟수를 입력하면 최대 방 번호를 알려주는 메서드
public static long calculator(int count) {
long countSquared = (long)Math.pow(count,2);
return (3 * countSquared) - (3L *count) +1;
}
위에 적은 공식을 그대로 옮겨놓은 것이다. 해당 메서드에 이동 횟수를 인자로 넣으면 이동할 수 있는 최대 방 번호를 반환한다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in); // 사용자가 원하는 방 번호 입력
int roomNum = scan.nextInt();
int count = 0; // 이동 횟수 카운트
if (roomNum == 1) { System.out.println(1); }
// 입력값이 1일 경우 해당 공식에 위배되기 때문에 바로 1 출력
if (roomNum != 1) {
while ( calculator(count) < roomNum ) {
// 위의 노트에 적혀있듯이 횟수는 이전층의 max보다 커야한다.
// 따라서 계산 결과값(해당 층의 max)이 입력한 roomNum보다 작다면 다시 연산한다.
count++;
}
System.out.println(count); }
}
public static long calculator(int count) {
long countSquared = (long)Math.pow(count,2);
return (3 * countSquared) - (3L *count) +1;
}
}
이렇게 하면 끝.
굉장히 쉽게 푼 것처럼 적어놨지만 사실 수열이고 뭐고 아무것도 기억나는 게 없기 때문에 몸 비틀어가며 풀었다.
나.. 취업할 수 있겠지..? ㅎ
나처럼 나이 먹고 다시 공부한다고 고생하는 사람들 기죽지 말고 화이팅 ^^..~~~~
'CS ﹒ Algorithm > Baekjoon' 카테고리의 다른 글
JAVA백준 문제풀이 (6) 2775: 부녀회장이 될테야 (0) | 2022.07.01 |
---|---|
JAVA백준 문제풀이 (5) 10250:ACM호텔 (0) | 2022.06.30 |
JAVA백준 문제풀이 (4) 2869:달팽이는 올라가고 싶다 (0) | 2022.06.29 |
JAVA백준 문제풀이 (3) 1193:분수찾기 (0) | 2022.06.28 |
JAVA백준 문제풀이 (1) 1712:손익분기점 (0) | 2022.06.26 |