728x90
반응형

 

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

 

10989번: 수 정렬하기 3

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

www.acmicpc.net

 

 

일단 이 문제는 배열로 풀 수도 있고, 해시맵으로도 풀 수 있다.

근데 진짜.. 배열로 풀었을 때 시간초과나서.. 뭐지 하고 해시맵으로 썼는데 해시맵도 시간초과나서..

깨달은 것... 내가 마지막에 일일이 System.out.println(i); 를 해주었었다... 하..... 바본가...

 

시간초과난다면,, 내가 혹시 StringBuilder를 쓰지 않고 일일이 프린팅한건 아닌지 체크하길 바란다...

매번 프린트 하기보단, StringBuilder에 보관한 후에 한번에 프린트하는게 훠어어어얼씬 빠르다...

5번의 시간초과 에러를 만난 후에 깨달았음^^,,,ㅗ

1. 배열로 푼 Ver

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

public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int N = Integer.parseInt(br.readLine());
        int [] num = new int[10001];
        int max = -1;
        int tmp;

        for(int i=0;i<N;i++){
            tmp = Integer.parseInt(br.readLine());
            num[tmp]++;
            if(tmp > max)
                max = tmp;
        }

        for(int i=0;i<=max;i++){
            if(num[i]!=0){
                for(int j=0;j<num[i];j++)
                    sb.append(i+"\n");
            }
        }
        System.out.println(sb);
    }
}

 

2. 해시맵으로 푼 Ver (사실 해시맵보다 리스트가 더 빠름ㅋㅋ 그냥 해시맵 자꾸 시간초과나서 오기로 푼거임)

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

public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int N = Integer.parseInt(br.readLine());
        HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
        int tmp;

        for(int i=0;i<N;i++){
            tmp = Integer.parseInt(br.readLine());
            map.put(tmp, map.getOrDefault(tmp,0)+1);
        }

        TreeMap<Integer,Integer> tm = new TreeMap<Integer,Integer>(map);
        Iterator<Integer> keys = tm.keySet().iterator();

        while(keys.hasNext()){
            int key = keys.next();
            sb.append((key+"\n").repeat(map.get(key)));
            //repeat는 문자열을 반복해주는 함수로 자바11 문법!
        }
        System.out.println(sb);
    }
}

 

이 문제를 푼 후에 다른 사람들 풀이를 보다가 발견한 것!

java11부터는 repeat라는 메서드가 있다!

String 메서드이고, 문자열.repeat(반복횟수)로 사용하면 된다~! 오 개꿀 

일일이 for문 쓸 필요없네 ㅎㅎ

 

1번 코드에서 sb.append부분 이중 for문으로 구현했는데, 2번 코드처럼 repeat로 바꿀 수 있다~!

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기