풀려고 했었는데 못 풀었다. 생각난 개념은 중간에 반복되는 걸 센 다음 % 해서 구해야겠다 싶었다. 그런데 나머지 연산으로 결과 계산하는게 제대로 안 됐고 결국에는 포기했다. 계속 뭐가 문제인지 모르니깐 문제를 쳐다보기도 싫었다. 어쩌겠어. 다른 사람 풀이를 참고해서 풀었다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <bitset>
#include <stdio.h>
#include <math.h>
#include <sstream>
#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()
using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using iis = pair<int, string>;
using ii64 = pair<i64, i64>;
using iii = tuple<int, int, int>;
int nextPosition(int idx, int s, int e) {
if (s <= idx && idx <= e)
return idx + (e - s) - 2 * (idx - s);
return idx;
}
void printVector(vector<int> &v) {
for (int i = 0; i < v.size(); i++)
cout << v[i] << " ";
cout << "\n";
}
int main() {
int n, k, a1, a2, b1, b2;
scanf("%d %d %d %d %d %d", &n, &k, &a1, &a2, &b1, &b2);
vector<int> v(n + 1);
for (int i = 1; i <= n; i++)
v[i] = i;
vector<int> ans(n + 1);
for (int i = 1; i <= n; i++) {
int beforeIdx = i;
vector<int> res;
int cnt = -1;
for (int j = 1; j <= k; j++) {
beforeIdx = nextPosition(beforeIdx, a1, a2);
beforeIdx = nextPosition(beforeIdx, b1, b2);
res.push_back(beforeIdx);
// printf("j: %d \n", j);
printVector(res);
if (beforeIdx == i) {
cnt = j;
break;
}
}
printf("cnt: %d ", cnt);
if (cnt == 1)
ans[i] = i;
else if (cnt == k) {
ans[res[cnt - 1]] = i;
}
else if (cnt != -1 && cnt < k) {
int idx = k % cnt == 0 ? cnt : k % cnt - 1;
// int idx = k + 1
ans[res[idx]] = i;
printf("res: %d %d\n", idx, res[idx]);
}
else {
ans[res[k - 1]] = i;
printf("res: %d %d\n", k - 1, res[k - 1]);
}
}
for (int i = 1; i <= n; i++)
printf("%d\n", ans[i]);
return 0;
}
이건 똥같은 내 코드
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <bitset>
#include <stdio.h>
#include <math.h>
#include <sstream>
#define xx first
#define yy second
#define all(x) (x).begin(), (x).end()
using namespace std;
using i64 = long long int;
using ii = pair<int, int>;
using iis = pair<int, string>;
using ii64 = pair<i64, i64>;
using iii = tuple<int, int, int>;
int nextPosition(int idx, int s, int e) {
if (s <= idx && idx <= e)
return idx + (e - s) - 2 * (idx - s);
return idx;
}
void printVector(vector<int> &v) {
for (int i = 0; i < v.size(); i++)
cout << v[i] << " ";
cout << "\n";
}
int main() {
int n, k, a1, a2, b1, b2;
scanf("%d %d %d %d %d %d", &n, &k, &a1, &a2, &b1, &b2);
int v[105];
for (int i = 1; i <= n; i++)
v[i] = i;
int cnt = 1;
while (true) {
reverse(v + a1, v + a2 + 1);
reverse(v + b1, v + b2 + 1);
bool isOk = true;
for (int i = 1; i <= n; i++) {
if (i != v[i])
isOk = false;
}
if (isOk) break;
cnt++;
}
k %= cnt;
while(k--) {
reverse(v + a1, v + a2 + 1);
reverse(v + b1, v + b2 + 1);
}
for (int i = 1; i <= n; i++) {
printf("%d\n", v[i]);
}
return 0;
}
와 깔끔하다. 나는 복잡하게 인덱스를 계산했는데 그냥 reverse로 바로 뒤집게 좋다. 그리고 생각해보면 3번 확인하면 3번 뒤집은 배열을 바로 확인하면 된다. 나는 왜 그렇게 하나하나 계산했을까.
'백준' 카테고리의 다른 글
7662 이중 우선순위 큐 (0) | 2022.07.02 |
---|---|
1374 강의실 (0) | 2022.06.10 |
16654 Generalized German Quotation (0) | 2022.05.21 |
1183 약속 (0) | 2022.05.14 |
10487 4 thought (0) | 2022.05.14 |