백준 실버V - 2751 수 정렬하기 문제 풀이
문제 설명
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
문제의 자세한 내용은 해당 링크를 통해 확인 : 문제 링크
풀이 코드
import java.io.*;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 입력을 위한 BufferedReader 인스턴스 생성
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 출력을 위한 BufferedWriter 인스턴스 생성
int maxSize = Integer.parseInt(br.readLine()); // 입력받는 크기 저장
int[] ret = new int[maxSize]; // maxSize 크기의 int 배열 생성
for(int i = 0; i < maxSize; i++) // maxSize만큼 반복
ret[i] = Integer.parseInt(br.readLine()); // 각 인덱스에 값을 저장
Arrays.sort(ret); // Arrays 클래스의 sort(int[]) 메서드를 사용하여 정렬
for(int i : ret) // 향상된 for문을 사용하여 ret 배열값 순회
bw.write(Integer.toString(i) + "\n"); // 버퍼에 인덱스 값 + "\n" 내용 추가
bw.flush(); // 버퍼에 담긴 내용을 출력
bw.close(); // stream을 close하여 메모리 반환
}
}
문제 해결 전략
이라 쓰고 문제를 보고서 어떻게 풀면 될까?에 대한 생각을 정리한 항목
다른 언어의 경우는 어려울 수 있지만 Java의 경우 정렬이 이미 메서드로 구현이 되어 있기에 입력만 잘 받아서 sort(int[]) 메서드 사용 후 출력만 잘 해주면 될 것이라 생각하고 진행
입력 속도를 생각해서 BufferedReader를 사용하여 입력을 받도록 구현
맨 처음 입력값이 크기이기 때문에 크기부터 입력을 받은 후 입력받은 크기로 int 타입의 배열을 생성
입력받은 크기만큼 반복하면서 int 타입의 배열에 값 할당
Arrays 클래스에 정의된 sort(int[]) 메서드를 사용하여 정렬 (해당 문제에서는 수는 중복되지 않는다는 가정이 있었기에 int 배열을 사용했지만, 입력되는 수는 중복이 올 수 있지만 출력을 할 땐 중복이 없어야 한다는 조건이 있었다면 TreeSet을 사용하여 정렬했을 것 같습니다)
이후 해당 배열의 값을 향상된 for문으로 순회하면 System.out.println() 메서드로 출력
이로써 끝이라고 생각했지만 timeout이 발생하며 실패
Java의 Scanner와 System.out.println() 메서드의 속도가 BufferedReader 및 BufferedWriter를 사용한 속도와 차이가 크다는 것을 알고 있었기에 일단 이를 활용해 보기로 생각 (Buffered 클래스 관련 글 링크)
이미 입력은 BufferedReader를 사용했기 때문에 출력을 System.out.println()에서 BufferedWriter로 바꿔서 재구현
이후 테스트를 진행한 결과 성공
사실 해당 문제를 풀어보면서 BufferedReader와 BufferedWriter 클래스 사용법을 찾아보다가 위 링크로 연결된 글을 작성하게 된 것. 결론적으로 BufferedReader와 BufferedWriter 클래스에 대해 좀 더 알아볼 수 있던 문제였다.
추가로 BufferedWriter 클래스로 변경한 다음에도 timeout이 발생했다면 TreeSet으로 바꿔서 시도를 해봤을 것 같다. (성능 비교는 해보지 않았기에 얼마나 차이가 나는지 모르겠다)
코드를 업로드해 둔 깃 허브
'Develop > Algorithm' 카테고리의 다른 글
백준 실버V - 17478 재귀함수가 뭔가요? (0) | 2022.07.26 |
---|---|
백준 브론즈I - 10989 수 정렬하기 3 (0) | 2022.07.26 |
백준 브론즈II - 5622 다이얼 (0) | 2022.07.26 |
프로그래머스 Lv.1 - 12930 이상한 문자 만들기 (0) | 2022.07.26 |
Java BufferedReader, BufferedWriter 사용법 (0) | 2022.07.26 |