[백준/Java] #1377 버블 소트

2025. 1. 22. 23:31·알고리즘

📝 문제 이름

사용 언어 : Java
레벨 : 골드 2

 

🔗 https://www.acmicpc.net/problem/1377

 

🔎 문제 설명

 

✅ 풀이

일단 처음에 문제를 정확히 이해를 못했었는데 여러 번 읽고 보니까 버블 정렬의 swap이 한 번도 일어나지 않은 루프가 언제인지 찾는 문제였다. 그래서 그냥 버블 정렬을 사용하면 되는거 아닌가? 라고 생각했으나 시간 제한 2초에 N의 최댓값은 500,000이기 때문에 시간초과로 풀 수 없고 다른 방법을 사용해야 했다.

 

안쪽 for 문이 실행되지 않는 순간 = swap이 발생하지 않았다 = 정렬이 완료됐다 라는 뜻이고, 나는 이 정렬 완료 시점을 찾아야 하는 것이다. 그러기 위해서는 정렬 전 인덱스와 정렬 후 인덱스가 필요한데 이 두 인덱스를 비교해서 각 데이터가 이동한 거리를 구한다 (정렬 전 인덱스 - 정렬 후 인덱스) 이 중에서 가장 멀리 이동한 데이터의 거리 (max) 값을 구하는데,

버블 소트는 정렬 여부를 확인하기 위해 한 번 더 반복문을 실행하므로 최종적으로 max + 1 값이 정답이 된다.

 

🤔 사실 max 값을 구해야 하는 것까지는 이해를 했었는데 max값에 +1을 하는 이유가 정확히 이해가 되질 않아서 chatGPT 에게 왜 +1을 해야하는지 물어봤다.

 

길게 답이 왔으나 요약하자면.

  1. max : 모든 데이터 중에서 가장 많이 이동한 데이터가 정렬 완료에 가장 오래 걸린다.
  2. 왜 max가 답이 되는가? : 데이터가 원래 위치에서 정렬된 위치로 가기 위해 최대 몇 번의 루프를 통과했는지 알아야 하기 때문이다.
  3. 이제 스왑이 더 이상 발생하지 않는 첫 번째 루프는 바로 max 값만큼 루프를 돈 후, 추가로 한 번의 확인 루프에서 발생한다.

따라서 답은 max + 1 이 되는 것이다.

 

 

💻 최종 코드

import java.io.*;
import java.util.Arrays;

public class Main {
    static class Num implements Comparable<Num>{
        int value;
        int idx;

        public Num(int value, int idx) {
            this.value = value;
            this.idx = idx;
        }

        @Override
        public int compareTo(Num o) {
            return this.value - o.value;
        }
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.parseInt(br.readLine());
        Num[] arr = new Num[n];
        for (int i = 0; i < n; i++) {
            arr[i] = new Num(Integer.parseInt(br.readLine()), i);
        }
        // 정렬
        Arrays.sort(arr);
        int max = Integer.MIN_VALUE;

        for (int i = 0; i < n; i++) {
            max = Math.max(arr[i].idx - i, max);
        }

        bw.write(String.valueOf(max + 1));
        bw.close();
    }
}

 

'알고리즘' 카테고리의 다른 글

[프로그래머스/Java] PCCP 기출문제 3번 : 충돌 위험 찾기  (2) 2025.01.24
[백준/Java] #12891 DNA 비밀번호  (0) 2025.01.17
[백준/Java] #10986 나머지 합  (4) 2025.01.15
[백준/Java] #5427 불  (4) 2024.12.26
[백준] #5430 AC  (5) 2024.12.06
'알고리즘' 카테고리의 다른 글
  • [프로그래머스/Java] PCCP 기출문제 3번 : 충돌 위험 찾기
  • [백준/Java] #12891 DNA 비밀번호
  • [백준/Java] #10986 나머지 합
  • [백준/Java] #5427 불
하늘☁️
하늘☁️
개발일지, 학습, 스터디 기록 남기는 블로그 ☁️
  • 하늘☁️
    구름일지
    하늘☁️
  • 전체
    오늘
    어제
    • 분류 전체보기 (51)
      • Python (0)
      • Java (3)
      • SQL (5)
      • 알고리즘 (31)
      • TIL (4)
      • CS (6)
      • 일상 (2)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    boj1377
    cpu의작동원리
    코딩테스트입문
    TIL
    제로베이스백엔드스쿨
    코딩테스트연습
    회고
    boj5427
    알고리즘
    mysql
    java
    제로베이스백엔드스쿨초단기취업반
    충돌위험 찾기
    명령어파이프라인
    백준
    비순차적명령어처리기법
    boj10986
    boj12891
    pccp 기출문제 3번
    정적블록
    컴퓨터구조
    코딩테스트
    CS
    dna 비밀번호
    스터디기록
    프로그래머스
    db
    상속
    제로베이스부트캠프
    학습일지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
하늘☁️
[백준/Java] #1377 버블 소트
상단으로

티스토리툴바