• Home
  • About
    • Ryureka Moment photo

      Ryureka

      Sin Prisa, Sin Pausa

    • About Me
    • Facebook
    • Github
    • Youtube
  • Projects
  • Posts
    • Posts
    • ProblemSolvings
    • Tags
    • Blog
    • Examples
  • ProblemSolving
    • ProblemSolving
    • BOJ
    • Programmers
    • SWEA
    • LeetCode
  • FrontEnd
    • FrontEnd
    • HTML
  • BackEnd
    • BackEnd
    • Server
      • Server
      • Spring
      • NodeJS
    • DataBase
      • DataBase
      • MySQL
      • MongoDB
  • Programming
    • Programming
    • Java
    • JS
    • Python
    • CleanCode
  • ComputerScience
    • DataStructure
    • Algorithm

[BOJ] 17822. 원판 돌리기

15 Apr 2026

Reading time ~2 minutes

  • 풀이

풀이

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	static Scanner sc=new Scanner(System.in);
	static int N=sc.nextInt();
	static int M=sc.nextInt();
	static int T=sc.nextInt();
	static int map[][]=new int [N][M];
	static int cmd[][]=new int [T][3];
	static int dx[]= {1,0,-1,0};
	static int dy[]= {0,1,0,-1};
	static boolean visited[][]=new boolean [N][M];
	static boolean flag=false;
	static boolean pmFlag=false;
	public static void main(String[] args) {
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				map[i][j]=sc.nextInt();
			}
		}
		
		for (int i = 0; i < T; i++) {
			cmd[i][0]=sc.nextInt();
			cmd[i][1]=sc.nextInt();
			cmd[i][2]=sc.nextInt();
		}
		
		for (int i = 0; i < T; i++) {
			int x=cmd[i][0];
			int d=cmd[i][1];
			int k=cmd[i][2];
			for (int j = 0; j < N; j++) {
				if((j+1)%x==0) {
					if(d==0) CW(map,j,k);
					else CCW(map,j,k);
				}
			}
			pmFlag=false;
			erase();
			if(!pmFlag) pmOne();
		}
		int ans=0;
		
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				ans+=map[i][j];
			}
		}
		System.out.println(ans);
	}
	
	public static void CCW(int arr[][],int x,int k) {
		for (int r = 0; r < k; r++) {
			int temp=arr[x][0];
			for (int i = 1; i < M; i++) {
				arr[x][i-1]=arr[x][i];
			}
			arr[x][M-1]=temp;
		}
	}
	
	public static void CW(int arr[][],int x,int k) {
		for (int r = 0; r < k; r++) {
			int temp=arr[x][M-1];
			for (int i = M-1; i > 0; i--) {
				arr[x][i]=arr[x][i-1];
			}
			arr[x][0]=temp;
		}
	}
	
	public static void go(int x, int y,int val) {
		visited[x][y]=true;
		int nx,ny;
		for (int i = 0; i < 4; i++) {
			nx=x+dx[i];
			ny=y+dy[i];
			if(ny==-1) ny=M-1;
			if(ny==M) ny=0;
			if(nx<0 || nx > N-1 || ny<0 || ny>M-1) continue;
			if(!visited[nx][ny] && map[nx][ny]==val) {
				visited[nx][ny]=true;
				flag=true;
				pmFlag=true;
				map[nx][ny]=0;
				go(nx,ny,val);
			}
		}
	}
	
	public static void erase() {
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				visited[i][j]=false;
			}
		}
		
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				if(!visited[i][j] && map[i][j]!=0) {
					flag=false;
					go(i,j,map[i][j]);
					if(flag) map[i][j]=0;
				}
			}
		}
	}
	
	public static void pmOne() {
		int cnt=0;
		int sum=0;
		double avg=0;
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				if(map[i][j]!=0) {
					cnt++;
					sum+=map[i][j];
				}
			}
		}
		avg=(double)sum/cnt;
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				if(map[i][j]==0) continue;
				if(map[i][j]>avg) {
					map[i][j]-=1;
				}else if(map[i][j]<avg){
					map[i][j]+=1;
				}
			}
		}
		
	}
}


구현시뮬레이션 Share