SlideShare a Scribd company logo
STUDENTSKO
BOJ 10547
2020-12-04
김봄
SAMPLE INPUT/OUTPUT
9 12 5 13 5 9 12 13
16 2 1 7 5 10 2 1 7 5 16 10
7 9 8 3 6 5 7 9 83 6 5
4 1
9 12 5 13
6 2
16 2 1 7 5 10
6 3
7 9 8 3 6 5
1
1
3
SOLUTION
정렬을 통해 각 원소가 몇 번째 블록으로 가야 하는지 계산한다.
(블록 내에서 순서는 바뀌어도 블록이 바뀌진 않는다.)
이미 정렬이 완료된 원소는 움직일 필요가 없다.
따라서 이미 정렬이 완료된 원소의 개수를 세면 정답을 찾을 수 있다.
가야 할 블록의 최장 증가 부분 수열(LIS)의 길이가 이미 정렬이 완료된 원소의 개수이다.
CODE
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int N, K;
vector<int> v;
int main() {
cin >> N >> K;
v.assign(N, 0);
for (int i = 0; i < N; i++) {
cin >> v[i];
}
vector<pair<int, int>> sorted;
vector<pair<int, int>> unsorted;
for (int i = 0; i < N; i++) {
sorted.push_back(make_pair(v[i], i));
unsorted.push_back(make_pair(v[i], i));
}
sort(sorted.begin(), sorted.end());
for (int i = 0; i < sorted.size(); i++) {
unsorted[sorted[i].second].second = i / K + 1;
}
int max_idx = 0; //LIS(Longest Increasing Subsequence)
vector<int> dp(N);
for (int i = 0; i < N; i++) {
int idx = upper_bound(dp.begin(), dp.begin() + max_idx, unsorted[i].second) - dp.begin();
if(idx == max_idx)max_idx++;
dp[idx] = unsorted[i].second;
}
cout << N - max_idx << endl;
return 0;
}
EXPLANATION
최장 증가 부분 수열, Longest Increasing Subsequence, LIS
[3, 5, 1, 9, 2, 1, 4, 8]과 같은 수열에서 임의의 수를 제거해 정렬된 상태인 부분 수열을 구하는데 길이가 최대가 되는 부
분 수열을 찾는 문제가 최장 증가 부분 수열 문제이다.
알고리즘을 정리하자면 아래와 같다.
현재 원소를 DP 배열의 정렬이 되도록 덮어씌운다. (삽입 X)
예를 들어 DP 배열에 [1, 4, 8]이 있다면 3을 어디에 덮어씌워야 정렬이 유지가 되는가이다. 4를 3으로 대체한다면 [1, 3,
8]이 되어 정렬을 유지할 수 있다.
DP 배열의 길이가 최장 증가 부분 수열의 길이이다.
EXPLANATION
최장 증가 부분 수열, Longest Increasing Subsequence, LIS
idx
max
dp배열의 크기는 1이였고 3은 들어갈 공간이 하나 밖에 없으니 그대로 삽입한다.
EXPLANATION
최장 증가 부분 수열, Longest Increasing Subsequence, LIS
idx
max
dp 배열은 [3][ ] 이였고 5는 마지막 원소가 되어야 한다.
EXPLANATION
최장 증가 부분 수열, Longest Increasing Subsequence, LIS
idxmax
dp 배열은 [3][5][ ] 이였고, 1은 맨 처음 원소가 되어야 한다.
맨 뒤에 들어가는 경우가 아니면 dp 배열의 길이는 늘어나지 않는다.
EXPLANATION
최장 증가 부분 수열, Longest Increasing Subsequence, LIS
idxmax
dp 배열은 [1][5][ ] 이였고, 9는 마지막 원소가 되어야 한다.
EXPLANATION
최장 증가 부분 수열, Longest Increasing Subsequence, LIS
idx
max
dp 배열은 [1][5][9][ ] 이였고 2는 5의 자리를 대체하면 된다.
EXPLANATION
최장 증가 부분 수열, Longest Increasing Subsequence, LIS
idx
max
dp 배열은 [1][2][9][ ] 이였고 1은 맨 앞으로 가면 된다.
EXPLANATION
최장 증가 부분 수열, Longest Increasing Subsequence, LIS
idx
max
dp 배열은 [1][2][9][ ] 이였고 4는 9의 자리를 대체한다.
EXPLANATION
최장 증가 부분 수열, Longest Increasing Subsequence, LIS
idx
max
dp 배열은 [1][2][4][ ] 이였고 8은 마지막 자리로 가면 된다.
최장 증가 부분 수열은 길이가 4이다.

More Related Content

What's hot

과제 1,2,3
과제 1,2,3과제 1,2,3
과제 1,2,3mil23
 
The Art of Computer Programming 2.3.2 Tree
The Art of Computer Programming 2.3.2 TreeThe Art of Computer Programming 2.3.2 Tree
The Art of Computer Programming 2.3.2 Tree
hyun soomyung
 
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이
NAVER D2
 
자료구조 Project5
자료구조 Project5자료구조 Project5
자료구조 Project5KoChungWook
 
자료구조1보고서
자료구조1보고서자료구조1보고서
자료구조1보고서KimChangHoen
 
분할정복
분할정복분할정복
분할정복
승혁 조
 
[Devfest Campus Korea 2021]효율적인 문제해결 With 알고리즘
[Devfest Campus Korea 2021]효율적인 문제해결 With 알고리즘[Devfest Campus Korea 2021]효율적인 문제해결 With 알고리즘
[Devfest Campus Korea 2021]효율적인 문제해결 With 알고리즘
GDGCampusKorea
 
Duet sol
Duet solDuet sol
Duet sol
Sangdurk Han
 
2012 Ds A1 05
2012 Ds A1 052012 Ds A1 05
2012 Ds A1 05seonhyung
 
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제
NAVER D2
 
2021 1학기 정기 세미나 6주차
2021 1학기 정기 세미나 6주차2021 1학기 정기 세미나 6주차
2021 1학기 정기 세미나 6주차
Moonki Choi
 
Item10. toString 메소드는 항상 오버라이드 하자
Item10. toString 메소드는 항상 오버라이드  하자Item10. toString 메소드는 항상 오버라이드  하자
Item10. toString 메소드는 항상 오버라이드 하자
Sungho Moon
 
말의여행
말의여행말의여행
말의여행mil23
 
DP 알고리즘에 대해 알아보자.pdf
DP 알고리즘에 대해 알아보자.pdfDP 알고리즘에 대해 알아보자.pdf
DP 알고리즘에 대해 알아보자.pdf
Ho Jeong Im
 
Graph
GraphGraph
Graph
GNGLB
 
Insert Sort Algorithm (삽입 정렬 알고리즘)
Insert Sort Algorithm (삽입 정렬 알고리즘)Insert Sort Algorithm (삽입 정렬 알고리즘)
Insert Sort Algorithm (삽입 정렬 알고리즘)
Junyeong Choi
 
DP Optimization
DP OptimizationDP Optimization
DP Optimization
승혁 조
 

What's hot (20)

110528 taocp 2345
110528 taocp 2345110528 taocp 2345
110528 taocp 2345
 
이산치1번
이산치1번이산치1번
이산치1번
 
과제 1,2,3
과제 1,2,3과제 1,2,3
과제 1,2,3
 
The Art of Computer Programming 2.3.2 Tree
The Art of Computer Programming 2.3.2 TreeThe Art of Computer Programming 2.3.2 Tree
The Art of Computer Programming 2.3.2 Tree
 
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이
 
자료구조 Project5
자료구조 Project5자료구조 Project5
자료구조 Project5
 
2012 Ds 01
2012 Ds 012012 Ds 01
2012 Ds 01
 
자료구조1보고서
자료구조1보고서자료구조1보고서
자료구조1보고서
 
분할정복
분할정복분할정복
분할정복
 
[Devfest Campus Korea 2021]효율적인 문제해결 With 알고리즘
[Devfest Campus Korea 2021]효율적인 문제해결 With 알고리즘[Devfest Campus Korea 2021]효율적인 문제해결 With 알고리즘
[Devfest Campus Korea 2021]효율적인 문제해결 With 알고리즘
 
Duet sol
Duet solDuet sol
Duet sol
 
2012 Ds A1 05
2012 Ds A1 052012 Ds A1 05
2012 Ds A1 05
 
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제
 
2021 1학기 정기 세미나 6주차
2021 1학기 정기 세미나 6주차2021 1학기 정기 세미나 6주차
2021 1학기 정기 세미나 6주차
 
Item10. toString 메소드는 항상 오버라이드 하자
Item10. toString 메소드는 항상 오버라이드  하자Item10. toString 메소드는 항상 오버라이드  하자
Item10. toString 메소드는 항상 오버라이드 하자
 
말의여행
말의여행말의여행
말의여행
 
DP 알고리즘에 대해 알아보자.pdf
DP 알고리즘에 대해 알아보자.pdfDP 알고리즘에 대해 알아보자.pdf
DP 알고리즘에 대해 알아보자.pdf
 
Graph
GraphGraph
Graph
 
Insert Sort Algorithm (삽입 정렬 알고리즘)
Insert Sort Algorithm (삽입 정렬 알고리즘)Insert Sort Algorithm (삽입 정렬 알고리즘)
Insert Sort Algorithm (삽입 정렬 알고리즘)
 
DP Optimization
DP OptimizationDP Optimization
DP Optimization
 

Similar to BOJ10547

[데브루키]노대영_알고리즘 스터디
[데브루키]노대영_알고리즘 스터디[데브루키]노대영_알고리즘 스터디
[데브루키]노대영_알고리즘 스터디
대영 노
 
2012 Ds B2 02
2012 Ds B2 022012 Ds B2 02
2012 Ds B2 02chl132435
 
2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdf2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdfkd19h
 
자료구조 Project2
자료구조 Project2자료구조 Project2
자료구조 Project2KoChungWook
 
[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율
[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율
[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율
S.O.P.T - Shout Our Passion Together
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 HwpKimjeongmoo
 
02. data structure and stl
02. data structure and stl02. data structure and stl
02. data structure and stl
승혁 조
 
Computational Complexity
Computational ComplexityComputational Complexity
Computational Complexity
skku_npc
 
코딩테스트 합격자 되기 C++ 06_07장 스택과 큐에 대한 강의 입니다.
코딩테스트 합격자 되기 C++ 06_07장 스택과 큐에 대한 강의 입니다.코딩테스트 합격자 되기 C++ 06_07장 스택과 큐에 대한 강의 입니다.
코딩테스트 합격자 되기 C++ 06_07장 스택과 큐에 대한 강의 입니다.
ultrasuperrok
 
Tensorflow
TensorflowTensorflow
Tensorflow
chs71
 
자료구조2보고서
자료구조2보고서자료구조2보고서
자료구조2보고서KimChangHoen
 
Programming java day2
Programming java day2Programming java day2
Programming java day2Jaehoonyam
 
Clean code(02)
Clean code(02)Clean code(02)
Clean code(02)
규열 김
 
Dynamic programming
Dynamic programmingDynamic programming
Dynamic programmingEunjin Song
 
R 프로그래밍-향상된 데이타 조작
R 프로그래밍-향상된 데이타 조작R 프로그래밍-향상된 데이타 조작
R 프로그래밍-향상된 데이타 조작
Terry Cho
 
Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버Jaejin Yun
 

Similar to BOJ10547 (20)

자구2번
자구2번자구2번
자구2번
 
[데브루키]노대영_알고리즘 스터디
[데브루키]노대영_알고리즘 스터디[데브루키]노대영_알고리즘 스터디
[데브루키]노대영_알고리즘 스터디
 
2012 Ds B2 02
2012 Ds B2 022012 Ds B2 02
2012 Ds B2 02
 
2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdf2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdf
 
자료구조 Project2
자료구조 Project2자료구조 Project2
자료구조 Project2
 
[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율
[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율
[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율
 
자료구조02
자료구조02자료구조02
자료구조02
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 Hwp
 
02. data structure and stl
02. data structure and stl02. data structure and stl
02. data structure and stl
 
Computational Complexity
Computational ComplexityComputational Complexity
Computational Complexity
 
코딩테스트 합격자 되기 C++ 06_07장 스택과 큐에 대한 강의 입니다.
코딩테스트 합격자 되기 C++ 06_07장 스택과 큐에 대한 강의 입니다.코딩테스트 합격자 되기 C++ 06_07장 스택과 큐에 대한 강의 입니다.
코딩테스트 합격자 되기 C++ 06_07장 스택과 큐에 대한 강의 입니다.
 
3주차 스터디
3주차 스터디3주차 스터디
3주차 스터디
 
Semina tree
Semina   treeSemina   tree
Semina tree
 
Tensorflow
TensorflowTensorflow
Tensorflow
 
자료구조2보고서
자료구조2보고서자료구조2보고서
자료구조2보고서
 
Programming java day2
Programming java day2Programming java day2
Programming java day2
 
Clean code(02)
Clean code(02)Clean code(02)
Clean code(02)
 
Dynamic programming
Dynamic programmingDynamic programming
Dynamic programming
 
R 프로그래밍-향상된 데이타 조작
R 프로그래밍-향상된 데이타 조작R 프로그래밍-향상된 데이타 조작
R 프로그래밍-향상된 데이타 조작
 
Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버Erlang을 이용한 swap 서버
Erlang을 이용한 swap 서버
 

BOJ10547

  • 2. SAMPLE INPUT/OUTPUT 9 12 5 13 5 9 12 13 16 2 1 7 5 10 2 1 7 5 16 10 7 9 8 3 6 5 7 9 83 6 5 4 1 9 12 5 13 6 2 16 2 1 7 5 10 6 3 7 9 8 3 6 5 1 1 3
  • 3. SOLUTION 정렬을 통해 각 원소가 몇 번째 블록으로 가야 하는지 계산한다. (블록 내에서 순서는 바뀌어도 블록이 바뀌진 않는다.) 이미 정렬이 완료된 원소는 움직일 필요가 없다. 따라서 이미 정렬이 완료된 원소의 개수를 세면 정답을 찾을 수 있다. 가야 할 블록의 최장 증가 부분 수열(LIS)의 길이가 이미 정렬이 완료된 원소의 개수이다.
  • 4. CODE #include<iostream> #include<vector> #include<algorithm> using namespace std; int N, K; vector<int> v; int main() { cin >> N >> K; v.assign(N, 0); for (int i = 0; i < N; i++) { cin >> v[i]; } vector<pair<int, int>> sorted; vector<pair<int, int>> unsorted; for (int i = 0; i < N; i++) { sorted.push_back(make_pair(v[i], i)); unsorted.push_back(make_pair(v[i], i)); } sort(sorted.begin(), sorted.end()); for (int i = 0; i < sorted.size(); i++) { unsorted[sorted[i].second].second = i / K + 1; } int max_idx = 0; //LIS(Longest Increasing Subsequence) vector<int> dp(N); for (int i = 0; i < N; i++) { int idx = upper_bound(dp.begin(), dp.begin() + max_idx, unsorted[i].second) - dp.begin(); if(idx == max_idx)max_idx++; dp[idx] = unsorted[i].second; } cout << N - max_idx << endl; return 0; }
  • 5. EXPLANATION 최장 증가 부분 수열, Longest Increasing Subsequence, LIS [3, 5, 1, 9, 2, 1, 4, 8]과 같은 수열에서 임의의 수를 제거해 정렬된 상태인 부분 수열을 구하는데 길이가 최대가 되는 부 분 수열을 찾는 문제가 최장 증가 부분 수열 문제이다. 알고리즘을 정리하자면 아래와 같다. 현재 원소를 DP 배열의 정렬이 되도록 덮어씌운다. (삽입 X) 예를 들어 DP 배열에 [1, 4, 8]이 있다면 3을 어디에 덮어씌워야 정렬이 유지가 되는가이다. 4를 3으로 대체한다면 [1, 3, 8]이 되어 정렬을 유지할 수 있다. DP 배열의 길이가 최장 증가 부분 수열의 길이이다.
  • 6. EXPLANATION 최장 증가 부분 수열, Longest Increasing Subsequence, LIS idx max dp배열의 크기는 1이였고 3은 들어갈 공간이 하나 밖에 없으니 그대로 삽입한다.
  • 7. EXPLANATION 최장 증가 부분 수열, Longest Increasing Subsequence, LIS idx max dp 배열은 [3][ ] 이였고 5는 마지막 원소가 되어야 한다.
  • 8. EXPLANATION 최장 증가 부분 수열, Longest Increasing Subsequence, LIS idxmax dp 배열은 [3][5][ ] 이였고, 1은 맨 처음 원소가 되어야 한다. 맨 뒤에 들어가는 경우가 아니면 dp 배열의 길이는 늘어나지 않는다.
  • 9. EXPLANATION 최장 증가 부분 수열, Longest Increasing Subsequence, LIS idxmax dp 배열은 [1][5][ ] 이였고, 9는 마지막 원소가 되어야 한다.
  • 10. EXPLANATION 최장 증가 부분 수열, Longest Increasing Subsequence, LIS idx max dp 배열은 [1][5][9][ ] 이였고 2는 5의 자리를 대체하면 된다.
  • 11. EXPLANATION 최장 증가 부분 수열, Longest Increasing Subsequence, LIS idx max dp 배열은 [1][2][9][ ] 이였고 1은 맨 앞으로 가면 된다.
  • 12. EXPLANATION 최장 증가 부분 수열, Longest Increasing Subsequence, LIS idx max dp 배열은 [1][2][9][ ] 이였고 4는 9의 자리를 대체한다.
  • 13. EXPLANATION 최장 증가 부분 수열, Longest Increasing Subsequence, LIS idx max dp 배열은 [1][2][4][ ] 이였고 8은 마지막 자리로 가면 된다. 최장 증가 부분 수열은 길이가 4이다.