백준 2903번(일반수학1-중앙 이동 알고리즘) - Math.pow, sqrt

하스코딩·2024년 9월 13일

풀이

  • 이 문제는 횟수에 따른 사각형의 개수가 몇개인지 규칙을 찾는것이 먼저였다.
  • 0회(초기)에는 1개, 1회->4개, 2회->16개 이렇게 4의 N승 꼴로 증가하는 것을 발견했다. 그래서 Math.pow() 메소드를 사용해 사각형의 개수를 구했다.
  • 즉, 사각형은 2회면 4 * 4 상태를 띈다. 이 4라는 수를 구하기 위해 Math.sqrt() 메소드를 사용해 다시 쪼개줬다.
  • 이렇게 구한 4에 +1을 해준 5 * 5가 점의 개수였다.

틀린풀이

  • 처음에 (rec+1) * (rec+1)인 2차원 배열을 생성해서 전체 원소 개수를 출력하는 방법은 아래와 같이 메모리 초과가 되었었다.
import java.io.*;
import java.lang.*;

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());//과정을 거칠 횟수

        //1회 -> 4개, 2회 -> 16개,
        int rec = (int)Math.pow(4,N);//사각형의 개수

        //1회이상 실시해 사각형이 1개 이상이라면,
        if(rec > 1) {//2회->16개면 사각형은 4*4개
            rec = (int) Math.sqrt(rec);
        }
        //점은 (4+1)*(4+1)의 점이 존재
        int[][] arr = new int[rec+1][rec+1];

        System.out.println(arr.length * arr[0].length);


        br.close();
    }
}

수정한 풀이

  • 그래서 고민을 해보다가 굳이 배열을 생성할 필요가 없다는 걸 깨닫고, 조건문을 if-else 문으로 수정하고 각 조건에 따라 즉시 출력을 해주는 방법으로 해결했다.
import java.io.*;
import java.lang.*;

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());//과정을 거칠 횟수

        //1회 -> 4개, 2회 -> 16개: 4의N승
        int rec = (int) Math.pow(4,N);//사각형의 개수

        //1회이상 실시(사각형이 1개 초과)
        if(N >= 1) {
            rec = (int) Math.sqrt(rec);///2회->16개면 사각형은 4*4개
            //점의개수는 (4+1)*(4+1)개
            System.out.println((rec+1)*(rec+1));
        }
        else{
            System.out.println((rec)*(rec));
        }

        br.close();
    }
}

0개의 댓글