문제
교재 풀이
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();
- 차이점 요약
- 용도:
- StringBuffer: 문자열을 조작하고 수정하는 데 사용됩니다.
- BufferedWriter: 문자 데이터를 파일이나 다른 출력 스트림에 쓰기 위한 버퍼링된 출력 스트림입니다.
- 기능:
- StringBuffer: 문자열을 추가, 수정, 삭제 등의 작업을 수행합니다.
- BufferedWriter: 버퍼를 사용하여 효율적으로 문자를 출력합니다.
- 스레드 안전성:
- 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 |