ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 17140 (이차원 배열과 연산)
    컴퓨터 공학 기초/알고리즘 (구현) 2020. 7. 28. 19:37

    https://www.acmicpc.net/problem/17140

     

    17140번: 이차원 배열과 연산

    첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다.

    www.acmicpc.net

    해당 문제는 간단한 구현 문제이다.

    Y, X, K 값이 주어지며 배열의 Y, X 번째 요소가 K가 되는 경우를 찾는 문제이다.

    3 * 3 에 해당하는 2차원 배열에 각 수가 주어지며 다음과 같은 조건일 때 배열이 변화한다.

    Y 축의 값과 X축의 값을 비교했을 때 Y 축의 값이 X 보다 크거나 같다면 X축의 값을들 비교한다.

    위의 경우가 아닌경우 Y축의 값들을 비교한다.

    #include <iostream>
    #include <cstring>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    int my = 3, mx = 3;
    int map[100][100];
    struct Node{
    	int overLap;
    	int num;
    };
    
    bool comps(Node a, Node b){
    	if (a.overLap < b.overLap) return true;
    	else if (a.overLap == b.overLap){
    		if (a.num < b.num) return true;
    		else return false;
    	}
    	else return false;
    }
    
    void checkR(){
    
    	int cpMap[100][100] = { 0 };
    	int tmpY = 0;
    	int maxx = 0;
    	
        // X 축을 고정으로 Y축을 변경해가며 Y축의 값들을 정렬한다.
    	for (int x = 0; x < mx; ++x){
    		int idx = 0;
    		vector<int> idxList;
    		vector<Node> result;
    		Node nodeList[150] = { 0 };
    
    		for (int y = 0; y < my; ++y){
    			if (map[y][x] == 0) continue;
                // 만약 배열의 현재 요소가 0 보다 크면서 한번도 나오지 않은 숫자일경우
    			if (nodeList[map[y][x]].overLap == 0){
    				idxList.push_back(map[y][x]);
    				nodeList[map[y][x]].num = map[y][x];
    			};
                // 배열의 숫자에 해당하는 인덱스의 중첩 값 ++
    			nodeList[map[y][x]].overLap++;
    		}
    
    		int n = idxList.size();
    
    		for (int j = 0; j < n; ++j){
    			result.push_back(nodeList[idxList[j]]);
    		}
    		sort(result.begin(), result.end(), comps);
    
    		for (int j = 0; j < n; ++j){
    			if (result[j].num == 0) break;
    			if (idx >= 100) break;
    			if (idx + 2 > tmpY) tmpY = idx + 2;
    			cpMap[idx][x] = result[j].num;
    			cpMap[idx + 1][x] = result[j].overLap;
    			idx += 2;
    		}
    	}
    	memcpy(map, cpMap, 4 * 100 * 100);
    	my = tmpY;
    }
    
    void checkC(){
    	int cpMap[100][100] = { 0 };
    	int tmpX = 0;
    	int maxx = 0;
    	for (int i = 0; i < my; ++i){
    		int idx = 0;
    		vector<int> idxList;
    		vector<Node> result;
    		Node nodeList[150] = { 0 };
    
    		for (int j = 0; j < mx; ++j){
    			if (map[i][j] == 0) continue;
    			if (nodeList[map[i][j]].overLap == 0){ 
    				idxList.push_back(map[i][j]);
    				nodeList[map[i][j]].num = map[i][j];
    			};
    			nodeList[map[i][j]].overLap++;
    		}
    
    		int n = idxList.size();
    
    		for (int j = 0; j < n; ++j){
    			result.push_back(nodeList[idxList[j]]);
    		}
    		sort(result.begin(), result.end(), comps);
    		
    		for (int j = 0; j < n; ++j){
    			if (result[j].num == 0) break;
    			if (idx >= 100) break;
    			if (idx + 2 > tmpX) tmpX = idx + 2;
    			cpMap[i][idx] = result[j].num;
    			cpMap[i][idx + 1] = result[j].overLap;
    			idx += 2;
    		}
    	}
    	memcpy(map, cpMap, 4 * 100 * 100);
    	mx = tmpX;
    }
    
    int main(){
    	//freopen_s(new FILE*, "tes.text", "r", stdin);
    	int ty, tx, k;
    	int cnt = 0;
    
    	cin >> ty >> tx >> k;
    	ty--; tx--;
    
    	for (int i = 0; i < 3; ++i){
    		for (int j = 0; j < 3; ++j){
    			cin >> map[i][j];
    		}
    	}
    	
    	while (1){
    		if (map[ty][tx] >= 100) break;
    		if (map[ty][tx] == k) break;
    		if (cnt > 100) {
    			cnt = -1;
    			break;
    		}
    		if (my >= mx) checkC();
    		else if (my < mx) checkR();
    		++cnt;
    	}
    	printf("%d ", cnt);
    }
    

    '컴퓨터 공학 기초 > 알고리즘 (구현)' 카테고리의 다른 글

    백준 11723 ( 집합 )  (0) 2020.08.20
    백준 17811 (원판 돌리기)  (0) 2020.07.31
    백준 17837 (새로운 게임 2)  (0) 2020.07.30
    백준 17143 (낚시왕)  (0) 2020.07.27

    댓글

Designed by Tistory.