본문 바로가기

Algorithm/CodeUp

[CodeUp_Java] Q1094 : [기초-종합] 이상한 출석 번호 부르기2

반응형

안녕하세요! Plitche(플리체)입니다.
이번 포스팅의 주제는 Q1094 : [기초-1차원배열] 이상한 출석 번호 부르기2 (자바, JAVA)입니다.

intro

Question

문제 설명

입력

번호를 부른 횟수(n, 1 ~ 10000)가 첫 줄에 입력된다.
n개의 랜덤 번호(k, 1 ~ 23)가 두 번째 줄에 공백을 사이에 두고 순서대로 입력된다.

출력

1번부터 번호가 불린 횟수를 순서대로 공백으로 구분하여 한 줄로 출력한다.

예시

  • 입력 :
    10
    10 4 2 3 6 6 7 9 8 5
  • 출력 :
    5 8 9 7 6 6 3 2 4 10

Solution (풀이)

  • 풀이 1 : 메모리 33404, 시간 379
public class Answer1 {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int[] a = new int[sc.nextInt()];    // 총 출석을 부를 숫자만큼 배열 길이 선언

        for (int i=0; i<a.length; i++) {
            a[i] = sc.nextInt();    // 순차적으로 출석 부른 숫자를 배열에 저장
        }

        for(int i=a.length-1; i>=0; i--) {    // 배열 마지막 index부터 거꾸로
            System.out.print(a[i] + " ");    // 각 index별 총 불린 횟수 출력
        }

        sc.close();
    }
}
  • 풀이 2 : 메모리 13528, 시간 96
public class Answer2 {
    // 출석을 부른 번호 순서를 바꾸어 공백을 두고 출력한다.

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        // 총 출석을 부를 숫자만큼 배열 길이 선언
        int[] a = new int[Integer.parseInt(br.readLine())];
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        for (int i=a.length-1; i>=0; i--) {
            a[i] = Integer.parseInt(st.nextToken()); // idx마지막부터 출석 부른 숫자를 배열에 저장
        }
        for (int i : a) { // 향상 for문
            sb.append(i).append(" ");
        }
        System.out.print(sb);
    }
}

이젠 사용자로부터 여러 데이터를 입력받을 때에 Scanner보다 BufferedReader을 사용하는 것이 훨신 더 성능이 좋다는 것은 알았다고 생각한다.

 

  • 그렇다면 여러 데이터를 출력할때는?
    매번 System.out.print(), System.out.println() 메소드를 통하여 출력하는 것 보다는, StringBuilderBufferedWritrer, Stringbuffer 를 사용하여 출력하고자 하는 데이터를 하나의 변수에 저장을 하고 마지막에 한번에 출력하는 것이 성능에 도움이 된다.
반응형