본문 바로가기
PS/백준

[백준 9465] 스티커

by 창이2 2020. 9. 1.

문제

알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.

  1. 길이가 짧은 것부터
  2. 길이가 같으면 사전 순으로

 

입력

첫째 줄에 단어의 개수 N이 주어진다. (1≤N≤20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

 

풀이 과정

전형적인 dp문제로 생각했다. 최대값이 나오게 하는 규칙을 찾으려 했고 2줄에 매칸 마다 나오는 최대값을 구해서 n-1번째와 n-2번째를 비교해서 최대값을 찾도록 생각했다. 자바로 풀기시작한지 얼마 안돼서 Scanner로만 입력을 받았더니 Success를 받았음에도 불구하고 메모리와 수행시간이 굉장히 크게 나왔다. 그래서 BufferedReader와 StringTokenizer를 이용했더니 수행시간과 메모리가 1/2 이상 줄어드는 엄청난 효과를 봤다.

 

최초코드

더보기
import java.util.Scanner;

public class Main {


    static int T;
    static int N;
    static Scanner sc;
    static int[][] arr;
    static int[][] dp;

    public static void main(String[] args) {
        arr = new int[2][100000];
        dp = new int[2][100000];
        sc = new Scanner(System.in);
        T = sc.nextInt();
        for(int i=0;i<T;i++) {
            N = sc.nextInt();
            for (int j = 0; j < 2; j++) {
                for (int k = 0; k < N; k++) {
                    arr[j][k] = sc.nextInt();
                }
            }


            dp[0][0] = arr[0][0];
            dp[1][0] = arr[1][0];

            if (N >= 2) {
                dp[0][1] = arr[1][0] + arr[0][1];
                dp[1][1] = arr[1][1] + arr[0][0];

                for (int j = 2; j < N; j++) {
                    dp[0][j] = max(dp[1][j - 1] + arr[0][j], dp[1][j - 2] + arr[0][j]);
                    dp[1][j] = max(dp[0][j - 1] + arr[1][j], dp[0][j - 2] + arr[1][j]);
                }
            }
            int maxNum = max(dp[0][N - 1], dp[1][N - 1]);
            System.out.println(maxNum);
        }
    }

    public static int max(int a, int b){
        return a < b ? b : a;
    }

}

 

최종코드

더보기

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {


    static int T;
    static int N;
    static Scanner sc;
    static BufferedReader br;
    static StringTokenizer st;
    static int[][] arr;

    public static void main(String[] args) {
        arr = new int[2][100000];
        sc = new Scanner(System.in);
        br = new BufferedReader(new InputStreamReader(System.in));
        try{
            T = Integer.parseInt(br.readLine());//sc.nextInt();
            for(int i=0;i<T;i++) {
                N = Integer.parseInt(br.readLine());//sc.nextInt();
                for (int j = 0; j < 2; j++) {
                    st = new StringTokenizer(br.readLine());
                    for (int k = 0; k < N; k++) {
                        arr[j][k] = Integer.parseInt(st.nextToken());
                    }
                }
                if (N >= 2) {
                    arr[0][1] = arr[1][0] + arr[0][1];
                    arr[1][1] = arr[1][1] + arr[0][0];

                    for (int j = 2; j < N; j++) {
                        arr[0][j] = max(arr[1][j - 1] + arr[0][j], arr[1][j - 2] + arr[0][j]);
                        arr[1][j] = max(arr[0][j - 1] + arr[1][j], arr[0][j - 2] + arr[1][j]);
                    }
                }
                int maxNum = max(arr[0][N - 1], arr[1][N - 1]);
                System.out.println(maxNum);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public static int max(int a, int b){
        return a < b ? b : a;
    }

}

 

 

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

 

9465번: 스티커

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의 �

www.acmicpc.net

 

'PS > 백준' 카테고리의 다른 글

[백준 10993] 별 찍기 - 18  (0) 2021.09.21
[백준 10997] 별 찍기 - 22  (0) 2021.09.19
[백준 9370] 미확인 도착지  (0) 2021.08.09
[백준 2283] 구간 자르기  (0) 2021.07.27
[백준 3190] 뱀  (0) 2020.08.30

댓글