| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- Unity
- 오블완
- 리그오브레전드턴제게임
- unity게임만들기
- unity3d게임만들기
- 바킹독알고리즘
- 유니티공부
- 백준 c++ 공부
- 백준
- c#코딩기초트레이닝
- c#기초문법
- c#코테
- 백준 구현문제
- 백준 C++
- C#문법
- c#기본문법
- 유니티서바이벌게임만들기
- 바킹독
- c++ solved.ac
- C++
- 티스토리챌린지
- 백준코딩테스트
- c++ 백준
- solved class 2
- unity3dservival
- unity게임
- c#
- 유니티
- 백준코테
- 유니티게임만들기
- Today
- Total
나 개발자 진짜 되냐?
백준 C++ 1018번 체스판 다시 칠하기 ( 2차원 배열, for ) 본문

날씨가 굉장히 많이 풀렸습니다.
창문을 열였는데 집이 더 시원한 거 있죠?
봄이 가까이 왔다는게 실감 나는 요즘입니다.
물론 벚꽃은 다 떨어졌지만요.
🌸
오늘의 문제를 봤습니다.
필자는 체스를 잘 못합니다.
일단 어려운 이유가
그 폰들을 어디 둬야하나...두칸 앞 한 칸 앞 이게
뭔가 나에게는 굉장히 어렵더라구요.
체스 잘하는 사람들은 어떻게 잘하는 걸까?
장기랑 비슷할 텐데..
몇 수 앞을 본다는 게 참 어려운 거 같습니다.
그 어려운 체스를 다시 칠해봅시다!





어... 네..
예제가 굉장히 많네요.
1. 일단 이 친구는 아무리 커도 8*8로 만들려고 한다.
예제 1에서는 4번째 줄에 BBB 여서 여기를 하나 w로 고치면 된다.
예제 2에서는.. 홀수번째는 한 글자만 고치면 되고
짝수번째에서는 두 글자만 고치면 되어서 12개..인 건데
문제는 이건 오른쪽부터 봐야 한다.
예제 3은 볼 게 없으니 0
예제 4는
모두가 B니까 나머지 B를 W로 바꿔주니 32인데
마지막에 W가 있으니 -1 해줘서 31..
예제 5는
1010인데
맨 위에 한 줄 맨 밑 한 줄 그리고 좌우 한 줄씩 자르면 되어서 0이다..
..
음..
감이 안 오는데 이런 문제는 어떻게 접근해야 할까?
첫 번째부터 셀 수 있으면
그냥 해볼 수 있겠는데
잘라내서 최소한을 구해야 하니까
오른쪽부터 봐야 하나? 싶기도 하고..
인지 씨를 찾았다.
인지 씨는 50 * 50까지가 최대고 8*8로 하면 되기 때문에
그렇게 찾는 횟수가 많은 게 아니니까
그냥 1부터 8*8을 해보고
안되면 2부터 8*8을 해보라고 했다.
그게 말이 되나?
모르겠다고 했더니..
나에게 힌트를 주었다.
일단 받아낼 2차원 배열 생성!

숫자를 받고

8*8은 고정값이고
사실 wbwbwb 든 bwbwbw든
둘 중에 하나만 맞으면 되니까
정답지를 만들어두고
n*m이 오면 하나씩 대조해보는 것이 이번 문제의 핵심!

다음에는 4중 포문을 만들어줘야 한다고 한다.
삼중포문도 안 만들어봤는데.. 내가 4중 포문..?!
위에 이중포문은 전체칸 하나씩 비교고
아래 이중포문은 우리가 아까 만들어주었던 BW, WB을 비교해 주는 친구이다..
그래서 p, q는 0부터 n-8까지 해줘야 하고,
왜냐!
10칸이면 0-7 한번 1-8 두 번 2-9 세 번 해줘야 한다.
그래서 횟수로 이렇게 하는 것..!!
중요한 것은 <= 를 해줘야 한다는 것!

중요합니다.
자 다음에, 변수를 만들어줘야 합니다.
이 변수는
문제가 있을 때 카운트 해주는 변수입니다.
그래서 이 변수들의 카운트의 최솟값이 답이 되겠지요!

이식은 결국 큰 한 칸을 움직일 때 초기화 해줘야 하기 때문에!

바깥 두 번째 안에 넣어줘야 합니다.
그래야 0-7 하고 그다음에 1-8로 넘어갈 때 초기화가 된다.
그리고 안으로 들어와서!

안에도 2중 포문!
중요한 것은
0부터 8까지 정답과 비교해 보는 것입니다.
체스판에서 0부터 8까지 해줄 거지만
아까 말대로 1부터 9까지 해야 하는 경우도 있기 때문에
우리는 p와 q도 더해줘야 합니다.
그래서!

이렇게 해줘서 정답과 비교하고 정답과 다르면 cnt를 더해주는 것이지요.

마지막으로 최솟값을 구해야 합니다.
wb가 더 클까? bw가 더 클까? 를 비교 후
전체 값에서 비교값을 빼주면 됩니다.

그렇게 나의 체스판이 완성되었다..
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0);
int n, m;
cin >> n >> m;
char chess[51][51] = {' '};
string WB[8] = {
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW"};
string BW[8] = {
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB",
"BWBWBWBW",
"WBWBWBWB"};
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> chess[i][j];
}
}
int min_chess = 100;
for (int p = 0; p <= n - 8; p++)
{
for (int q = 0; q <= m - 8; q++)
{
int cnt_wb = 0;
int cnt_bw = 0;
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
if (chess[i + p][j + q] != WB[i][j])
cnt_wb++;
if (chess[i + p][j + q] != BW[i][j])
cnt_bw++;
}
}
int min_wbw = min(cnt_wb,cnt_bw);
min_chess = min(min_wbw, min_chess);
}
}
cout << min_chess;
}
저어어어어엉말 힘든 여정이었다.
이해가 굉장히 안 갔다.
그래도 이런 문제는 이렇게 for문으로 완전탐색으로 풀 수 있다는 사실을 알았다.
답이 정해져 있다면 미리 기재해 두고
비교해 보는 것도 좋다는 생각이 들었다.
너어어무 어려운 문제를 풀었더니 머리가 아프다
아니면 실버문제라 그런 걸까...
2단계까지만 풀고
다시 돌아가서 바킹독님의 강의를 들어야 할 듯하다.
답답한.. 마음이다.
'C++을 시작해봐요! > 단계문제를 풀어보아요!' 카테고리의 다른 글
| 백준 C++ 10814번 나이순 정렬 ( stable_sort ) (1) | 2026.04.16 |
|---|---|
| 백준 C++ 1929번 소수 구하기 ( 에라토스테네스의 체 ) (1) | 2026.04.15 |
| 백준 C++ 18110번 solved.ac ( 배열 ) (1) | 2026.04.13 |
| 백준 C++ 10816번 숫자 카드 2 ( map, upper & lower ) (0) | 2026.04.10 |
| 백준 C++ 11651번 좌표 정렬하기 2 ( sort ) (0) | 2026.04.09 |
