Skip to content

Latest commit

 

History

History
221 lines (204 loc) · 4.52 KB

2022-04-24-17822-원판돌리기.md

File metadata and controls

221 lines (204 loc) · 4.52 KB
title date category draft
17822-원판돌리기
2022-04-24 00:10:00 +0900
Algorithm
false

2022-04-24-17822-원판돌리기

목차

01.시계방향또는 반시계방향으로 이동하기

02.dfs 같은수 숫자 제거하기

03.제거못하는 경우 평균 구해서 빼기

04.전체소스

01.시계방향또는 반시계방향으로 이동하기

void clockArr(int idx, int arr[MS]) {
    int copy = arr[M-1];
    for (int i = M-1; i >0; i--) {
        arr[i] = arr[i - 1];
    }
    arr[0] = copy;
}
void clockArrReverse(int idx, int arr[MS]) {
    int copy = arr[0];
    for (int i = 0; i <M-1; i++) {
        arr[i] = arr[i +1];
    }
    arr[M-1] = copy;
}

02.dfs 같은수 숫자 제거하기

void dfs(int y, int x, int number) {

    for (int dir = 0; dir < 4; dir++) {
        int ny = y + dy[dir]; int nx = x + dx[dir];
        if (nx < 0) nx = M-1;
        if (nx == M) nx = 0;
        if (0<=ny&&ny<N&&visit[ny][nx] == 0 && board[ny][nx] == number) {
            flag = 1;
            board[ny][nx] = 0;
            visit[ny][nx] = 1;
            dfs(ny, nx, number);
        }
    }
}

03.제거못하는 경우 평균 구해서 빼기

if (retSum == 0) {//제거 못하는 경우
    double number = 0; int count = 0;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            if (board[i][j] != 0) {
                number += board[i][j];
                count++;
            }
        }
    }
    double  avgNumber = number / count;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            if (board[i][j] != 0) {
                if (board[i][j] > avgNumber) {
                    board[i][j]--;
                }
                else if (board[i][j] < avgNumber) {
                    board[i][j]++;
                }
            }
        }
    }
}
  • 여기서 주의
    • double = int / count;
    • double= double/ count;
      • 두개의 차이가 있음 제대로 하려면 더블로 해서 계산을 해야함
      • 형변환 절대 주의 할 것

04.전체소스

#include<stdio.h>
#include<iostream>
#include<string.h>
#define NS 51
#define MS 51
using namespace std;
int N, M,T, ret;
int dy[] = { 0,1,0,-1 };
int dx[] = { 1,0,-1,0 };
int visit[NS][MS];
int board[NS][MS];
int X, D, K;
int flag = 0;
void init() {
	N = M = T=ret = 0;
	scanf("%d %d %d", &N, &M, &T);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			scanf("%d", &board[i][j]);
		}
	}
}
void clockArr(int idx, int arr[MS]) {
	int copy = arr[M-1];
	for (int i = M-1; i >0; i--) {
		arr[i] = arr[i - 1];
	}
	arr[0] = copy;
}
void clockArrReverse(int idx, int arr[MS]) {
	int copy = arr[0];
	for (int i = 0; i <M-1; i++) {
		arr[i] = arr[i +1];
	}
	arr[M-1] = copy;
}
void dfs(int y, int x, int number) {
	
	for (int dir = 0; dir < 4; dir++) {
		int ny = y + dy[dir]; int nx = x + dx[dir];
		if (nx < 0) nx = M-1;
		if (nx == M) nx = 0;
		if (0<=ny&&ny<N&&visit[ny][nx] == 0 && board[ny][nx] == number) {
			flag = 1;
			board[ny][nx] = 0;
			visit[ny][nx] = 1;
			dfs(ny, nx, number);
		}
	}
}
void play() {
	for (int t = 0; t < T; t++) {
		scanf("%d %d %d", &X, &D, &K);

			if (D == 0) {
				for (int i = 0; i < N; i++) {
					if ((i+1)%X == 0) {
						for (int k = 0; k < K; k++) {
							clockArr(i, board[i]);
						}
					}
				}
			}
			else if (D == 1) {
				for (int i = 0; i < N; i++) {
					if ((i+1)%X == 0) {
						for (int k = 0; k < K; k++) {
							clockArrReverse(i, board[i]);
						}
					}
				}
			}

		int retSum = 0;
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				if (board[i][j]!=0&&visit[i][j] == 0) {
					flag = 0;
					int copyNumber = board[i][j];
					visit[i][j] = 1;
					dfs(i, j, board[i][j]);
					if (flag == 1)board[i][j] = 0;
					retSum += flag;
				}
			}//for j
		}//for i
		memset(visit, 0, sizeof(visit));
		if (retSum == 0) {//제거 못하는 경우
			double number = 0; int count = 0;
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < M; j++) {
					if (board[i][j] != 0) {
						number += board[i][j];
						count++;
					}
				}
			}
			double  avgNumber = number / count;
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < M; j++) {
					if (board[i][j] != 0) {
						if (board[i][j] > avgNumber) {
							board[i][j]--;
						}
						else if (board[i][j] < avgNumber) {
							board[i][j]++;
						}
					}
				}
			}
		}
	}//for t

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			ret += board[i][j];
		}
	}
}
int main(void) {
	init();
	play();
	printf("%d\n", ret);
	return 0;
}