Uknow's Lab.
article thumbnail

 

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

 

15688번: 수 정렬하기 5

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이며, 같은 수가 여러 번 중복될 수도 있다.

www.acmicpc.net

 

난이도 : 실버 5
태그 : 정렬

 

 

설명

시간 누적이라는, 모든 테스트 케이스의 시간이 누적되는 문제로써,

굉장히 타이트한 시간이 주어지는 문제입니다.

 

시간이 매우 타이트한 만큼, 시간안에 통과하기 위해

bufferedReader와 StringBuilder를 필수로 사용해야 합니다.

 

 

소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

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());
        int[] arr = new int[n];

        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(br.readLine());
        }
        Arrays.sort(arr);

        StringBuilder sb = new StringBuilder();

        for(int i = 0; i<n; i++) {
            sb.append(arr[i]).append("\n");
        }

        System.out.println(sb);
    }
}

 

 

후기

해당 문제를 풀다가 재미있는 사실을 알았습니다.

StringBuilder를 사용할 때,

개행문자 삽입 방식에 따라

sb.append(arr[i] + "\n"); 일때는 시간초과를 받았지만,

sb.append(arr[i]).append("\n"); 를 사용할 땐 통과한다는 점이였습니다

 

저는 후자의 경우, append를 한 번 더 호출하므로 시간이 더 들거라 생각해 전자와 같은 방법을 사용했으나,

실제로는 arr[i] + "\n"을 할 때, 새로운 문자열을 생성해 인자로 전달하므로 오히려 더 많은 자원을 잡아먹습니다.

 

더 자세한 내용은 아래 포스팅을 참고해주세요.

https://uknowblog.tistory.com/158

 

자바의 StringBuilder 개행문자 삽입방법 - append(str + "\n") vs append(str).append("\n")

https://uknowblog.tistory.com/157 [백준 15688번] [Java] 수 정렬하기 5 https://www.acmicpc.net/problem/15688 15688번: 수 정렬하기 5 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자

uknowblog.tistory.com

 

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.