Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
Tags more
Archives
Today
Total
관리 메뉴

luke

[백준] - 진짜 공간 (1350) (자바/Java) 본문

알고리즘문제/백준 문제(Java)

[백준] - 진짜 공간 (1350) (자바/Java)

luke-king 2024. 4. 6. 18:31

 

 

 

 

 

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

 

1350번: 진짜 공간

첫째 줄에 파일의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 파일의 크기가 공백을 사이에 두고 하나씩 주어진다. 파일의 크기는 1,000,000,000보다 작거나 같은 음이 아닌

www.acmicpc.net

 

 

 

 

 

 

 

 

 

문제.


 

 

 

 

 

 

 

풀이.


 

public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        long[] arr = new long[n];
        long tot = 0;
        double cnt = 0;

        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();

        }

            double disc = sc.nextInt();
            for (int j = 0; j < arr.length; j++) {

                if (arr[j] >= 0) {
                    cnt = Math.ceil(arr[j] / disc);
                    tot += (int)cnt * disc;

                }

            }

        System.out.println(tot);

    }
}

 

이번 문제는 크게 어렵지 않았다..! 하지만 계속 답은 맞는 거 같은데 틀렸다 나와서 고민해 보니 자료형의 문제가 있었다... 이번 기회에 더 생각하고 문제에 접근해야겠다는 마음을 가졌다.

 

우선 문제를 쉽게 말하자면 N 과 M 을 나눠 소수점이 1 이라도 있으면 반올림해 정수로 만들어 클러스터의 크기인 M을 곱해 합을 합을 구하는 문제다.

예시 :  ( 600 / 512 = 1.1875(= 2) ) => 2 * 512 = 1024(클러스터의 크기) 

 

그럼 바로 설명 해보겠다.

 

1. 파일을 담아둘 배열을 생성해 N입력 값이 배열의 크기와 같게 해 준다.

 

2. tot = 클러스터들을 모두 합한 총 값, cnt = 클러스터의 개수(M)

 

3. 배열 안에 파일들의 크기를 순차적으로 담아준다.

 

4. 루프를 돌려 배열 안에 있는 파일 크기가 0 이상인 조건식을 만든다. (0 이 들어올 경우 클러스트는 필요 없다는 지문이 있기 때문)

 

5. Math.ceil() 함수를 사용해 소수점 1이라도 있으면 올림을 한 뒤 클러스트 개수를 카운트해준다.

 

6. tot 변수에 cnt 개수와 disc (클러스터의 크기)를 곱해 더해준다.

 

 

필력이 부족해 풀이가 많이 부족하고 이해하기 어려울 수도 있다는 생각이 든다... 하지만 중요한 건 Math.ceil() 함수만 안다면 쉽게 풀 수 있다! Math.ceil() 함수에 대해 간단히 설명하자면 소수점에 1 하나라도 있으면 올림 해주는 함수이다!

예시 코드를 봐보겠다.

System.out.println(Math.ceil(16/100.0));
System.out.println(16/100.0);
System.out.println(Math.ceil(16/36970.0));
System.out.println(16/3697.0);
        
//결과
1.0 //Math.ceil() 함수를 사용한 값 1
0.16 // 사용하지 않은 값 0.16
0.004327833378414931 //Math.ceil() 함수를 사용한 값 1
1.0 // 사용하지 않은 값 0.16

 

그리고 arr, tot, cnt 변수들의 자료형이 int 가 아니고 double, long 자료형인데 이러한 이유는 문제 지문을 읽어보면 

수가 상당이 크기 때문에 메모리 크기가 작아 문제 제출 시 실패라 나온다...!!