본문 바로가기
CODING TEST/BOJ

[java] 문제 020 (백준 2751)

by 정성인(人) 2024. 6. 10.

문제

수 정렬하기 2

 

교재 풀이

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class P2751_수정렬하기2 {
  public static int[] A, tmp;
  public static long result;
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    int N = Integer.parseInt(br.readLine());
    A = new int[N + 1];
    tmp = new int[N + 1];
    for (int i = 1; i <= N; i++) {
      A[i] = Integer.parseInt(br.readLine());
    }
    merget_sort(1, N); // 병합정렬 수행하기
    for (int i = 1; i <= N; i++) {
      bw.write(A[i] + "\n");
    }
    bw.flush();
    bw.close();
  }

  private static void merget_sort(int s, int e) {
    if (e - s < 1)
      return;
    int m = s + (e - s) / 2;
    // 재귀함수 형태로 구현
    merget_sort(s, m);
    merget_sort(m + 1, e);
    for (int i = s; i <= e; i++) {
      tmp[i] = A[i];
    }
    int k = s;
    int index1 = s;
    int index2 = m + 1;
    while (index1 <= m && index2 <= e) { // 두 그룹을 Merge 해주는 로직
      if (tmp[index1] > tmp[index2]) {
        A[k] = tmp[index2];
        k++;
        index2++;
      } else {
        A[k] = tmp[index1];
        k++;
        index1++;
      }
    }
    // 한쪽 그룹이 모두 선택된 후 남아있는 값 정리하기
    while (index1 <= m) {
      A[k] = tmp[index1];
      k++;
      index1++;
    }
    while (index2 <= e) {
      A[k] = tmp[index2];
      k++;
      index2++;
    }

  }
}

 

내 풀이) 24.6.10에 풀고 맞음

import java.util.*;
import java.io.*;

public class Main
{
	public static void main(String[] args) throws IOException {
// 		N개의 수가 주어졌을 때, 이를 오름차순으로 정렬
		
// 		첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)
// 		둘째 줄부터 N개의 줄에는 수가 주어진다.
// 		    이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다.
// 		    수는 중복되지 않는다.
// 	    첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력
	    
// 	    입력
// 	        5
//             5
//             4
//             3
//             2
//             1
//                 5가 n이 주어짐 
//         출력 
//             1
//             2
//             3
//             4
//             5
//         접근법
//             일단 정렬은 빌려쓰고 
//             이 문제 핵심은 출력 어떻게 할지 인 거 같은데 
//                 생각나는게 StringBuffer나 BufferedWriter 정도네 
//         슈도 코드 
//             n을 입력받음 
//             int 배열을 크기가 n으로 설정한다 
//             ,for문으로 배열 입력받고 
            
//             출력한다 
        
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        
        int[] a=new int[n];
        for(int i=0;i<n;i++){
            a[i]=sc.nextInt();
        }
        
        Arrays.sort(a);
        
        StringBuffer sb=new StringBuffer();
        for(int i=0;i<n;i++){
            sb.append(a[i]+"\n");
        }
        
        System.out.print(sb.toString());
	}
}

 

설명

실버 문제는 그냥 정렬 원리 구현할 필요 없이

기존 메서드나 sort 메서드들을 이용하면 됨

 

StringBuffer와 BufferedWriter의 차이점? 

  • StringBuffer
    • StringBuffer는 문자열을 조작하기 위한 클래스입니다. StringBuffer는 문자열을 변경할 수 있는(mutable) 객체를 제공하며, StringBuilder와 유사하지만, 스레드 안성을 보장합니다.
    • 주요 특징:
      • Mutable: 문자열을 변경할 수 있습니다. 문자열을 추가, 수정, 삭제할 수 있습니다.
      • Thread-safe: 멀티스레드 환경에서 안전하게 사용할 수 있습니다. 내부적으로 동기화(synchronized) 되어 있습니다.
      • 용도: 문자열을 빈번히 수정해야 할 때 사용됩니다.
    • 예시:
    StringBuffer sb = new StringBuffer("Hello");
    sb.append(" World");
    System.out.println(sb.toString());  // 출력: Hello World
    
    
  • BufferedWriter
    • BufferedWriter는 문자 출력 스트림에 버퍼링된 문자들을 쓰기 위한 클래스입니다. BufferedWriter는 버퍼링을 통해 출력 작업의 효율성을 높입니다.
    • 주요 특징:
      • Buffered I/O: 데이터를 직접 쓰는 대신 버퍼에 저장하고, 버퍼가 가득 차면 한꺼번에 출력합니다. 이를 통해 I/O 성능을 향상시킬 수 있습니다.
      • Writer: Writer 클래스의 서브 클래스이며, 문자 데이터를 파일, 콘솔 등 다양한 출력 대상으로 보낼 수 있습니다.
      • 용도: 파일에 데이터를 효율적으로 쓰기 위해 사용됩니다.
    • 예시:
    BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"));
    bw.write("Hello World");
    bw.newLine();
    bw.write("This is a BufferedWriter example.");
    bw.close();
    
    
  • 차이점 요약
    1. 용도:
      • StringBuffer: 문자열을 조작하고 수정하는 데 사용됩니다.
      • BufferedWriter: 문자 데이터를 파일이나 다른 출력 스트림에 쓰기 위한 버퍼링된 출력 스트림입니다.
    2. 기능:
      • StringBuffer: 문자열을 추가, 수정, 삭제 등의 작업을 수행합니다.
      • BufferedWriter: 버퍼를 사용하여 효율적으로 문자를 출력합니다.
    3. 스레드 안전성:
      • StringBuffer: 동기화되어 있어 스레드 안전합니다.
      • BufferedWriter: 기본적으로 스레드 안전성을 제공하지 않으며, 필요 시 외부에서 동기화가 필요할 수 있습니다.

'CODING TEST > BOJ' 카테고리의 다른 글

[java] 문제 022 (백준 10989)  (0) 2024.06.11
[java] 문제 021 (백준 1517)  (0) 2024.06.11
[java] 문제 019 (백준 11004)  (0) 2024.06.10
[java] 문제 018 (백준 11399)  (0) 2024.06.09
[java] 문제 016 (백준 1377)  (0) 2024.06.06