알고리즘/코드트리 문제풀이
코드트리 [자바 java] 숫자가 가장 큰 인접한 곳으로 동시에 이동
잔디🌿
2023. 7. 25. 22:45
https://www.codetree.ai/missions/2/problems/move-to-max-adjacent-cell-simultaneously/description
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
배열에 있는 수들과 그 곳에 위치한 구슬들이 존재할 때 해당 조건에 맞게 구슬을 움직이고, 마지막에 남은 구슬의 갯수를 구하는 문제이다.
- 구슬들의 위치를 입력받을 때 이를 다른 배열에 저장해두지 않고, 새로운 격자를 만들어 해당 위치에 1로 표시했는데 이는 구슬이 겹쳐졌을 때 없애는 조치를 취하기 쉽고, 나중에 구슬의 갯수를 셀 때 모두 더하면 되니까 편리하다.
- 구슬 주변의 숫자를 탐색할 때 dx,xy테크닉을 사용했는데, dx,dy 배열을 만들 때 문제에서 제시한 우선순위(상하좌우)를 고려하였다.
import java.io.*;
import java.util.*;
import java.math.*;
public class Main {
static int[][] arr;
static int[][] mar;
static int n;
//구슬 움직이기
static void move(){
int[][] newmar = new int[n+1][n+1];
int[] dx = {-1,1,0,0};
int[] dy = {0,0,-1,1};
for(int i = 1;i<=n;i++){
for(int j = 1;j<=n;j++){
if(mar[i][j] == 1){
int max = 0;
int mx = 0;
int my = 0;
for(int k = 0;k<4;k++){
if( i + dx[k] >= 1 && i + dx[k] <= n &&
j + dy[k] >= 1 && j + dy[k] <= n && max < arr[i + dx[k]][j + dy[k]]){
mx = i + dx[k];
my = j + dy[k];
max = arr[i + dx[k]][j + dy[k]];
}
}
newmar[mx][my] += 1;
}
}
}
for(int i = 1;i<=n;i++){
for(int j = 1;j<=n;j++){
mar[i][j] = newmar[i][j];
}
}
remove();
}
// 겹치는 구슬 없애기
static void remove(){
for(int i = 1;i<=n;i++){
for(int j = 1;j<=n;j++){
if(mar[i][j] >= 2){
mar[i][j] = 0;
}
}
}
}
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int t = Integer.parseInt(st.nextToken());
arr = new int[n+1][n+1];
mar = new int[n+1][n+1];
for(int i = 1;i<=n;i++){
st = new StringTokenizer(br.readLine());
for(int j =1;j<=n;j++){
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
for(int i =0;i<m;i++){
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
mar[a][b] = 1;
}
for(int i = 0;i<t;i++){
move();
}
int ans = 0;
for(int i = 1;i<=n;i++){
for(int j = 1;j<=n;j++){
ans += mar[i][j];
}
}
System.out.println(ans);
}
}