[ 백준 2631 ] 줄 세우기 (Java) - DP

2024. 3. 9. 22:51· 문제풀이/알고리즘 문제 풀이
목차
  1. 🔗 문제 링크
  2. 💡 문제 풀이 및 해석
  3. ⭐️ 정답 코드 및 설명
  4. 🤔 문제 후기
728x90

🔗 문제 링크

 

2631번: 줄세우기

KOI 어린이집에는 N명의 아이들이 있다. 오늘은 소풍을 가는 날이다. 선생님은 1번부터 N번까지 번호가 적혀있는 번호표를 아이들의 가슴에 붙여주었다. 선생님은 아이들을 효과적으로 보호하기

www.acmicpc.net


💡 문제 풀이 및 해석

  1. 최소한의 인원을 이동시키면서 줄을 세워야 하는 문제이다.
  2. 줄을 세운다 => 숫자를 정렬한다 => 정렬할 때, 최대한 적게 움직여야 한다.
  3. 움직이는 인원 = 전체 - 움직이지 않아도 되는 인원
  4. 움직이지 않아도 되는 인원 = 이미 줄이 제대로 돼있는 인원
  5. 따라서 이미 정렬이 되어있는 인원을 전체에서 빼주면 된다!!
  6. 내 위치에서 내 앞에 있는 인원들을 비교하여 나까지 증가하는 부분 수열을 구하면 된다.

⭐️ 정답 코드 및 설명

import java.util.*;

public class Main {
    static Scanner scanner = new Scanner(System.in);
    static ArrayList<Integer> list = new ArrayList<>();
    static int n;
    static int[] dp;
    static int answer = 0;

    static void init() {
        n = scanner.nextInt();
        dp = new int[n];
        for (int i = 0; i < n; i++) {
            list.add(scanner.nextInt());
        }
    }

    static void sol() {
        for (int i = 0; i < n; i++) {
            dp[i] = 1; // 반드시 1명은 옮기지 않아도 된다.
            for (int j = 0; j <= i; j++) {
                // 맨 앞부터 본인까지 탐색하여 증가하는 부분 수열이 이루어진다면 교체한다. (큰 순서로)
                if (list.get(i) > list.get(j) && dp[i] < dp[j] + 1) {
                    dp[i] = dp[j] + 1;
                }
            }
        }
        for (int i = 0; i < n; i++) {
            answer = Math.max(answer, dp[i]); // 모든 경우에서 가장 큰 증가하는 부분 수열이 움직이지 않아도 되는 인원
        }
    }

    public static void main(String[] args) {
        init();
        sol();
        System.out.println(n - answer);
    }
}

🤔 문제 후기

문제의 해답을 '전체 - 움직이지 않아도 되는 인원' 보다는 그냥 '움직이는 인원의 최소값'을 찾아야 한다고 생각하였다. 그래서 줄에서 가장 줄이 엇나가 있는 인원 순서대로 (예를 들자면, 예제에서는 7 앞에는 6명이, 7 뒤에는 0 명이 있어야 하는데, 앞에는 2명이 뒤에는 5명이 있기 때문에, 우선순위가 높음.) 옮기면 될 것이라 생각했다. 하지만, 이는 정확하게 예외 처리를 할 수 없고, 명확한 근거가 없기 때문에 포기하였습니다. 결국 구글링을 통해 어떤 방식으로 접근해야 하는지 찾았고, 움직이지 않아도 되는 사람을 고르는 것으로 접근해야 한다는 것을 알게되어 풀게 되었습니다.

728x90

'문제풀이 > 알고리즘 문제 풀이' 카테고리의 다른 글

[ 백준 1082 ] 방 번호 (C++) - Greedy  (0) 2024.03.14
[ 백준 1609 ] 집으로 (C++) - 기하학  (0) 2024.03.14
[ 프로그래머스 ] 파괴되지 않은 건물 (C++) - 누적합  (0) 2024.03.09
[ 백준 10026 ] 적록색약 (Java) - BFS  (0) 2024.03.09
[ 백준 2194 ] 유닛 이동시키기 (C++) - BFS  (0) 2024.03.09
  1. 🔗 문제 링크
  2. 💡 문제 풀이 및 해석
  3. ⭐️ 정답 코드 및 설명
  4. 🤔 문제 후기
'문제풀이/알고리즘 문제 풀이' 카테고리의 다른 글
  • [ 백준 1082 ] 방 번호 (C++) - Greedy
  • [ 백준 1609 ] 집으로 (C++) - 기하학
  • [ 프로그래머스 ] 파괴되지 않은 건물 (C++) - 누적합
  • [ 백준 10026 ] 적록색약 (Java) - BFS
RealTone
RealTone
풀스택 개발자되기 기원 1년차
RealTone
개발공부 블로그
RealTone
전체
오늘
어제
  • 분류 전체보기 (85)
    • 개발자 공부 (8)
      • 인프라 - AWS (2)
      • Frontend - React (2)
      • Frontend - Next (2)
    • 구름톤트레이닝 (2)
      • 강의 후기 (0)
    • 문제풀이 (74)
      • 알고리즘 문제 풀이 (62)
      • SQL 문제 풀이 (12)
    • 개인 (0)
      • 멕북초기화세팅 (0)

블로그 메뉴

  • 홈
  • 태그
  • GitHub
  • 방명록

태그

  • AWS
  • baekjoon
  • CI/CD
  • codedeploy
  • ec2
  • G2
  • G3
  • G4
  • G5
  • git/github

최근 글

hELLO · Designed By 정상우.v4.2.2
RealTone
[ 백준 2631 ] 줄 세우기 (Java) - DP
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.