etc./모각코

모각코4회차

gmelon 2022. 7. 29. 21:31

인프런 알고리즘 강좌 5개 강좌 수강 및 문제 풀이 후 github에 push

1. 선택 정렬

package inflearn.sorting_searching;

import java.util.Arrays;
import java.util.Scanner;

public class P06_01 {

    public static String solution(int n, int[] arr) {
        /*
         * [선택 정렬]
         * 2중 for-loop을 사용해 0번 index부터 n-1 index까지 매 원소를 기준으로 잡고
         * 기준 원소 우측에 남은 원소 중 가장 작은 원소를 해당 기준 원소와 swap 하며 정렬한다.
         * 시간 복잡도 : O(n^2)
         */

        int idx;    // i 고정 상태에서, i보다 우측 원소 중 가장 작은 원소의 idx를 기록

        for (int i = 0; i < n - 1; i++) {
            idx = i;
            for (int j = i + 1; j < n; j++) {
                if (arr[j] < arr[idx]) idx = j;
            }
            // swap
            int tmp = arr[i];
            arr[i] = arr[idx];
            arr[idx] = tmp;
        }
        return Arrays.toString(arr).replaceAll("[^0-9 ]", "");
    }

        public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            sc.nextLine(); // buffer clear
            int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
            System.out.println(solution(n, arr));
    }
}

2. 버블 정렬

package inflearn.sorting_searching;

import java.util.Arrays;
import java.util.Scanner;

public class P06_02 {

    public static String solution(int n, int[] arr) {
        /*
         * [버블 정렬]
         * 선택 정렬과 반대로 우측 끝부터 고정시키는 방식으로 정렬
         * i=0부터 계속 증가시키며 이웃한 원소와 자신을 비교하여 우측 원소가 자신보다 작으면 swap (오름차순 기준)
         * 우측 끝이 한 원소 씩 고정되므로 반복 1회 수행 시 마다 끝을 1씩 줄여나가며 반복한다.
         * 시간 복잡도 : O(n^2)
         */
        for (int i = 0; i < n - 1 ; i++) {   // 전체 반복 횟수는 n-1회
            for (int j = 0; j < n - i - 1; j++) {   // 우측 원소가 고정되면 더 이상 해당 원소는 탐색할 필요 X
                // i가 1씩 증가함에 따라 (반복 횟수가 증가할 때) 탐색해야 하는 원소 수는 1씩 감소 (n - i - 1)
                if (arr[j] > arr[j + 1]) {
                    // swap
                    int tmp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tmp;
                }
            }
        }
        return Arrays.toString(arr).replaceAll("[^0-9 ]", "");
    }

        public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            sc.nextLine(); // buffer clear
            int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
            System.out.println(solution(n, arr));
    }
}

3. 삽입 정렬

package inflearn.sorting_searching;

import java.util.Arrays;
import java.util.Scanner;

public class P06_03 {

    public static String solution(int n, int[] arr) {
        /*
         * [삽입 정렬]
         * 선택 정렬과 마찬가지로 앞에서 부터 정렬해 나간다
         * 다만, i가 증가하면서 j는 i-1~0까지 감소하며 순회하다가 arr[i]보다 작은 값이 발견되면 arr[j+1]에 원소를 '삽입'한다는 것이 차이점
         * arr[0]까지 arr[i]보다 작은 값이 없으면 내부 for-loop 종료 후 arr[j+1(=0)]에 기존 arr[i](tmp에 유지)를 저장 - 이 경우 맨 앞에 '삽입'된다.
         * 시간 복잡도 : O(n^2)
         */

        for (int i = 1; i < n; i++) {   // j가 i-1부터 감소하므로 i는 1부터 시작 (최초엔 2개 원소 비교)
            int tmp = arr[i];   // 현재의 i 번째 원소를 저장
            int j = i - 1;
            for (; j > -1; j--) {  // break 없이 반복 종료 시 j = -1
                if (arr[j] > tmp) arr[j + 1] = arr[j];  // 한 칸 뒤로 미룸
                else break;  // tmp보다 작은 수가 발견되면 break
            }
            arr[j + 1] = tmp;   // 마지막 j 위치 다음 index에 tmp를 '삽입'한다.
        }
        return Arrays.toString(arr).replaceAll("[^0-9 ]", "");
    }

        public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            sc.nextLine(); // buffer clear
            int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
            System.out.println(solution(n, arr));
    }
}

4. LRU (카카오 변형)

package inflearn.sorting_searching;

import java.util.Arrays;
import java.util.Scanner;

public class P06_04 {

    public static String solution(int s, int n, int[] arr) {
        int[] cache = new int[s];

        for (int i = 0; i < n; i++) {   // 작업 개수만큼 반복
            // cache miss || hit 판별
            int c = 0;
            for (; c < s; c++) {
                if (cache[c] == arr[i]) {   // cache hit 시
                    break;
                }
            }
            if (c == s) c--;     // cache miss 시 c를 마지막 원소의 index로 옮겨줌
            // c부터 0까지 cache를 뒤로 미루고 맨 앞에 arr[i]를 넣음
            for (int j = c; j > 0 ; j--) {
                cache[j] = cache[j - 1];
            }
            cache[0] = arr[i];
        }

        return Arrays.toString(cache).replaceAll("[^0-9 ]", "");
    }

        public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            int s = sc.nextInt();   // 캐시 크기
            int n = sc.nextInt();   // 작업 개수
            sc.nextLine(); // buffer clear
            int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
            System.out.println(solution(s, n, arr));
    }
}

5. 중복 확인

package inflearn.sorting_searching;

import java.util.Arrays;
import java.util.Scanner;

public class P06_05 {

    public static String solution(int n, int[] arr) {

        // hashmap으로 O(n)에 풀이할 수도 있음

        for (int i = 1; i < n; i++) {
            int tmp = arr[i];
            int j = i - 1;
            for (; j > -1; j--) {
                if (arr[j] > tmp) arr[j + 1] = arr[j];
                else if (arr[j] == tmp) return "D";
                else break; // arr[j] < tmp, 중간에 삽입 수행
            }
            arr[j + 1] = tmp;
        }
        return "U";
    }

        public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            sc.nextLine(); // buffer clear
            int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
            System.out.println(solution(n, arr));
    }
}

'etc. > 모각코' 카테고리의 다른 글

모각코 5주차  (0) 2022.08.03
모각코 3회차  (0) 2022.07.20
모각코 2회차  (0) 2022.07.13
모각코 1회차  (0) 2022.07.06
2022 하계 모각코 사전 계획  (0) 2022.06.23