[코딩 테스트 RUN] SWEA 수업 : 16504. GRAVITY

코테런/SWEA(알고리즘 수업)
2026.03.02

 

⚠️ 주의!
SWEA에서 낸 코딩 문제에 대한 해답이 들어있습니다.
열람 시 주의해주세요.

 

D2치고는 다른 문제와의 차이가…

 

[SW Expert Academty] 16504. Gravity

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

문제에 대한 이해가 막상 푸는 거 보다 더 오래 걸린 특이한 케이스.

낙차에 대한 설명이 너무 부족해서 사람이 헷갈렸다.

 

일단 낙차의 최대값을 구하랬으니 max값을 저장해두는 게 낫다.

그리고 여기서 이중for문, 2중 배열이 나오는데, i와 i 아래에 있는(정확히는 떨어졌을 때 i 옆에 있는 값들인 j)를 확인하기 위함이다. j가 i보다 큰지 파악하고, 클 경우 count한 뒤에 최종값에서 빼야한다.

 

 

문제를 입출력하기 위한 부분을 제외하고 핵심은 바로 이것.

 

            int max = 0;

            for(int i = 0; i < n - 1; i++){
                int count = 0;
                for(int j = i + 1; j < n; j++){
                    if(arr[j] >= arr[i]) {
                        count++;
                    }
                }
                max = Math.max(max, n - 1 - i - count);
            }

 

여기서 n은 두 번째 입력인 쌓여있는 상자의 수로, n - 1을 하는 까닭은 j 때문에 경계선 처리를 하기 위함이다.

마지막으로 max값과의 비교가 있는데 n - 1 - i는 - count는 아래에 깔리는 상자의 개수를 이야기한다.

이렇게 갱신해주면 된다.

 

 

정답

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

public class Solution {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        for (int test_case = 1; test_case <= T; test_case++) {
            int n = Integer.parseInt(br.readLine());
            StringTokenizer st = new StringTokenizer(br.readLine());
            int[] arr = new int[n];

            for(int i = 0; i < arr.length; i++) {
                arr[i] = Integer.parseInt(st.nextToken());
            }

            int max = 0;

            for(int i = 0; i < n - 1; i++){
                int count = 0;
                for(int j = i + 1; j < n; j++){
                    if(arr[j] >= arr[i]) {
                        count++;
                    }
                }
                max = Math.max(max, n - 1 - i - count);
            }

            System.out.println("#" + test_case + " " + max);


        }
    }
}

 

그런데 더 간단한 방법이 있었다.

 

            for (int i = 0; i < n; i++) {
                int fallDistance = 0;
                for (int j = i + 1; j < n; j++) {
                    if (arr[i] > arr[j]) {
                        fallDistance++;
                    }
                }
                max = Math.max(max, fallDistance);
            }

 

2중 for문은 유지하되, arr[i]가 arr[j]보다 클 경우에만 fallDistance를 센다.

이쪽이 더 간단하다.