Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- 로보틱스
- 집합과 맵
- 논문리뷰
- 수학
- 텔레스코픽로봇
- 구현
- 자료구조
- baekjoon
- LeggedRobot
- C++
- 다리로봇
- 백준
- 큐
- 정렬
- baekjoon problem solving
- HJB방정식
- MIT opencourse
- 최적제어
- 실버 4
- BOJ
- std::sort
- lqr
- 실버 5
- mit
- mathematics for computer science
- 로봇공학
- 전국 대학생 수학 경시대회
- 문자열
- 대수경
- 6.042j
Archives
- Today
- Total
서두르지 말고 쉬지 말자
백준 1018번 체스판 다시 칠하기(C++) 본문
문제 해결 전략 : 2가지 경우의 체스판 배열과 값을 N,M만큼 입력 받아서 보드판 벡터를 생성한 후, 2가지 경우의 보드판과 벡터를 비교한다. 이때, 모든 경우를 반복문을 사용해서 비교한다.
문제 해결 소감 : 문제 해결 시점으로부터 몇달전에도 문제 해결 아이디어는 동일하게 가지고 있었으나 배열을 이용해 코드로 구현하는 것에 어려움을 느꼈다. 그러나 마침내 구현 방법을 찾아냈다. C++primer로 2차원 배열을 학습한 후에 사고력이 더 좋아진 것 같다.
#include <iostream>
#include <vector>
int N, M; // 8보다 크거나 같고 50보다는 작음
char C;
int cnt = 0;
int minCnt = 3000; // 다 틀렸을 때 최댓값 2500보다 크게 설정
char board1[8][8] = {
{'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'},
{'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'},
{'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'},
{'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'},
{'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'},
{'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'},
{'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'},
{'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'},
};
char board2[8][8] = {
{'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'},
{'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'},
{'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'},
{'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'},
{'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'},
{'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'},
{'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'},
{'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'},
}; // B W B W ...
std::vector<std::vector<char>> mainboard; // N행 M열 무작위 판
std::vector<char> mainrow;
int main(void)
{
std::cin >> N >> M;
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < M; ++j)
{
std::cin >> C;
mainrow.push_back(C);
}
mainboard.push_back(mainrow);
mainrow.clear(); //입력 받아서 N * M 보드판 생성
}
for (int k = 0; k < (N - 8) + 1; ++k)
{
for (int l = 0; l < (M - 8) + 1; ++l)
{
cnt = 0;
for (int i = k; i < k + 8; ++i)
{
for (int j = l; j < l + 8; ++j)
{
if (mainboard[i][j] != board1[i - k][j - l])
++cnt;
}
}
if (cnt < minCnt)
{
minCnt = cnt;
}
}
} //보드1과 비교해서 최소값 찾기
for (int k = 0; k < (N - 8) + 1; ++k) //행을 한칸씩 아래쪽으로 해서 비교
{
for (int l = 0; l < (M - 8) + 1; ++l)
{
cnt = 0;
for (int i = k; i < k + 8; ++i) //열을 한칸씩 오른쪽으로 해서 비교
{
for (int j = l; j < l + 8; ++j)
{
if (mainboard[i][j] != board2[i - k][j - l])
++cnt; //board와 비교는 행과열이 변하지 않고 비교해야되서
} //이를 위해 k와 l만큼 빼기(k,l만큼 변화하기 때문)
} //체스판과 검사
if (cnt < minCnt)
{
minCnt = cnt;
}
}
} //보드 2와 비교해서 최솟값 찾기
std::cout << minCnt; //최종 최솟값 출력
return 0;
}반응형
'코딩 공부 > Baekjoon Problem Solving' 카테고리의 다른 글
| 백준 2751번 수 정렬하기 2(C++) (1) | 2025.01.14 |
|---|---|
| 백준 1181번 단어 정렬[C++] (2) | 2025.01.13 |
| 백준 1436번 영화감독 숌(C++) (3) | 2024.11.27 |
| 백준 3052번 나머지(C++) (1) | 2024.11.22 |
| 백준 11720번 숫자의 합(C++) (1) | 2024.07.10 |
