백준_23970_알고리즘 수업 버블정렬3

임정민·2023년 1월 27일
3

알고리즘 문제풀이

목록 보기
26/173
post-thumbnail

코딩테스트 연습 스터디 진행중 입니다. ✍✍✍
Notion : https://www.notion.so/1c911ca6572e4513bd8ed091aa508d67

문제

https://www.acmicpc.net/problem/23970

[나의 풀이]

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Correct {

    static int bubble_sort(int[] A, int[] B, int n) {

        // A,B 처음부터 같으면 1
        if (Arrays.equals(A, B)) {
            return 1;
        }

        // last, last2 : 정렬이 끝난 인덱스는 for문 돌지 않아도 됌
        int last = n - 1;
        int last2 = 0;
        for (int i = 0; i < n - 1; i++) {
            if (last == 0) {
                break;
            }
            int check = 0;
            for (int j = 0; j < last; j++) {
                if (A[j] > A[j + 1]) {
                    swap(A, j, j + 1);
                    check++;
                    last2 = j;
					
                    // 정렬이 시행될 때마다 모든 원소를 비교할 필요 없이
                    // 바뀐 원소만 체크하여 A ,B 배열 확인
                    if (A[j] == B[j]) {
                        if (Arrays.equals(A, B)) {
                            return 1;
                        }
                    }
                }
            }
            last = last2;
            // 바뀌는 것이 없으면 break;
            if (check == 0) {
                break;
            }

        }

        return 0;
    }

    static void swap(int[] A, int front, int rear) {
        int temp = A[front];
        A[front] = A[rear];
        A[rear] = temp;
    }

    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        int n = Integer.parseInt(br.readLine());

        st = new StringTokenizer(br.readLine());
        int[] A = new int[n];
        for (int i = 0; i < A.length; i++) {
            A[i] = Integer.parseInt(st.nextToken());
        }

        int[] B = new int[n];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < A.length; i++) {
            B[i] = Integer.parseInt(st.nextToken());
        }

        bw.write(bubble_sort(A, B, n) + "");

        bw.flush();

    }

}

처음으로 백준 골드 문제 풀었습니다!🐸🐸🐸

오늘 교재로 개념 학습한 버블 정렬 알고리즘에 관한 문제를 풀어보았습니다. 버블 정렬은 시간복잡도가 O(n^2)이고 문제 요구사항에 따라 O(n^3)까지 올라갑니다. 이 때문에 여러가지 if문을 통해 시간을 줄이는 것이 중요했습니다.

첫번째로 각 패스를 돌때(n-1,n-2,n-3...) 정렬하는 것이 없으면 그 즉시 버블 정렬이 완료됌을 의미하기 때문에 반환하면 됩니다. 두번째로는 정렬이 끝난 인덱스들을 기억하여 그 다음 패스부터는 생략하는 조건도 설정할 수 있습니다. 마지막으로 문제에서 요구하는 B배열의 정렬 과정 확인하는 과정에서는 정렬한 요소들만 비교하는 방식으로 시간을 크게 줄일 수 있었습니다.🙉🙉🙉

감사합니다😍😍😍

profile
https://github.com/min731

0개의 댓글