백준

백준 - 2292 벌집

gebalza 2022. 12. 1. 00:55

https://www.acmicpc.net/problem/2292

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner scan = new Scanner(System.in);
        int a = scan.nextInt(); //입력받고
        if(a==1) System.out.println(1); //1일땐 1
        else{ //1아닐땐
            a = a-2; //2를 빼줘서 규칙 만들어주고
            int c = 1; //카운트 만들고
            for(int i=6;i<=2000000000;i=6*c+i){ //조건에 맞는 수 반복문으로 돌리고
                if(a<i) { //만약 조건에 포함되는 수다
                    System.out.println(c+1); //카운트에 1추가해준 수 출력하고
                    break;  //끝
                }
                c = c+1; //아니면 카운트에 1추가해서 다시돌림

            }
        }

    }
}

 

코드 해석

벌집의 규칙을 살펴보니

 

1 / 2~7 / 8~19 / 20~37 /... 이런 식으로 진행이 되고 있었다

 

문제 자체가 시간을 빡빡하게 주는거 같지 않아 그냥 전부 넉넉하게 돌리기로 했다.

 

대충 2000000000이라는 숫자만큼 돌려 주기로했다 별의미없다

 

1은 어짜피 하나니깐 if문으로 1 출력되게 빼주고

 

1이 아닐때는 2를 빼줘서 0~5/6~17/18~35... 이런 식으로 만들어 주었다

 

그러면 규칙이 보이는데

 

6보다 작은수 / 18보다 작은 수 / 36보다 작은 수.. 이런 식으로 진행이 되고 있었다

 

따라서 6*카운트+전의 수 -> 6*c+i라는 수식을 만들 수 있었다

 

예를 들어서 18은 두번째 수고, 전의 수가 6이니깐 6*2+6 = 18이 되는 식으로 말이다.

 

그래서 만약 수가 18보다 작으면 카운트에 1추가 (아까 따로 빼준 1 부분을 더해주는 것) 해주고 출력해주고,

 

조건을 만족하지 못한다면 카운트에 1 더해준다.

 

오늘의 한마디

while문 쓸걸

반응형