해당 문제는 백준 온라인 저지에서 나온 문제입니다.
탐욕 알고리즘으로, 검사할 때마다 앞뒤 두 숫자를 잘라서 비교하는 방식으로 문제를 해결했습니다.
그때그때 가장 최적의 값을 고르는 그리디 알고리즘 문제였기에, 별다른 알고리즘 없이 해결하였습니다.
// Baekjoon.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//
/*
https://www.acmicpc.net/problem/1259
*/
#include <iostream>
using namespace std;
int main()
{
int numberList[1000];
int inputNumber = 0;
bool bIsCompare;
while (1)
{
cin >> numberList[inputNumber];
if (numberList[inputNumber] == 0)
break;
inputNumber++;
}
for (int i = 0; i < inputNumber; i++)
{
if (numberList[i] < 10)//예외조건
{
cout << "yes" << endl;
continue;
}
bIsCompare = true;
//정의[1]
int frontDigit = 1;
while (frontDigit * 10 < numberList[i])
{
frontDigit *= 10;
}
//비교[2]
while (numberList[i] > 0)
{
int numberHead = numberList[i] / frontDigit;
int numberTail = numberList[i] % 10;
if (numberHead != numberTail)
{
bIsCompare = false;
break;
}
numberList[i] %= frontDigit;
numberList[i] /= 10;
frontDigit /= 100;
if (numberList[i] < 10)
break;
}
//출력[3]
if (bIsCompare)
{
cout << "yes" << endl;
}
else
{
cout << "no" << endl;
}
}
}
[1]번 구문에서 통해 앞에서 자를 숫자단위를 구했습니다.
[2]번 구문에서 구한 값을 통해 해당배열 숫자의 앞자리, 뒷자리 숫자를 구해 값이 같은지 검사했습니다.
검은색으로 시작하는 체스판과 하얀색으로 시작하는 두개의 체스판을 만들어, 입력받은 체스판과 매번 비교해 최소값을 구했습니다.
모든 경우의 수를 비교해야하기에, 완전탐색을 활용하여 구현했습니다.
// Baekjoon.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//
/*
https://www.acmicpc.net/problem/1018
*/
#include <iostream>
#include <algorithm>
using namespace std;
//[0]검사용 체스판을 만드는 함수
void MakeBoardCase(char*** board, int width, int height, bool startColor)
{
*board = new char* [height];
bool color;
for (int i = 0; i < height; i++)
{
(*board)[i] = new char[width];
(*board)[i][width] = '\0';
color = startColor;
for (int j = 0; j < width; j++)
{
if (color)
{
(*board)[i][j] = 'B';
}
else
{
(*board)[i][j] = 'W';
}
color = !color;
}
startColor = !startColor;
}
}
//[1]검사용 체스과 체스판을 검사해, 다시 칠해야 하는 부분을 리턴하는 함수
int SolvedPainted(char** board, char** checkBoard, int startX, int endX, int startY, int endY)
{
int paintedCount = 0;
int checkI = 0;
int checkJ = 0;
for (int i = startY; i < endY; i++)
{
checkJ = 0;
for (int j = startX; j < endX; j++)
{
if (board[i][j] != checkBoard[checkI][checkJ])
{
paintedCount++;
}
checkJ++;
}
checkI++;
}
return paintedCount;
}
int main()
{
int width = 0;
int height = 0;
int minPaintCount = 99999;
char** board;
char** CheckCase1;
char** CheckCase2;
MakeBoardCase(&CheckCase1, 8, 8, 1);
MakeBoardCase(&CheckCase2, 8, 8, 0);
cin >> height >> width;
board = new char* [height];
for (int i = 0; i < height; i++)
{
board[i] = new char[width];
cin >> board[i];
}
for (int i = 0; i < height; i++)
{
if (i + 8 > height)
continue;
for (int j = 0; j < width; j++)
{
if (j + 8 > width)
continue;
int paintCount1 = SolvedPainted(board, CheckCase1, j, j + 8, i, i + 8);
int paintCount2 = SolvedPainted(board, CheckCase2, j, j + 8, i, i + 8);
minPaintCount = min(minPaintCount, paintCount1);
minPaintCount = min(minPaintCount, paintCount2);
}
}
cout << minPaintCount;
/*
cout << endl << "case1" << endl;
for (int i = 0; i < 8; i++)
{
cout << CheckCase1[i];
cout << endl;
}
cout << endl << "case2" << endl;
for (int i = 0; i < 8; i++)
{
cout << CheckCase2[i];
cout << endl;
}
*/
}
검사용 체스판을 만들기 위해 [0]번 함수를 작성했습니다.
반복문을 돌며 입력받은 체스판과 , 두 개의 검사용 체스판과 매번 비교해 최소값을 구해 이를 출력하였습니다
차근차근 올립시다
제가 글을 대충읽는 성격이라그런지, 체스판 칠하기 문제를 잘못 이해해서 시간이 한참 걸렸네요. 문제를 정확하게 파악하는 능력을 길러야할 것 같습니다.