[CodeTree] 아름다운 수열

yseo14·2024년 7월 5일

코딩테스트 대비

목록 보기
15/88


CodeTree 아름다운 수열

실버4 난이도의 문제이다.

풀이

  1. A에서 길이가 m인 부분수열을 뽑아 저장한다.
  2. 위 부분수열을 오름차순으로 정렬한다.
  3. 정렬된 부분 수열의 각 인덱스의 요소와 B의 각 인덱스의 요소 값의 차가 모두 같을 경우 부분수열 첫번째 요소의 A에서의 인덱스 값을 새로운 배열에 저장하고 count를 하나 늘린다.
    예) 정렬된 부분수열 (5,7,8), B(4,6,7)이 있을 때 각 인덱스 1의 차는 1이다. 다음 인덱스인 2, 3 또한 차가 1이므로 인덱스 값을 저장하고 count를 늘린다.
package CodeTree;

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

/**
 * A 에서 연속 부분 수열을 뽑고 오름차순으로 정렬한다.
 * 수열 B를 오름차순으로 정렬한다.
 * 두 개를 비교해서 같으면 인덱스 저장, count +
 */
public class sol2 {
    static int n, m;
    static int[] a, b;
    static int count = 0;
    static ArrayList<Integer> index;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = Integer.parseInt(br.readLine().trim());
        }
        m = Integer.parseInt(br.readLine());
        b = new int[m];
        for (int i = 0; i < m; i++) {
            b[i] = Integer.parseInt(br.readLine().trim());
        }
        Arrays.sort(b);

        index = new ArrayList<>();
        for (int i = 0; i <= n - m; i++) {
            int[] subArray = new int[m];
            int firstIdx = i;
            boolean flag = true;
            for (int j = 0; j < m; j++) {
                subArray[j] = a[firstIdx];
                firstIdx++;
            }
            Arrays.sort(subArray);
            int gap = subArray[0] - b[0];
            for (int j = 1; j < m; j++) {
                if ((subArray[j] - b[j]) != gap) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                index.add(i+1);
                count++;
            }
        }

        System.out.println(count);
        for (int i = 0; i < index.size(); i++) {
            System.out.println(index.get(i));
        }
    }
}

리뷰

정렬 후에 같은 인덱스의 요소끼리의 차이를 비교해야한다는 풀이만 생각해내면 금방 풀 수 있는 문제이다.
그런데 입력 값을 잘 보면 n줄에 걸쳐 수열에 해당하는 숫자를 하나씩 입력 받는데, 뒤에 "1 " 이렇게 공백이 존재한다. 아래와 같은 에러 발생

그래서 .trim을 이용해 공백을 제거하고 저장해야한다.
이건 문제의 오류라고 해야할지 뭔지.. 이런 부분에서는 확실히 백준보다 부족한 듯

profile
like the water flowing

0개의 댓글