본문 바로가기
PS/BOJ

백준 14729 자바 - 칠무해 (BOJ 14729 JAVA)

by Nahwasa 2022. 2. 26.

문제 : boj14729

 

 

  문제 자체는 단순히 모두 입력받은 후 오름차순으로 정렬해서 처음 7개만 출력하면 되는 아주 간단한 문제이다.

 

  다만 생각할 부분이 좀 있는데, 애초에 스페셜 저지 문제가 아니므로(별도의 채점 로직 없이 단순히 입력을 주고 출력 나온걸 정답과 비교하는 형태) 무조건 입력받은 형태 그대로 출력해야 한다. 그렇다면 사실 String 그대로 받고 비교하는게 맞긴하다. 왜냐하면 무조건 소수점 3자리까지 입력으로 들어온다고 조건을 주지 않았기 때문이다. 하지만 이 경우 자바로는 String으로 N개를 입력받는 것 자체가 메모리 초과가 나게 된다. 결론적으로 정석대로(String 그대로 받기) 자바로 풀기 위해서는 모두 입력받고 정렬하면 안되고, 별도로 가장 낮은 값 7개를 찾는 로직을 세워야 하는 문제였다.

 

  뭐 결론적으로 현재는 모든 입력이 소수점 3자리 형태로 들어온다. 그러므로 double로 변경해서 입력받고, 그걸 정렬해서 가장 낮은 7개를 %.3f와 같이 소수점 3자리로 변경하여 출력하면 된다. 이 경우 차후 재채점에서 오답이 될 수 있긴한데, 애초에 출제 의도가 그냥 이정도를 원한걸로 보여서 따로 그런걸로 디테일하게 재채점을 할 것 같진 않다.

 

  내 경우엔 그냥 풀긴 심심하니 자바 최단시간 + 최단메모리를 목표로 해봤다. double로 변경하고, 7개만 입력받은 뒤 정렬을 로직을 세워 풀었다.

 

 

코드 : github

import java.io.DataInputStream;
import java.io.IOException;
import java.util.Arrays;

public class Main extends FastInput {
    private void solution() throws Exception {
        int n = (int)nextDouble();
        double[] max = new double[8];
        max[0] = -1;
        int i = 1;
        for(; i <= 7; i++) max[i] = nextDouble();
        Arrays.sort(max);

        for (; i <= n; i++) {
            double cur = nextDouble();
            if (cur >= max[7]) continue;
            for (int j = 7; j >= 0; j--) {
                if (max[j] <= cur) {
                    for (int k = 7; k > j+1; k--)
                        max[k] = max[k-1];
                    max[j+1] = cur;
                    break;
                }
            }
        }

        StringBuilder sb = new StringBuilder();
        for(i = 1; i <= 7; i++) sb.append(String.format("%.3f\n", max[i]));
        System.out.print(sb);
    }

    public static void main(String[] args) throws Exception {
        initFI();
        new Main().solution();
    }
}

class FastInput {
    private static final int DEFAULT_BUFFER_SIZE = 1 << 16;
    private static DataInputStream inputStream;
    private static byte[] buffer;
    private static int curIdx, maxIdx;

    protected static void initFI() {
        inputStream = new DataInputStream(System.in);
        buffer = new byte[DEFAULT_BUFFER_SIZE];
        curIdx = maxIdx = 0;
    }

    protected static double nextDouble() throws IOException {
        double ret = 0, div = 1;
        byte c = read();
        while (c <= ' ') c = read();
        do {
            ret = ret * 10 + c - '0';
        } while ((c = read()) >= '0' && c <= '9');
        if (c == '.') while ((c = read()) >= '0' && c <= '9') ret += (c - '0') / (div *= 10);
        return ret;
    }

    private static byte read() throws IOException {
        if (curIdx == maxIdx) {
            maxIdx = inputStream.read(buffer, curIdx = 0, DEFAULT_BUFFER_SIZE);
            if (maxIdx == -1) buffer[0] = -1;
        }
        return buffer[curIdx++];
    }
}

댓글