[BOJ] 1730번: 판화

김주원·2020년 8월 8일
0
post-thumbnail

문제 링크

https://www.acmicpc.net/problem/1730

접근한 방식

어느 위치를 수직으로 지나갔는지 표시하는 2차원 배열수평으로 지나갔는지 표시하는 2차원 배열인 p, h 배열을 각각 선언하고
위치를 지나갈때마다 수직으로 지나간 자리는 p 배열의 그 위치에 true를 대입하고, 마찬가지로 수평으로 지나간 자리는 h 배열의 그 위치에 true를 대입한다.
그리고 결과를 출력할때는 true가 있는 경우에 따라 구별하여 문자를 출력하였다.

  • p, h 모두 true라면 '+'
  • p만 true라면 '|'
  • h만 true라면 '-'
  • 둘다 false라면 '.'

코드

C++

#include <iostream>
#include <string>

using namespace std;

int n;
string m;
bool p[100][100]; // 수직으로 지나간 위치인지
bool h[100][100]; // 수평으로 지나간 위치인지
int row, col; // 처음 위치

// 범위 안에 있는 위치인지 판별
bool isValidLocation(const int& row, const int& col) {
	if (row < 0 || row >= n || col < 0 || col >= n) 
		return false;
	
	return true;
}

int main() {
	cin >> n;
	cin >> m;

	// 각각에 경우에 대해 지나간 위치는 배열 p와 배열 h에 true 대입 
	for (int i = 0; i < m.size(); i++) {
		if (m[i] == 'U') {
			if (!isValidLocation(row - 1, col)) continue;

			p[row][col] = true;
			p[--row][col] = true;
		}
		else if (m[i] == 'D') {
			if (!isValidLocation(row + 1, col)) continue;

			p[row][col] = true;
			p[++row][col] = true;
		}
		else if (m[i] == 'L') {
			if (!isValidLocation(row, col - 1)) continue;

			h[row][col] = true;
			h[row][--col] = true;
		}
		else {
			if (!isValidLocation(row, col + 1)) continue;

			h[row][col] = true;
			h[row][++col] = true;
		}
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (p[i][j] && h[i][j]) printf("+");
			else if (p[i][j]) printf("|");
			else if (h[i][j]) printf("-");
			else printf(".");
		}

		printf("\n");
	}

	return 0;
}
profile
자기계발 블로그

0개의 댓글