17140번: 이차원 배열과 연산
첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다.
www.acmicpc.net
[난이도] Gold4
[유형] 시뮬레이션 (삼성SW기출)
[풀이]
R 연산에 대한 함수만 정의하고 배열을 반시계 방향으로 회전하는 함수를 들어서 이용하면 C 연산은 따로 정의하지 않아도 해결할 수 있다.
#include <cstdio> #include <vector> #include <map> #include <algorithm> using namespace std; using vvi = vector<vector<int>>; int r,c,k; vvi rot(vvi& m){ int csz = m.size(); int rsz = m[0].size(); vector<vector<int>> ret(rsz,vector<int>(csz)); for(int i=0;i<rsz;i++) for(int j=0;j<csz;j++) ret[i][j] = m[j][rsz-i-1]; return ret; } vvi R(vvi& m){ vvi tmp; int mxl = 0; for(auto v : m){ map<int,int> cntMap; for(auto i : v) { if(i!=0) cntMap[i]++; } vector<pair<int,int>> ov; for(auto p : cntMap){ ov.push_back({p.second,p.first}); } sort(ov.begin(),ov.end()); vector<int> res; for(auto o : ov){ res.push_back(o.second); res.push_back(o.first); } mxl = max(mxl,(int)res.size()); tmp.push_back(res); } mxl = min(100,mxl); for(auto& t : tmp) t.resize(mxl); return tmp; } int main(){ scanf("%d%d%d",&r,&c,&k); r--,c--; vvi map; for(int i=0;i<3;i++){ vector<int> a(3); for(int j=0;j<3;j++) scanf("%d",&a[j]); map.push_back(a); } int time = 0; while(1){ int rsz = map.size(); int csz = map[0].size(); if(r < rsz && c < csz && map[r][c]==k) break; if(time==100){ time = -1; break; } if(rsz >= csz){ map = R(map); }else{ map = rot(map); map = R(map); for(int i=0;i<3;i++) map=rot(map); } time++; } printf("%d",time); }
github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Gold4/17140.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Gold4] 17298 : 오큰수 (C++) (0) | 2020.12.13 |
---|---|
[BOJ/백준][Gold4] 17281 : 야구(C++) (0) | 2020.12.13 |
[BOJ/백준][Gold4] 17135 : 캐슬 디펜스 (C++) (0) | 2020.12.13 |
[BOJ/백준][Gold4] 1647 : 도시 분할 계획(C++) (0) | 2020.12.13 |
[BOJ/백준][Gold4] 16235 : 나무 재테크(C++) (0) | 2020.12.13 |