algorithm

장난꾸러기

juuuuuuun 2024. 8. 24. 15:57

설명

새 학기가 시작되었습니다. 철수는 새 짝꿍을 만나 너무 신이 났습니다.

철수네 반에는 N명의 학생들이 있습니다.

선생님은 반 학생들에게 반 번호를 정해 주기 위해 운동장에 반 학생들을 키가 가장 작은 학생부터 일렬로 키순으로 세웠습니다.

제일 앞에 가장 작은 학생부터 반 번호를 1번부터 N번까지 부여합니다. 철수는 짝꿍보다 키가 큽니다.

그런데 철수가 앞 번호를 받고 싶어 짝꿍과 자리를 바꿨습니다.

선생님은 이 사실을 모르고 학생들에게 서있는 순서대로 번호를 부여했습니다.

철수와 짝꿍이 자리를 바꾼 반 학생들의 일렬로 서있는 키 정보가 주어질 때 철수가 받은 번호와 철수 짝꿍이 받은 번호를

차례로 출력하는 프로그램을 작성하세요.

 

입력

첫 번째 줄에 자연수 N(5<=N<=100)이 주어진다.

두 번째 줄에 제일 앞에부터 일렬로 서있는 학생들의 키가 주어진다.

키(높이) 값 H는 (120<=H<=180)의 자연수 입니다.

 

출력

첫 번째 줄에 철수의 반 번호와 짝꿍의 반 번호를 차례로 출력합니다.

예시 입력 1 

9
120 125 152 130 135 135 143 127 160

 

예시 출력 1

3 8

 

소스 코드 1

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static int[] solution(int N, int[] arr) {
        int[] ans = new int[2];
        int minIdx = 1;
        int maxIdx = 1;
        for (int i = N-1; i > 0; i--) {
            if (arr[i] < arr[i - 1]) {
                minIdx = i;
                break;
            }
        }

        for (int i = minIdx - 1; i >= 0; i--) {
            if (arr[minIdx] > arr[i]) {
                maxIdx = i + 1;
                while (arr[maxIdx] == arr[minIdx]) {
                    maxIdx++;
                }
                break;
            }
        }
        ans[0] = maxIdx + 1;
        ans[1] = minIdx + 1;
        return ans;

    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int arr[] = new int[N];
        for (int i = 0; i < N; i++) {
            arr[i] = sc.nextInt();
        }
        for (int i : solution(N, arr)) {
            System.out.print(i + " ");
        }
    }
}

 

소스 코드 2

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

//장난꾸러기 다른 풀이
public class Main {
    public static List<Integer> solution(int N, int[] arr) {
        List<Integer> ans = new ArrayList<>();
        int[] tmp = arr.clone();
        Arrays.sort(tmp);
        for (int i = 0; i < N; i++) {
            if (arr[i] != tmp[i]) {
                ans.add(i + 1);
            }
        }
        return ans;

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

        for (Integer val : solution(N, arr)) {
            System.out.print(val + " ");
        }
    }
}

 

.clone() : 1차원 배열 깊은 복사

 - int[] tmp = arr.clone() 와 같이 사용하면 된다.

 - 기본적으로 얕은 복사를 수행한다. 따라서 차원 배열은 깊은 복사 안됨.

 - 다차원 배열의 깊은 복사를 원할 경우 각 필드에 대해 수동으로 clone()을 호출해야 한다.