(BOJ) 1730 판화

1730 판화

  • 분류 : 시뮬레이션, 구현

문제

W대학교 미술대학 조소과에서는 지루한 목판화 작업을 하는 학생들을 돕기 위해 판화 기계를 제작하였다.

기계는 로봇 팔이 쥔 조각도를 상하좌우 네 방향으로 움직일 수 있는 구조로서, 조각도 아래에 목판을 놓으면 그 위에 선들을 자동으로 그어주는 기능을 가지고 있다.

목판에는 N2개의 점들이 일정한 간격으로 N행 N열의 격자모양을 이루며 찍혀있다.

처음 로봇의 조각도를 올려놓는 위치는 항상 이 점들 중 맨 왼쪽 맨 위의 꼭짓점이다.

로봇 팔을 움직이는 명령의 순서가 주어졌을 때, 목판 위에 패인 조각도의 혼적을 출력하는 프로그램을 작성하시오.

판화 기계는 작동 도중 로봇 팔이 격자 바깥으로 나가도록 하는 움직임 명령을 만나면, 무시하고 그 다음 명령을 진행한다.

입력

첫째 줄에 목판의 크기 N (2 ≤ N ≤ 10)이 주어진다.

행 열의 점들이 찍혀 있다는 의미이다.

둘째 줄에 로봇팔의 움직임이 한 줄로 공백 없이 입력된다.

위쪽으로 이동은 ‘U’, 아래쪽으로 이동은 ‘D’, 왼쪽으로 이동은 ‘L’, 오른쪽으로 이동은 ‘R’로 표시된다.

로봇팔의 움직임을 나타내는 이 문자열의 길이는 최대 250이다.

출력

로봇팔이 지나지 않은 점은 ‘.’으로,
로봇팔이 수직 방향으로만 지난 점은 ‘|’으로,
로봇팔이 수평 방향으로만 지난 점은 ‘-‘으로,
수직과 수평 방향 모두로 지난 점은 ‘+’로 표기하도록 한다.

네 문자의 ASCII 코드는 각각 46, 124, 45, 43이다.

예제 입력 1

1
2
5
DRDRRUU

예제 출력 1

1
2
3
4
5
|..|.
++.|.
.+-+.
.....
.....

예제 입력 2

1
2
5
DRDRRUU

예제 출력 2

1
2
3
4
5
|..|.
++.|.
.+-+.
.....
.....

예제 입력 3

1
2
5
RRDDLLUURRDDLLUUR

예제 출력 3

1
2
3
4
5
+-+..
|.|..
+-+..
.....
.....

Solution

Expander
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*

private var N: Int = 0
private var COMMAND: String = ""

private const val MAX = 10
private const val UP = 'U'
private const val DOWN = 'D'
private const val LEFT = 'L'
private const val RIGHT = 'R'

private var vertical = Array(MAX) {
BooleanArray(MAX) {
false
}
}

private var horizontal = Array(MAX) {
BooleanArray(MAX) {
false
}
}

fun main() {
input()
solve()
}

private fun input() = with(BufferedReader(InputStreamReader(System.`in`))) {
N = readLine().toInt() // 목판의 크기 N (2 ≤ N ≤ 10)
COMMAND = readLine() // 로봇팔의 움직임
}

private fun solve() {
var x = 0
var y = 0

COMMAND.forEach { direction ->
var currentX = x
var currentY = y

when (direction) {
UP -> {
currentX--
if (currentX < 0) {
return@forEach
}
vertical[currentX][currentY] = true
vertical[x][y] = true
x = currentX
}
DOWN -> {
currentX++
if (currentX >= N) {
return@forEach
}
vertical[currentX][currentY] = true
vertical[x][y] = true
x = currentX
}
LEFT -> {
currentY--
if (currentY < 0) {
return@forEach
}
horizontal[currentX][currentY] = true
horizontal[x][y] = true
y = currentY
}
RIGHT -> {
currentY++
if (currentY >= N) {
return@forEach
}
horizontal[currentX][currentY] = true
horizontal[x][y] = true
y = currentY
}
}
}

for (i in 0 until N) {
for (j in 0 until N) {
if (vertical[i][j] && horizontal[i][j]) {
print('+')
} else {
if (vertical[i][j]) print('|')
else if (horizontal[i][j]) print('-')
else print('.')
}
}
println()
}
}

Point of Thinking

  • 단순 구현 문제이다.
  • 수직 수평에 따른 BooleanArray를 각각 만들어놓고, 주어진 명령에 따라 체크 한뒤 최종 출력때 AND연산으로 출력하면 Accepted.