문제 번호 2292번 : 벌집 - JAVA [자바]
https://www.acmicpc.net/problem/2292
문제가 조금 어려워 보이지만 천천히 생각하면 무엇을 원하는지 금방 알 수 있습니다.
각 숫자는 1부터 바깥 테두리 형식으로 증가하면서 숫자가 이루어져 있습니다.
그리고 주어진 숫자가 몇번째 테두리에 있는지 물어보는 문제입니다.
(여기서 테두리란 각 도형의 바깥을 감싸는 도영을 의미합니다. 밑에 두꺼운 글씨를 보시면 이해가 더 잘 되실 겁니다.)
1은 첫번째 테두리에 2 ~ 7은 2번째 테두리에 8~19는 3번째 테두리에 20~37는 4번째 테두리에 있습니다.
여기까지 오셨다면 문제 이해는 끝나신 겁니다.
결국 내가 원하는 숫자가 몇번째 테두리에 있는지를 물어보는 문제임으로 테두리의 번호를 출력하는 것이 목적입니다.
정리하자면
입력 : 원하는 숫자
~계산식~
출력 : 원하는 숫자가 있는 테두리번째
여기서 문제가 있습니다. 테두리의 개수가 증가한다는 겁니다. 테두리의 개수가 일정하다면 그냥 반복문으로 입력한 수만큼 돌려서 개수만큼 나눠버리면 될 듯한데요.
어떻게 하면 점점 늘어나는 테두리의 내가 입력한 숫자가 몇번째 테두리에 있는지 알 수 있을까요?
제가 생각한 이 문제의 핵심은
무한 루프 - while(true)
등차 수열 공식 - an = a1 + (i-1)d
입니다.
일단 정답 부터 본 후에 설명하겠습니다.
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 i = 1;
while(true) {
int a = 6 + (i-1)*6;
for(int j = 0; j < a; j++) {
count++;
}
if(n == 1){
i = 0;
break;
}
else if(count >= n) {
break;
}else {
i++;
}
}
System.out.println(i+1);
}
}
*코드 설명
먼저 숫자를 입력받습니다.
테두리 숫자를 구할 count을 0으로 초기화 합니다.
테두리 번째를 구할 i를 1로 초기화 합니다.
int n = sc.nextInt();
int count = 1;
int i = 1;
while(true)로 무한 반복을 해줍니다. count가 입력받는 숫자보다 크거나 같으면 break로 빠져나갑니다. break로 빠져나간 후에 해당 테두리가 몇번째(i)인지 출력해주면 됩니다.
while(true) {
//등차수열 공식
else if(count >= n) {
break;
}else {
i++;
}
}
System.out.println(i+1);
이제부터가 중요합니다. 테두리의 개수는
1, 6, 12, 18, 24...로 점점 늘어납니다. 다행이 여기에는 규칙이 있습니다. 1->6으로 갈때 빼고는 모두 6씩 늘어난다는 점입니다.
등차수열 공식이 기억 나시나요? 저도 5년전에 배웠던 공식이라 가물가물 하더라고요. 이번 문제의 등차수열 공식은
첫 수열(6) + (수열의 순서 - 1)*증가 값(6) = 다음 수열 값
입니다. 첫번째 1일때를 제외하고 저 공식으로 각 테두리의 마지막 값을 구할 수 있습니다. 마지막 수만큼 count를 늘려주면 되니깐요
수열의 순서가 결국에는 저희가 원하는 출력값이 되게 됩니다.
그리고 첫번째 수열을 제외 했음으로 마지막에 출력할 때 +1과 n값이 1일때를 예외처리 해주면 정답을 얻을 수 있습니다.
int a = 6 + (i-1)*6;
for(int j = 0; j < a; j++) {
count++;
}
if(n == 1){
i = 0;
break;
}
'알고리즘 > 백준 문제 및 정답' 카테고리의 다른 글
문제 번호 2869번 : 달팽이는 올라가고 싶다 - JAVA [자바] (2) | 2022.01.10 |
---|---|
문제 번호 1193번 : 분수찾기 - JAVA [자바] (0) | 2021.12.30 |
문제 번호 1712번 : 손익분기점 - JAVA [자바] (0) | 2021.12.26 |
문제 번호 1316번 : 그룹 단어 체커 - JAVA [자바] (0) | 2021.12.26 |
문제 번호 2941번 : 크로아티아 알파벳 - JAVA [자바] (0) | 2021.12.23 |