본문 바로가기
백준 풀이

[백준/BOJ] - 1018번 c++ 풀이 - 첫 실버

by 반오십 코린이 2022. 11. 11.
728x90


Key Point

1. 정상 체스판의 케이스 2가지를 만들어 놓는다. (2차원 배열로)

2. 탐색을 시작하는 행과 열의 시작점이 달라지기 때문에 각각의 탐색 시작점을 의미하는 start1, start2 변수를 정의

3. 탐색 1cycle이 종료되면 최솟값을 뽑아내어 cnt를 0으로 초기화

4.시작점을 의미하는 변수인 start1, start2와 tem_garo, tem_sero를 tem_garo, tem_sero 값 여부에 따라 변경해준다.

(행을 바꿀 경우 tem_sero의 값이 하나 줄어들게 되고  tem_garo의 값이 초기화 된다.)

5. 배열 탐색 여유 공간을 의미하는 tem_garo와 tem_sero가 전부 0이 되면 반복문을 탈출하여 cnt 최솟값들을 비교하여 가장 최솟값을 뽑아낸다.


새로 알게 된 문법

1. 2차원 배열을 선언할 때 string으로 배열을 선언하고 큰 중괄호기준으로 배열의 크기만큼 중괄호를  차례대로 배치하여 선언할 수 있다.


#include<iostream>
using namespace std;

int main() {

	int M, N;
	int start1 = 0;
	int start2 = 0;
	
	int cnt1 = 0;
	int cnt2 = 0;

	int cnt1_min = 2000;
	int cnt2_min = 2000;

	char arr[50][50];

	cin >> M >> N;

	int garo = N - 8;
	int sero = M - 8;

	int tem_garo = garo;
	int tem_sero = sero;

	string case1[8] = {
		{"WBWBWBWB"},
		{"BWBWBWBW"},
		{"WBWBWBWB"},
		{"BWBWBWBW"},
		{"WBWBWBWB"},
		{"BWBWBWBW"},
		{"WBWBWBWB"},
		{"BWBWBWBW"}
	};
	string case2[8] = {
		{"BWBWBWBW"},
		{"WBWBWBWB"},
		{"BWBWBWBW"},
		{"WBWBWBWB"},
		{"BWBWBWBW"},
		{"WBWBWBWB"},
		{"BWBWBWBW"},
		{"WBWBWBWB"}
	};
	
	for (int i = 0; i < M; i++) {
		for (int j = 0; j < N; j++) {
			cin >> arr[i][j]; //M,N
		}
	}
	// sero 세로줄 얼마나 더 갈수있는지
	// garo 가로줄 얼마나 더 갈수있는지
	while (1) {
		for (int i = start1; i < start1+8; i++) {
			for (int j = start2; j < start2 + 8; j++) {
				if (arr[i][j] != case1[i - start1][j - start2]) //case1의 경우와 비교
					cnt1++;
				if (arr[i][j] != case2[i - start1][j - start2]) //case2의 경우와 비교
					cnt2++;
			}
		}

		if (cnt1 < cnt1_min)
			cnt1_min = cnt1;

		if (cnt2 < cnt2_min)
			cnt2_min = cnt2;
		cnt1 = 0;
		cnt2 = 0;

		if (tem_garo != 0) { //가로 이동
			start2 += 1; // 가로 +1
			tem_garo -= 1; // 가로 한계 -1
		}
		else if (tem_garo == 0 && tem_sero != 0) { //가로로 갈 수 없고 세로로 갈 수 있는 경우
			start1 += 1; //세로 +1
			start2 = 0; //가로 초기화
			tem_garo = garo; // 가로 한계 초기화
			tem_sero -= 1; //세로 한계 -1
		}
		else if (tem_garo == 0 && tem_sero == 0) //가로,세로 둘다 이동 불가할 경우
			break;
	}
	
		if (cnt1_min > cnt2_min)
			cout << cnt2_min;
		else
			cout << cnt1_min;
	
		 
	return 0;
}
728x90

'백준 풀이' 카테고리의 다른 글

[백준/BOJ] - 1259번 c++ 풀이  (0) 2022.11.12
[백준/BOJ] - 1181번 c++ 풀이  (0) 2022.11.12
[백준/BOJ] - 11720번 c++ 풀이  (0) 2022.11.11
[백준/BOJ] - 3052번 c++ 풀이  (0) 2022.11.11
[백준/BOJ] - 2908번 c++ 풀이  (0) 2022.11.10