본문 바로가기

백준

18788 Swapity Swap

 

풀려고 했었는데 못 풀었다. 생각난 개념은 중간에 반복되는 걸 센 다음 % 해서 구해야겠다 싶었다. 그런데 나머지 연산으로 결과 계산하는게 제대로 안 됐고 결국에는 포기했다. 계속 뭐가 문제인지 모르니깐 문제를 쳐다보기도 싫었다. 어쩌겠어. 다른 사람 풀이를 참고해서 풀었다. 

 

#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