본문 바로가기

Development

CodeUp 기초100제 (바둑알 십자뒤집기)

19 x 19 바둑알이 깔려있는 상황과 십자뒤집기할 기준좌표를 입력으로 주어진다. 이를 십자뒤집기하면 되는 문제이다. 처음에 십자뒤집기 개념을 잘 몰랐는데 주어진 기준좌표는 뒤집지않고 십자모양으로 뒤집으면 된다.

#include <stdio.h>
#define N 21
int main(){
	int arr[N][N]={0,};
	int a,x,y;

	for(int i=1;i<N-1;i++){
		for(int j=1;j<N-1;j++){
			scanf("%d", &arr[i][j]);
		}
	}
	scanf("%d", &a);
	for(int i=0;i<a;i++){
		scanf("%d %d", &x, &y);
		for(int j=0;j<N-1;j++){
			for(int k=0;k<N-1;k++){
				if(j==y||k==x){
					if(j==k || (j==y&&k==x)) continue;
					arr[j][k]=!arr[j][k];
				}
			}
		}
	/*	for(int w=1;w<N-1;w++){
			for(int q=1;q<N-1;q++){
				printf("%d ", arr[w][q]);
			}
			puts("");
		}
		puts("==========================");
	}*/ For Debugging

	for(int i=1;i<N-1;i++){
		for(int j=1;j<N-1;j++){
			printf("%d ", arr[i][j]);
		}
		puts("");
	}

	return 0;
}

처음에 문제해결을 위해 아이디어를 구상할 때, 이중 for문을 이용하여 x, y좌표를 한번에 순회하며 기준좌표의 십자가모양에 해당하는 좌표를 뒤집는 코드를 작성했다. 몇 가지의 Test-case에서는 작동했지만 비정상적으로 작동하는 케이스가 존재했다. 예시 입력은 다음과 같다.

입력:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
5
11 11
12 12
7 8
9 12
19  

내가 작성한 코드 중, 문제가 된 부분은 이중 for문을 선택한 것과, 두 번째 if문이라고 생각한다. 조건문 없이 x,y좌표를 순회하며 십자뒤집기 한다면 기준좌표도 변경되어버린다. 예제입력으로 테스트했을 때, 해당 문제가 발생하여 기준좌표일 경우에는 continue하여 해당좌표의 값을 뒤집지 않았다. 하지만 안되서 생각을 바꾸어 기준좌표의 x행, y열 각각 for문을 통해 십자뒤집기를 수행했다. 어처피, 기준좌표는 x에서 한번, y에서 한번 더 뒤집기때문에 전과 같은값으로 셋팅될 것이다.

#include <stdio.h>
#define N 21
int main(){
	int arr[N][N]={0,};
	int a,x,y;

	for(int i=1;i<N-1;i++){
		for(int j=1;j<N-1;j++){
			scanf("%d", &arr[i][j]);
		}
	}
	scanf("%d", &a);
	for(int i=0;i<a;i++){
		scanf("%d %d", &x, &y);
		for(int j=0;j<N-1;j++){
			arr[x][j]=!arr[x][j];
		}
		for(int j=0;j<N-1;j++){
			arr[j][y]=!arr[j][y];
		}
	}

	for(int i=1;i<N-1;i++){
		for(int j=1;j<N-1;j++){
			printf("%d ", arr[i][j]);
		}
		puts("");
	}

	return 0;
}

이 문제를 해결하며, 생각대로 문제가 해결되지 않는다면 다른 방법으로 고민하고 실천으로 옮기는 것이 더 도움이 된다는 생각을 했다.

'Development' 카테고리의 다른 글

BOJ 1577(단어공부)  (0) 2021.01.06
BOJ 10828(스택), 10799(쇠막대기)  (0) 2020.12.24
Win32 API 정리  (0) 2019.03.06
알고리즘 DP 정리  (0) 2019.01.22
기초 자료구조 정리(리스트, 그래프, 트리)  (0) 2019.01.14