Dev Hyeri

◖코딩 테스트◗▬▬▬▬▬▬▬▬▬/백준

[백준](2024) 줄세우기 (설명/코드/정답)

_hyeri 2024. 2. 20. 23:34

 

문제 링크 : https://www.acmicpc.net/problem/10431

 

 

난이도
알고리즘 
실버5 구현, 시뮬레이션

 

 

1. 요구 사항 이해

시간, 메모리 제한 : 1초 / 256MB

 

주어진 방법대로 줄 서기를 시뮬레이션하면서 몇 번 뒤로 물러서는지를 계산.

* P: 테스트 케이스의 수 (1 ≤ P ≤ 1000)

* T : 각 테스트 케이스 번호 

* 테스트 케이스는 20개의 양의 정수가 공백으로 구분되어 주어짐.

 

 

2. 설계/검증 

입력

- 테스트 케이스의 수

- 테스트 케이스의 번호

- 테스트 케이스 번호에 해당하는 원소

 

 

 

시간 복잡도  최악의 경우  공간 복잡도
O(1) -- O(1)

 

 

 

 

3. 정상 코드


import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        int P = scan.nextInt(); // 테스트 케이스의 수

        for (int i = 0; i < P; i++) {
            int T = scan.nextInt(); // 테스트 케이스의 번호
            int[] heights = new int[20];
            for (int j = 0; j < 20; j++) {
                heights[j] = scan.nextInt();
            }
            int totalSteps = calculateTotalSteps(heights);
            System.out.println(T + " " + totalSteps);
        }
        scan.close();
    }

    private static int calculateTotalSteps(int[] h) {
        int totalSteps = 0;

        for (int i = 0; i < 20; i++) {
            for (int j = i + 1; j < 20; j++) {
                if (h[i] > h[j]) {
                    totalSteps++;
                }
            }
        }
        return totalSteps;
    }

}

 

 

 

 

4. 처리 과정 추적 코드

import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        int P = scan.nextInt(); // 테스트 케이스의 수 입력

        // 각 테스트 케이스에 대한 처리
        for (int i = 0; i < P; i++) {
            int T = scan.nextInt(); // 테스트 케이스의 번호 입력
            int[] heights = new int[20]; // 학생들의 키 배열 초기화
            System.out.println("\n[입력]----------------------------------");
            System.out.println("테스트 케이스 번호: " + T);
            // 각 학생의 키 입력
            for (int j = 0; j < 20; j++) {
                heights[j] = scan.nextInt();
                System.out.println("학생 " + (j+1) + "의 키: " + heights[j]);
            }
            // 총 이동 횟수 계산 및 출력
            int totalSteps = calculateTotalSteps(heights);
            System.out.println("\n[결과]----------------------------------");
            System.out.println("총 이동 횟수: " + totalSteps);
            System.out.println(T + " " + totalSteps);
        }

        // Scanner 객체 닫기
        scan.close();
    }

    // 총 이동 횟수를 계산하는 메서드
    private static int calculateTotalSteps(int[] h) {
        int totalSteps = 0;
        System.out.println("\n[이동 횟수 계산]--------------------------");


        // 모든 학생들에 대한 키를 비교하며 이동 횟수를 계산
        for (int i = 0; i < 20; i++) {
            for (int j = i + 1; j < 20; j++) {
                System.out.println("비교: 학생 " + (i + 1) + "의 키(" + h[i] + ") vs 학생 " + (j + 1) + "의 키(" + h[j] + ")");
                if (h[i] > h[j]) {
                    totalSteps++;
                    System.out.println("이동 발생! 현재 총 이동 횟수: " + totalSteps);

                }else {
                    System.out.println("이동 없음");
                }
            }
        }
        return totalSteps;
    }
}

 

 

 

 

추가 정리

배열에 원소를 입력받기

 

int[] arr = new int[크기];

for(int i = 0; i < arr.lenght; i++){

   arr[i] = scan.nextInt();
   //  arr[scan.nextInt()]++   동일한 기능의 코드

}