Day1 - 펠린드롬수, 체스판 다시 칠하기

Mr.뉴트리아·2023년 2월 8일
0

해당 문제는 백준 온라인 저지에서 나온 문제입니다.

펠린드롬 수

문제 바로가기

해결 방식

탐욕 알고리즘으로, 검사할 때마다 앞뒤 두 숫자를 잘라서 비교하는 방식으로 문제를 해결했습니다.

해결 방식을 고른 이유

그때그때 가장 최적의 값을 고르는 그리디 알고리즘 문제였기에, 별다른 알고리즘 없이 해결하였습니다.

코드

// 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]번 함수를 작성했습니다.
반복문을 돌며 입력받은 체스판과 , 두 개의 검사용 체스판과 매번 비교해 최소값을 구해 이를 출력하였습니다

백준 랭크

차근차근 올립시다

여담

제가 글을 대충읽는 성격이라그런지, 체스판 칠하기 문제를 잘못 이해해서 시간이 한참 걸렸네요. 문제를 정확하게 파악하는 능력을 길러야할 것 같습니다.

profile
뉴트리아는 가시쥐과에 속하는 설치류의 일종이다. 오랫동안 뉴트리아과의 유일종으로 분류했지만, 현재는 가시쥐과에 포함시킨다. 늪너구리, 해리서 또는 코이푸라고도 한다. 뉴트리아는 스페인어로 수달을 의미하고, 출생지 남미에서는 이 종류를 코이푸라고 부른다.

0개의 댓글