티스토리 뷰

알고리즘/백준

백준 17822 (배열 돌리기) - java

김다미김태리신시아 2023. 9. 18. 15:54

https://www.acmicpc.net/problem/17822

 

17822번: 원판 돌리기

반지름이 1, 2, ..., N인 원판이 크기가 작아지는 순으로 바닥에 놓여있고, 원판의 중심은 모두 같다. 원판의 반지름이 i이면, 그 원판을 i번째 원판이라고 한다. 각각의 원판에는 M개의 정수가 적혀

www.acmicpc.net

유형 : 구현

 

기본적인 지식을 요구하는 문제이다. 크게 주의할 점에 대해 말하자면 n / 0 은 불가하다 !

그리고 double 형으로 나눈 몫을 비교해야 한다.

배열을 움직이는 방법도 익혀야 하는 문제이다.

 

전체 코드

import java.util.*;
import java.io.*;

public class Main {

    static int n = 0;
    static int m = 0;
    static int k = 0;

    static int[] dx = {0,0,-1,1};
    static int[] dy = {1,-1,0,0};

    static int[][] board;

    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());
        m = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());

        board = new int[n+1][m+1];

        for(int i=1;i<=n;i++){
            st = new StringTokenizer(br.readLine()," ");

            for(int j=1;j<=m;j++){
                board[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        for(int i=1;i<=k;i++){
            st = new StringTokenizer(br.readLine()," ");

            int x = Integer.parseInt(st.nextToken());
            int d = Integer.parseInt(st.nextToken());
            int ki = Integer.parseInt(st.nextToken());

            int tmp = x;
            while(tmp <= n){
                turn(tmp,d,ki);
                tmp += x;
            }

            delete();
        }

        int result = sum();
        System.out.println(result);

        br.close();
    }

    static int sum(){
        int sum = 0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                sum += board[i][j];
            }
        }

        return sum;
    }

    static void delete(){
        boolean keep = false;
        boolean[][] v = new boolean[n+1][m+1];
        int sum = 0;
        int num = 0;

        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){

                if(board[i][j] == 0)
                    continue;

                for(int a = 0;a<4;a++){
                    int nx = i + dx[a];
                    int ny = j + dy[a];

                    if(nx < 1 || nx > n)
                        continue;

                    if(ny < 1)
                        ny = m;

                    if(ny > m)
                        ny = 1;

                    if(board[i][j] == board[nx][ny]){
                        v[i][j] = true;
                        v[nx][ny] = true;
                        keep = true;
                    }
                }
            }
        }

        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(v[i][j]) {
                    board[i][j] = 0;
                }

                if(board[i][j] != 0){
                    sum += board[i][j];
                    num +=1;
                }
            }
        }

        if(sum == 0 || num ==0)
            return;

        if(!keep){
            double tmp2 = (double)sum / num;
            int tmp3 = (int)tmp2;
            if(tmp2 > (double)tmp3){
                plus(tmp3);
            }

            else{
                plusTwo(tmp3);
            }
        }


    }

    static void plusTwo(int num){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){

                if(board[i][j] == 0 || board[i][j] == num)
                    continue;

                if(board[i][j] > num){
                    board[i][j] -=1;
                }

                else if(board[i][j] < num){
                    board[i][j] +=1;
                }
            }
        }
    }

    static void plus(int num){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){

                if(board[i][j] == 0)
                    continue;

                if(board[i][j] > num){
                    board[i][j] -=1;
                }

                else if(board[i][j] <= num){
                    board[i][j] +=1;
                }
            }
        }
    }

    static void print(){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                System.out.print(board[i][j]+" ");
            }
            System.out.println();
        }
        System.out.println();
    }

    static void turn(int idx,int dir,int how){

        int[] tmp = new int[m+1];

        if(dir == 0){
            for(int i=1;i<=m;i++){

                int tmpIdx = i + how;

                if(tmpIdx <= m){
                    tmp[tmpIdx] = board[idx][i];
                }

                else{
                    tmp[tmpIdx - m] = board[idx][i];
                }
            }
        }

        else{
            for(int i=1;i<=m;i++){

                int tmpIdx = i - how;

                if(tmpIdx >=1){
                    tmp[tmpIdx] = board[idx][i];
                }

                else{
                    tmp[tmpIdx + m] = board[idx][i];
                }

            }

        }

        board[idx] = tmp;
    }

}