개발/알고리즘

2024-04-20 앳코더 (A,B,C)

차가운콩 2024. 4. 21. 01:33

 

 

아직도 실력이 많이 모자란거 같음을 느낍니다.

앳코더는 A랑 B를 시간안에 풀었고
쉬웠습니다.

 

 

하지만 C부터는 번역이 이상해서인지 모르겠으나 방향을 잘못 잡은거 같습니다.

대회가 끝나고 새벽 2시간 동안 더 풀어봐서야 방향을 잡고 풀어냈습니다.

 

처음엔 Vector를 스왑해주는 곳에서 v[nx]와 v[ny]의 second 값을 바꿔야 한다고  생각하였습니다.

그러나 천천히 계속 생각하다보니 v[arr[i]-1]의 second값을 바꿔야하는걸 깨달았습니다.

 

오늘 느낀점은 문제를 머릿속으로 차근차근 풀어보는것을 풀도록 노력하고 문제가 안풀려도

계속 보면서 풀다보면 풀린다는 것 입니다.

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool comp(pair<int,int> a, pair<int,int> b){
    return a.first < b.first;
}

int main() {
    int n;

    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    vector<pair<int,int>> v;
    vector<pair<int,int>> v2;

    cin >> n;

    int arr[n+1] = {0,};

    for(int i = 0; i < n; i++){
        
        cin >> arr[i];
        v.push_back({arr[i],i+1});
    }
    

    sort(v.begin(),v.end(),comp);

    for(int i = 0; i < n; i++){
        int nx = v[i].first; 
        int ny = v[i].second;
		
		if(nx == ny) {
			continue;
		}
		
	
		
		
        v2.push_back({nx,ny});
		
		v[arr[i]-1].second = ny;
		v[i].second = i+1;
		
		int temp = arr[i];
		arr[i] = arr[ny-1];
		arr[ny-1] = temp;
		
		
    }

    cout << v2.size() << '\n';

    for(auto abs : v2){
        cout << abs.first << " " << abs.second << '\n';
    }
}