[ 문제위치 ]
https://www.acmicpc.net/problem/24052
24052번: 알고리즘 수업 - 삽입 정렬 2
첫째 줄에 배열 A의 크기 N(5 ≤ N ≤ 10,000), 변경 횟수 K(1 ≤ K ≤ N2)가 주어진다. 다음 줄에 서로 다른 배열 A의 원소 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 109)
www.acmicpc.net
[ 문제풀이 ]
삽입 정렬을 이용하여 배열을 정렬하는 것을 기본으로 하는 문제이다.
삽입 정렬 알고리즘에 관해서는 아래 링크로
https://unlock546.tistory.com/3
삽입 정렬
정렬 문제를 해결하는 알고리즘 중 하나 정렬 문제 입력: n개 수들의 수열 출력: a1 ≤ a2 ≤ a3 ≤ a4 ≤ an... 을 만족하는 입력수열의 순열 정렬하고자 하는 숫자를 키라고 하며 입력으로는 n개의
unlock546.tistory.com
이를 활용한 1번 문제 풀이는 아래 링크에서 확인할 수 있다.
https://unlock546.tistory.com/4
백준 24051: 알고리즘 수업-삽입 정렬1
[ 문제위치 ] https://www.acmicpc.net/problem/24051 24051번: 알고리즘 수업 - 삽입 정렬 1 첫째 줄에 배열 A의 크기 N(5 ≤ N ≤ 10,000), 저장 횟수 K(1 ≤ K ≤ N2)가 주어진다. 다음 줄에 서로 다른 배열 A의 원소 A
unlock546.tistory.com
위의 내용을 보고 왔다면 K 번의 저장이 일어난 조건이 같으므로 해당 숫자 대신 배열 전체를 출력해주는 반복문을 설정해주면 된다.
#include <iostream>
#include <queue>
using namespace std;
#define MAX 100000
int main() {
int N, K;
int A[MAX];
cin >> N >> K;
int cnt = 0;//저장 횟수 카운트 용 변수
for (int i = 0; i < N; i++) {//입력
cin >> A[i];
}
for (int i = 1; i < N; i++) {//삽입 정렬 알고리즘
int key = A[i];
int j = i - 1;
while (-1 < j && A[j] > key) {
A[j + 1] = A[j];
cnt++;//카운트하고 조건 충족하면 출력 후 종료
if (cnt == K) {
for (int x = 0; x < N; x++) {//정렬 출력
cout << A[x] << " ";
}
return 0;
}
j--;
}
if (A[j + 1] != key) {//제자리에서 정렬이 끝나 저장 안 되는 경우 제외
cnt++;
A[j + 1] = key;
}
if (cnt == K) {
for (int x = 0; x < N; x++) {//정렬 출력
cout << A[x] << " ";
}
return 0;
}
}
cout << -1;//위 조건에서 충족되지 않으면 cnt < K 이므로 -1 출력
}
'문제 풀이 > 문제 풀이(BOJ)' 카테고리의 다른 글
백준 24051: 알고리즘 수업-병합 정렬1 (0) | 2023.10.11 |
---|---|
백준 24723: 녹색거탑 (2) | 2023.10.11 |
백준 24053: 알고리즘 수업-삽입 정렬3 (0) | 2023.10.08 |
백준 24051: 알고리즘 수업-삽입 정렬1 (0) | 2023.10.08 |
백준 1260: DFS와 BFS (BFS, DFS) (1) | 2023.10.06 |