문제출처: https://www.acmicpc.net/problem/3076


문제

상근이는 체스판을 만들려고 한다.

체스판은 검정칸과 흰칸으로 이루어져 있다. 가장 왼쪽 위칸의 색은 검정색이고, 나머지 색은 검정과 흰색이 번갈아가면서 등장한다. 검정색은 'X'로, 흰색은 '.'로 표시한다.

상근이의 체스판은 R행 * C열로 이루어져 있어야 한다. 또, 각각의 행의 높이는 문자 A개만큼 이며, 각각의 열의 너비는 문자 B개 만큼이다. 예제 출력을 보고 이해하면 쉽다.

R, C, A, B가 주어졌을 때, 상근이의 체스판을 출력하는 프로그램을 작성하시오.


입력

첫째 줄에 두 양의 정수 R과 C가 주어진다. (1 ≤ R, C ≤ 10)

둘째 줄에 두 양의 정수 A와 B가 주어진다. (1 ≤ A, B ≤ 10)


출력

출력은 R * A행 C * B열로 이루어져 있어야 하며, 문제에서 설명한 상근이의 체스판을 출력한다.


풀이

별찍기 문제 응용문제라고 생각하면됩니다. 다만, 반복문을 어디까지 이해하고 쓸줄 아느냐가 중요합니다.

처음엔 반복문을 구성할 때 행에 대해 for(int i=0; i<r*a;i++), 열에 대해 for(int j=0; j<c*b;j++)이렇게 반복문을 작성하였는데 이렇게 작성하면 문제에서 주어진 규칙성을 응용하지않고 하나하나 규칙을  따로 찾아서 구현해야하므로 까다롭기 때문에 반복되는 규칙을 곧바로 코드로 옮기면 풀이가 쉬워집니다. 소스코드는 말보다 직접보는게 이해가 빠를 것 같아서 주석으로 달아놓았고, 중요한 건 19행의 조건문입니다

행과 열에서 각각 덩어리로 구성되는 문자열 "xxx", "..."을 각각 하나로 보되 각각 a,b만큼 찍히는만큼 하나로 보는겁니다.

보기에서 1행과2행을 한덩어리로 보고, 열에서 "xxx", "..."을 각각 한 덩어리로 보면 i,j로 갖고노는 단순 반복문구성이됩니다.


코드

#include<iostream>
using namespace std;
int main()
{
	int r, c, a, b;
	cin >> r >> c >> a >> b;
	//5행을
	for (int i = 0; i < r; i++)
	{
		//2번씩 출력=총 10줄
		for (int j = 0; j < a; j++)
		{
			//1열당 5개의덩어리
			for (int k = 0; k < c; k++)
			{
				//그 5개가 각각 3개의문자이룸
				for (int l = 0; l < b; l++)
				{
					if ((i + k) % 2 == 0)
						cout << "X";
					else cout << ".";
				}
			}
			cout << endl;
		}
	}
}


결과



'문제풀이(BOJ) > 규칙찾기' 카테고리의 다른 글

[백준 1652] 누울 자리를 찾아라  (2) 2020.01.15
[백준 1855] 암호  (0) 2020.01.06
[백준 1551] 수열의 변화  (0) 2020.01.03
[백준 10996] 별 찍기- 21  (0) 2020.01.02
[백준 11312] 삼각 무늬-2  (0) 2019.12.15

+ Recent posts