백준 2292 벌집 [JAVA]

Ga0·2023년 3월 31일
1

baekjoon

목록 보기
15/124

문제 해석

  • 문제가 요구하는 바는 이해를 했지만, 어떻게 구해야할지는 감은 안오고, 주어진 그림으로는 보기 어려서 색깔로 식별 가능하도록 만들었다.
  • 문제가 요구하는 바는 아래와 같다
    1) 콘솔로부터 찾을 벌집의 방 번호(N)를 입력받는다.
    2) 1번방에서 N번방을 가려하는데 최단 경로를 구하면된다!(최소 몇개의 방을 가야하는지! -> 1번방과 마지막 방(N)을 포함해서)
  • 규칙을 찾아야하는데...
    • 첫번째 라인은 1
    • 두번째 라인은 2, 3, 4, 5, 6, 7
    • 세번째 라인은 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19
    • 네번째 라인은 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37
    • 방의 개수는 1, 6, 12, 18... 개씩 는다.
    • 규칙을 보면 6의 거듭제곱만큼 는다는 것을 알 수 있다.
    • 이 규칙을 코드에 적용하면 된다!

틀린 코드

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        br.close();

        int tmp = 6; //거듭제곱을 하기 위한
        int room = 0;
        int findroom = 1;
        while(true){
            if(findroom >= n){ //만약 입력받은 방번호가 해당 라인의 최대값보다 작은 거면 해당 방 최소 개수는 구한것!
                break;
            }
            findroom += room*tmp; //6의 거듭제곱
            room++;
        }

        System.out.println(room);
        
    }
}

  • 맞게 로직을 짠 것 같은데 틀렸다고 나왔다...

또 틀린 코드2

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        br.close();

        int room = 0;  //찾을 방 최소 루트
        int findroom = 1; //최소 루트(기본값)
        
        while(findroom <= n){ //만약 입력받은 방번호가 해당 라인의 최대값보다 작은 거면 해당 방 최소 개수는 구한것!

            //6*0이 하면 0이 나오는데 시작 주소 1을 입력받을때 0을 받게되는 오류가 생김
            findroom += findroom + (room*6); //그래서 최소방 루트값 1을 추가로 더해줌(그렇게 누적더하기한다.)

            room++; //여기까지 왔다는 건 아직 찾지 못했다는 것이니 room++해줌
        }

        System.out.println(room);
        
    }
}
  • 차피 6을 계속 곱하는 거면, 변수가 아닌 6을 곱하면될 것 같아서 변수 하나를 없애 줬고...
  • 자세한 설명은 코드 주석에 있다.
  • 하지만 또 틀렸다.

맞은 코드

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        br.close();

        int room = 1; //찾을 방 최소 루트
        int findroom = 2; //최소 루트(기본값) => 1을 따로 뺐으니 최소 루트(기준값)가 2이다.

        if(n == 1) {
            System.out.print(room);
        }else{
            while(findroom <= n) { //찾을 방번호가 더 클 경우에 반복문 계속
                findroom = findroom + (6 * room);
                room++;
            }
            System.out.print(room);
        }

    }
}

-> 이유를 찾았다.

findroom = findroom + (6 * room);  //이부분을 누적 더하기 하는 것이 아니다!

//왜냐 거듭제곱하는 것이기 때문에 누적더하기하면 문제가 생긴다 -> 로직을 잘못 이해!!!! 하고 있던 것!

처음 틀렸던 코드(고침)

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        br.close();

        int room = 1;
        int findroom = 1;
        while(true){
            if(findroom >= n){ //만약 입력받은 방번호가 해당 라인의 최대값보다 작은 거면 해당 방 최소 개수는 구한것!
                break;
            }
            findroom += (room*6); //6의 거듭제곱 (1은 시작점임으로 +1을 해준다)
            room++;
        }

        System.out.println(room);

    }
}
  • 처음 틀렸던 코드에서 잘못된 것은 1을 입력받았을때 room을 출력하는데 room 초기값을 0으로 설정해서 문제가 생겼던 것 이다.

결과

  • 참고한 코드 결과값

  • 처음 코드 고친 결과값

느낀점

  • 아직 백준 단계별 풀어보기 기초수학1 단계로 초반인데... 벌써부터 생각이 잘 안나기 시작했다...
  • 하다보면 적응하겠지...?

0개의 댓글