백준/시뮬레이션
17140 이차원 배열과 연산
have a good time
2024. 6. 12. 17:10
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.StringTokenizer;
class Pair implements Comparable<Pair>{
int number;
int count;
Pair(int number, int count) {
this.number = number;
this.count = count;
}
// 리스트 정렬
// 1) 수의 등장 횟수 적은 -> 많은 (순서)
// 2) 작은 수 -> 큰 수 (순서)
public int compareTo(Pair p) {
if(this.count>p.count) {
return 1;
}else if(this.count < p.count) {
return -1;
}else {
if(this.number>p.number) {
return 1;
}else {
return -1;
}
}
}
}
public class Main {
static int r;
static int c;
static int k;
static int input[][];
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st= new StringTokenizer(br.readLine(), " " );
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
input = new int [101][101];
for(int i=1; i<=3; i++) {
st= new StringTokenizer(br.readLine(), " " );
for(int j= 1; j<=3; j++) {
input[i][j] = Integer.parseInt(st.nextToken());
}
}
int result = solve(input);
if(result>100) {
System.out.println("-1");
}else {
System.out.println(result);
}
}
public static int solve(int input[][]) {
int row_number = 3; // 행 개수 (맨 처음 = 3)
int col_number= 3; // 열 개수 (맨 처음 = 3)
HashMap<Integer, Integer> map = new HashMap<>(); // 수의 등장 횟수 파악 -> HashMap 사용
List<Pair> list = new ArrayList<>(); // 정렬 위해 리스트 사용
int time = 0;
int max_list_length =0;
while(true) {
if(time>100) {
break;
}
if(input[r][c] == k) {
break;
}
int input2[][] = new int[101][101];
max_list_length = 0;
// R 연산 -> 행 기준 정렬
// 행 개수 >= 열 개수
if(row_number>=col_number) {
for(int i=1; i<=row_number; i++) {
for(int j=1; j<=col_number; j++) {
int value = input[i][j];
if(value!=0) {
map.put(value,map.getOrDefault(value, 0)+1);
}
}
// 하나의 행이 끝나면
// map 에 넣은 것을 list 에 넣어서 정렬
for(Integer key:map.keySet()) {
list.add(new Pair(key, map.get(key)));
}
Collections.sort(list);
// 행렬크기 [100][100]으로 유지.
for (int k = list.size()-1; k >= 50; k--) {
list.remove(k);
}
// list.size()*2 ->
// 리스트에는 Pair(number, count) 로 들어가 있고
// 행렬에는 number, count 값을 각각 넣어야 하므로
// *2 함.
max_list_length = Math.max(list.size()*2, max_list_length);
int n = 1;
//list 에 있는 것을 input 행렬의 행에 넣어줌.
for(int k = 0; k<list.size(); k++) {
input2[i][n++] = list.get(k).number;
input2[i][n++] = list.get(k).count;
}
map.clear();
list.clear();
}
col_number = max_list_length;
// C 연산 -> 열 기준 정렬
// 행 개수 < 열 개수
}else {
// 여기까지
for(int i=1; i<=col_number; i++) {
for(int j=1; j<=row_number; j++) {
int value = input[j][i];
if(value!=0) {
map.put(value,map.getOrDefault(value, 0)+1);
}
}
// 하나의 열이 끝나면
// map 에 넣은 것을 list 에 넣어서 정렬
for(Integer key:map.keySet()) {
list.add(new Pair(key, map.get(key)));
}
Collections.sort(list);
int n = 1;
for (int k = list.size()-1; k >= 50; k--) {
list.remove(k);
}
max_list_length = Math.max(list.size()*2, max_list_length);
//list 에 있는 것을 input2 행렬의 열에 넣어줌.
for(int k = 0; k<list.size(); k++) {
input2[n++][i] = list.get(k).number;
input2[n++][i] = list.get(k).count;
}
map.clear();
list.clear();
}
row_number = max_list_length;
}
// 배열 깊은 복사
for(int i=0; i<input2.length; i++) {
System.arraycopy(input2[i],0,input[i],0, input2[0].length);
}
time++;
}
return time;
}
}

[핵심]
- 처음부터 배열 크기를 [100][100]으로 설정해서 계속 사용
- hashmap을 사용해서 각 수의 등장 횟수 구함.
- list를 이용해서 정렬
참고 블로그 : https://tussle.tistory.com/819
[백준] code.plus(시뮬레이션과 구현,JAVA)17140번, 이차원 배열과 연산
문제 링크 17140번: 이차원 배열과 연산 첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자
tussle.tistory.com