2751번: 수 정렬하기 2
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
www.acmicpc.net
풀이 과정
- 시간 복잡도 O(nlogn)인 힙 정렬을 이용해서 풀이 하였으나 시간 초과 뜸
import java.util.Scanner;
public class Main {
//교환
static void swap(int[] a, int index1, int index2){
int t = a[index1];
a[index1] = a[index2];
a[index2] = t;
}
//힙 만들기
static void makeHeap(int[] a, int left, int right)
{
int temp = a[left]; //루트
int child; //큰 값을 갖는 자식
int parent; //부모
for(parent=left; parent<(right+1)/2; parent=child)
{
int cl = parent*2+1;
int cr = cl+1;
child=(cr<=right && a[cr]>a[cl])?cr:cl; //큰 쪽을 자식에 대입
if(temp>=a[child])
break;
a[parent]=a[child];
}
a[parent] = temp;
}
//힙 정렬
static void heapSort(int[] a, int n)
{
//a[i]~a[n-1]을 힙으로 만들기
for(int i=(n-1)/2; i>=0; i--)
{
makeHeap(a,i,n-1);
}
for(int i=n-1; i>0; i--)
{
//가장 큰 요소와 아직 정렬되지 않은 부분의 마지막 요소를 교환
swap(a,0,i);
makeHeap(a,0,i-1); //a[0]~a[i-1]을 힙으로 만들기
}
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int n[] = new int[num];
for(int i=0; i<num; i++)
{
n[i] = sc.nextInt();
}
heapSort(n,num);
for(int i=0; i<num; i++)
{
System.out.println(n[i]);
}
}
}
- 구글링 하여 BufferedReader + Collections.sort를 이용한 풀이를 참고해서 품
참고 블로그
[백준] 2751번 : 수 정렬하기 2 - JAVA [자바] (tistory.com)
[백준] 2751번 : 수 정렬하기 2 - JAVA [자바]
www.acmicpc.net/problem/2751 2751번: 수 정렬하기 2 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다.
st-lab.tistory.com
BufferedReader/BufferedWriter
- Buffeer에 있는 IO 클래스
- 입력된 데이터가 바로 전달되지 않고 중간에 버퍼링이 된 후에 전달
- 출력도 버퍼를 거쳐서 간접적으로 출력장치로 전달되기에 시스템의 데이터처리 효율성을 높여주며 버퍼스트림을
InputStreamReader / OutPutStreamWriter를 같이 사용하여 버퍼링을 하게 되면 입출력 스트림으로 부터 미리 버퍼에 데이터를 갖다 놓기 때문에 보다 더 효율적인 입출력 가능
StringBuilder
[JAVA] StringBuilder란? StringBuilder 사용법 (tistory.com)
[JAVA] StringBuilder란? StringBuilder 사용법
자바에서 문자열하면 String을 대개 많이 떠올리고 사용할 것이다. 그런데 이 문자열이 1개 이상 있어서 이것들을 더해야 한다고 하면 어떤 방법을 쓸 수 있을까? 간단하게는 이 방법을 쓸 수 있을
onlyfor-me-blog.tistory.com
- String은 변경 불가능한 문자열을 생성하지만 StringBuilder는 변경 가능한 문자열을 만들어 줌
- StringBuilder의 객체를 생성한 후 , append()의 인자로 연결하고자 하는 문자열을 넣어서 StringBuilder의 객체를 통해 호출
public class Main
{
public static void main(String[] args)
{
StringBuilder stringBuilder = new StringBuilder();
ArrayList<String> list = new ArrayList<>();
list.add("첫 번째, ");
list.add("두 번째, ");
list.add("세 번째, ");
list.add("네 번째, ");
list.add("다섯 번째");
for (int i = 0; i < list.size(); i++)
{
stringBuilder.append(list.get(i));
}
System.out.println(stringBuilder);
}
}
// >> 첫 번째, 두 번째, 세 번째, 네 번째, 다섯 번째
정답
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
public class Main {
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int num = Integer.parseInt(br.readLine());
ArrayList<Integer> list = new ArrayList<>();
for(int i=0; i<num; i++)
{
list.add(Integer.parseInt(br.readLine()));
}
Collections.sort(list);
for(int i : list)
{
sb.append(i).append('\n');
}
System.out.println(sb);
}
}
'Java > 백준' 카테고리의 다른 글
[JAVA] 백준 1427 소트인사이드 (0) | 2024.02.07 |
---|---|
[JAVA] 백준 10898 수 정렬하기 3 (0) | 2024.02.06 |
[JAVA] 백준 25305 커트라인 (0) | 2024.02.06 |
[JAVA] 백준 2587 대표값2 (1) | 2024.02.06 |
[JAVA] 백준 2750 수 정렬하기 (1) | 2024.02.06 |