HelloMinchan
처음처럼
HelloMinchan
LinkedIn
전체 방문자
오늘
어제
  • 분류 전체보기 (306)
    • Backend (4)
      • NestJS (1)
      • Express (1)
      • Spring (2)
    • Infrastructure (1)
      • AWS (1)
    • Frontend (1)
      • Next.js (1)
    • Language & Runtime (4)
      • Java (2)
      • Node.js (2)
    • Computer Science (8)
      • Computer Networks (3)
      • Operating Systems (4)
      • OOP (1)
    • 독서 (4)
      • 데이터 중심 애플리케이션 설계 (3)
      • 객체지향의 사실과 오해 (1)
    • 회고 (4)
      • Project (2)
      • Career (2)
    • Deprecated (280)

채널

  • GitHub
  • LinkedIn

최근 글

태그

  • programmers
  • 데이터베이스
  • 백준Python
  • Baekjoon Online Judge
  • 백준Go
  • 개발자
  • 백준
  • 프로그래밍
  • 코딩
  • Algospot
  • 백엔드
  • 프로그래머스Python
  • 프로그래머스
  • 백준C++
  • 프로그래머스C++
  • 알고스팟
  • back-end
  • Database
  • 알고스팟Python
  • front-end

최근 댓글

인기 글

hELLO
HelloMinchan
Deprecated

[Baekjoon Online Judge] 백준 2631번 줄세우기(C++, Python)

[Baekjoon Online Judge] 백준 2631번 줄세우기(C++, Python)
Deprecated

[Baekjoon Online Judge] 백준 2631번 줄세우기(C++, Python)

2020. 4. 24. 18:03

© 2020 All Rights Reserved. 주식회사 스타트링크

[Baekjoon Online Judge] 백준 2631번 줄세우기

(C++, Python)

(글쓴날 : 2020.04.24)

 


* Baekjoon Online Judge, 백준 2631번 문제 C++, Python 언어 풀이입니다.

* 소스 코드의 저작권은 글쓴이에게 있습니다.


 

 

백준 2631번 줄세우기


1) 문제

문제 링크 : https://www.acmicpc.net/problem/2631

 

2631번: 줄세우기

KOI 어린이집에는 N명의 아이들이 있다. 오늘은 소풍을 가는 날이다. 선생님은 1번부터 N번까지 번호가 적혀있는 번호표를 아이들의 가슴에 붙여주었다. 선생님은 아이들을 효과적으로 보호하기 위해 목적지까지 번호순서대로 일렬로 서서 걸어가도록 하였다. 이동 도중에 보니 아이들의 번호순서가 바뀌었다. 그래서 선생님은 다시 번호 순서대로 줄을 세우기 위해서 아이들의 위치를 옮기려고 한다. 그리고 아이들이 혼란스러워하지 않도록 하기 위해 위치를 옮기는 아이들의

www.acmicpc.net


2) 풀이 과정

* 시간 복잡도 : O(n log n)

 

번호가 붙여진 아이들 N명이 주어지고, 번호가 오름차순이 되도록 아이들을 이동시킬 때 최소 이동 횟수를 구하는 문제입니다.

 

저의 경우, 동적 계획법과 이분 탐색을 적용하였으며, C++과 Python을 사용했습니다.

이 문제의 핵심은 최장 증가 부분 수열인 LIS를 구하는 것인데, 아이들을 최소 횟수로 이동시킨다는 뜻을 바꿔 말하면, 이미 오름차순으로 정렬되어 있는 아이들을 이동시키지 않아야 한다는 뜻이기 때문입니다.

LIS를 구하기 위해서는 동적 계획법으로만 구할 수도 있지만, memoization을 위해 시간 복잡도가 O(n²)이 되므로, 효율을 좋게 하기 위해 lower_bound 방식의 이분 탐색을 적용시켜 시간 복잡도를 O(n log n)으로 줄였습니다. (물론, O(n²)으로도 문제는 풀립니다!)

그렇게 LIS 즉, 이미 오름차순으로 정렬되어 있는 최대 길이를 구한 뒤, 전체 N에서 뺀 결과를 출력하여 문제를 해결했습니다.


3) 코드

 

* C++ 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <vector>
 
using namespace std;
 
int children[201];
 
int main(void)
{
    ios_base::sync_with_stdio;
    cin.tie(0);
    cout.tie(0);
 
    int N = 0;
    cin >> N;
 
    for (int i = 0; i < N; i++)
        cin >> children[i];
 
    vector<int> LIS;
    LIS.push_back(0);
    int length = 0;
 
    int left = 0;
    int right = 0;
    int mid = 0;
 
    for (int i = 0; i < N; i++)
    {
        if (children[i] > LIS[length])
        {
            LIS.push_back(children[i]);
            length++;
        }
        else
        {
            left = 0;
            right = length;
 
            while (left < right)
            {
                mid = (left + right) / 2;
 
                if (LIS[mid] >= children[i])
                    right = mid;
                else
                    left = mid + 1;
            }
 
            LIS[right] = children[i];
        }
    }
 
    cout << N - length;
 
    return 0;
}

* Python 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import sys
input = sys.stdin.readline
 
N = int(input())
children = [int(input())for _ in range(N)]
LIS = [0]
length = 0
 
for num in children:
    if num > LIS[-1]:
        LIS.append(num)
        length += 1
    else:
        left = 0
        right = len(LIS)
 
        while left < right:
            mid = (left + right) // 2
 
            if LIS[mid] >= num:
                right = mid
            else:
                left = mid + 1
        
        LIS[right] = num
 
print(N - length)

 

저작자표시 비영리 변경금지 (새창열림)

'Deprecated' 카테고리의 다른 글

[Baekjoon Online Judge] 백준 11279번 최대 힙(C++, Python)  (0) 2020.04.25
[Apollo] Apollo란 무엇인가?  (0) 2020.04.24
[Baekjoon Online Judge] 백준 1915번 가장 큰 정사각형(C++, Python)  (0) 2020.04.24
[Baekjoon Online Judge] 백준 1937번 욕심쟁이 판다(C++, Python)  (0) 2020.04.23
[GraphQL] GraphQL이란 무엇인가?  (1) 2020.04.23
  • [Baekjoon Online Judge] 백준 2631번 줄세우기
  • (C++, Python)
  • 백준 2631번 줄세우기
'Deprecated' 카테고리의 다른 글
  • [Baekjoon Online Judge] 백준 11279번 최대 힙(C++, Python)
  • [Apollo] Apollo란 무엇인가?
  • [Baekjoon Online Judge] 백준 1915번 가장 큰 정사각형(C++, Python)
  • [Baekjoon Online Judge] 백준 1937번 욕심쟁이 판다(C++, Python)
HelloMinchan
HelloMinchan
Though you should not fear failure, You should do your very best to avoid it.

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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