https://www.acmicpc.net/problem/17140
풀이
#3*3배열 A #R: 모든 행에 대해서 행의 개수 >= 열의개수 일때 적용 #C: 모든 열에 대해서 행의개수 <열의 개수 일때 적용 #정렬, 수와 등장횟수 #수의 등장횟수가 커지는 순으로, 이게 여러개면 수가 커지는 순으로(모두 오름차순) #R:: 행의 크기 가장 큰 행을 기준으로 행 확장, 100개 넘어가면 나머지 버림 #C:: 열의 크기 가장 큰 열을 기준으로 열 확장(0으로) 단, 정렬시 0무시
=> cnt에 입력하면서 a[][]를 0으로 바꿔줌으로써 해결, 정렬시 0무시는 a[][]가 0이 아닌지 확인하여 해결
#A[r][c]에 들어있는 값이 k가 되기 위한 최소 시간 #저 규칙대로 구해서 A[r][c]==k면 종료, 시간출력, 100넘어가면 -1출력
python3
from sys import*
from collections import*
input = stdin.readline
def solve():
global n,m
for t in range(101):
if a[r-1][c-1] == k: return t
if n >= m:
for i in range(n):
cnt = [0]*101
for j in range(m):
if a[i][j]:
cnt[a[i][j]]+=1
a[i][j]=0
b=[]
for j in range(101):
if cnt[j]:b.append((cnt[j], j))
b.sort()
m = max(m, len(b)*2)
j=0
for x in b:
a[i][j+1], a[i][j] = x
j+=2
else:
for i in range(m):
cnt = [0]*101
for j in range(n):
if a[j][i]:
cnt[a[j][i]]+=1
a[j][i]=0
b=[]
for j in range(101):
if cnt[j]:b.append((cnt[j], j))
b.sort()
n = max(n, len(b)*2)
j=0
for x in b:
a[j+1][i], a[j][i] = x
j+=2
return -1
r,c,k = map(int,input().split())
a=[[0]* 101 for _ in range(101)]
for i in range(3):
a[i][0], a[i][1], a[i][2] = map(int,input().split())
n, m = 3, 3
print(solve())
C++
//입출력
//vector
//sort(), max()
using namespace std;
const int SIZE = 101;
int r, c, k, n=3, m=3;
int a[SIZE][SIZE];
typedef pair<int, int> P;
int solve(){
for(int t=0; t<101; t++){
if(a[r-1][c-1]==k) return t;
if(n>=m){ //R연산
for(int i=0; i<n; i++){
int cnt[SIZE]={0,}; //초기화 잘 시켜주기
for(int j=0; j<m; j++){
if(a[i][j]){
cnt[a[i][j]]++;
a[i][j]=0;
}
}
vector<P> v;
for(int j=0; j<101; j++){
if(cnt[j]) v.push_back({cnt[j], j}); //개수, 수
}
sort(v.begin(), v.end());
int v_size = v.size(); //max에 type pair인 v.size()랑 비교했다가 에러남
m = max(m, v_size*2); //두 개의 원소로 정렬, 길이는 두배
int j=0;
for(auto x: v){
a[i][j+1] = x.first; //배열에는 수 먼저 넣음
a[i][j] = x.second;
j+=2;
}
}
}
else{ //C연산
for(int i=0; i<m; i++){
int cnt[SIZE]={0,};
for(int j=0; j<n; j++){
if(a[j][i]){
cnt[a[j][i]]++;
a[j][i]=0;
}
}
vector<P> v;
for(int j=0; j<101; j++){
if(cnt[j]) v.push_back({cnt[j], j});
}
sort(v.begin(), v.end());
int v_size = v.size();
n = max(n, v_size*2);
int j=0;
for(auto x: v){
a[j+1][i] = x.first;
a[j][i] = x.second;
j+=2;
}
}
}
}
return -1;
}
int main(){
scanf("%d %d %d", &r, &c, &k);
for(int i=0; i<3; i++)
scanf("%d %d %d", &a[i][0], &a[i][1], &a[i][2]);
printf("%d", solve());
return 0;
}
고찰
c++:: 초기화 잘 시켜주기, type <int, int>인 v로 max(n, v.size()*2) 했다가 에러남, 그 전에 변수로 설정해서 type 맞춰주기
공부시 참고한 곳: https://rebas.kr/844
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
백준(boj) 11729 하노이 탑 이동 순서(파이썬) (0) | 2020.07.29 |
---|---|
백준(boj) 10870_피보나치 수5 (파이썬) (0) | 2020.07.29 |
백준(boj) 17142 연구소3 (파이썬, c++) (0) | 2020.04.23 |
백준(boj) 17144_미세먼지 안녕! (파이썬, c++) (0) | 2020.04.23 |
백준(boj) 16234_인구 이동 (파이썬, c++) (0) | 2020.04.23 |