문제 링크 - https://www.acmicpc.net/problem/17140
🌱 문제
🌱 풀이
- 시뮬레이션 문제였다.
- 아래 코드에서
while(true)
조건을 이용해 반복하다가 정답이 나오거나 문제에서 요구한대로 100초가 지나게 되면 -1를 출력하도록 했다.
r = 3; c = 3;
while (true) {
if (answer > 100) {
answer = -1;
break;
}
if (target_r < r && target_c < c && arr[target_r][target_c] == k)
break;
answer++;
if (r >= c)
operationR();
else
operationC();
}
- R연산, C연산 함수는 행에 대한 연산인지, 열에 대한 연산인지만 다르므로 그 부분 코드만 다르고 나머지 로직은 같다.
- 연산하는 함수에 대한 풀이는 조금 복잡해서 주석에 적어두었다.
🌱 코드
package week14.boj_17140;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.StringTokenizer;
public class Somyeong {
static class Info implements Comparable<Info> {
int num, cnt;
public Info(int num, int cnt) {
this.num = num;
this.cnt = cnt;
}
@Override
public String toString() {
return "Info [num=" + num + ", cnt=" + cnt + "]";
}
public int compareTo(Info o) {
if (this.cnt == o.cnt)
return this.num - o.num;
return this.cnt - o.cnt;
}
}
static int target_r, target_c, k;
static int r, c;
static int arr[][];
static int answer;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
target_r = Integer.parseInt(st.nextToken()) - 1;
target_c = Integer.parseInt(st.nextToken()) - 1;
k = Integer.parseInt(st.nextToken());
arr = new int[3][3];
for (int i = 0; i < 3; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < 3; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
r = 3; c = 3;
while (true) {
if (answer > 100) {
answer = -1;
break;
}
if (target_r < r && target_c < c && arr[target_r][target_c] == k)
break;
answer++;
if (r >= c)
operationR();
else
operationC();
}
System.out.println(answer);
}
public static void operationR() {
HashMap<Integer, Integer>[] map = new HashMap[r];
ArrayList<Info> infos[] = new ArrayList[r];
int maxC = 0;
for (int i = 0; i < r; i++) {
if (i >= 100)
break;
map[i] = new HashMap<Integer, Integer>();
infos[i] = new ArrayList<Info>();
for (int j = 0; j < c; j++) {
if (j >= 100)
break;
int cur = arr[i][j];
if (cur == 0)
continue;
if (map[i].containsKey(cur))
map[i].put(cur, map[i].get(cur) + 1);
else
map[i].put(cur, 1);
}
maxC = Math.max(maxC, map[i].size());
for (Integer x : map[i].keySet()) {
infos[i].add(new Info(x, map[i].get(x)));
}
}
c = maxC * 2;
arr = new int[r][c];
for (int i = 0; i < r; i++) {
Collections.sort(infos[i]);
int index = 0;
for (int j = 0; j < infos[i].size(); j++) {
arr[i][index++] = infos[i].get(j).num;
arr[i][index++] = infos[i].get(j).cnt;
}
}
}
public static void operationC() {
HashMap<Integer, Integer>[] map = new HashMap[c];
ArrayList<Info> infos[] = new ArrayList[c];
int maxR = 0;
for (int i = 0; i < c; i++) {
if (i >= 100)
break;
map[i] = new HashMap<Integer, Integer>();
infos[i] = new ArrayList<Info>();
for (int j = 0; j < r; j++) {
if (j >= 100)
break;
int cur = arr[j][i];
if (cur == 0)
continue;
if (map[i].containsKey(cur))
map[i].put(cur, map[i].get(cur) + 1);
else
map[i].put(cur, 1);
}
maxR = Math.max(maxR, map[i].size());
for (Integer x : map[i].keySet()) {
infos[i].add(new Info(x, map[i].get(x)));
}
}
r = maxR * 2;
arr = new int[r][c];
for (int i = 0; i < c; i++) {
Collections.sort(infos[i]);
int index = 0;
for (int j = 0; j < infos[i].size(); j++) {
arr[index++][i] = infos[i].get(j).num;
arr[index++][i] = infos[i].get(j).cnt;
}
}
}
}