문제
W대학교 미술대학 조소과에서는 지루한 목판화 작업을 하는 학생들을 돕기 위해 판화 기계를 제작하였다.
기계는 로봇 팔이 쥔 조각도를 상하좌우 네 방향으로 움직일 수 있는 구조로서, 조각도 아래에 목판을 놓으면 그 위에 선들을 자동으로 그어주는 기능을 가지고 있다.
목판에는 N2개의 점들이 일정한 간격으로 N행 N열의 격자모양을 이루며 찍혀있다. 처음 로봇의 조각도를 올려놓는 위치는 항상 이 점들 중 맨 왼쪽 맨 위의 꼭짓점이다.
로봇 팔을 움직이는 명령의 순서가 주어졌을 때, 목판 위에 패인 조각도의 혼적을 출력하는 프로그램을 작성하시오.
판화 기계는 작동 도중 로봇 팔이 격자 바깥으로 나가도록 하는 움직임 명령을 만나면, 무시하고 그 다음 명령을 진행한다.
입력
첫째 줄에 목판의 크기 N (2 ≤ N ≤ 10)이 주어진다. 행 열의 점들이 찍혀 있다는 의미이다. 둘째 줄에 로봇팔의 움직임이 한 줄로 공백 없이 입력된다. 위쪽으로 이동은 'U', 아래쪽으로 이동은 'D', 왼쪽으로 이동은 'L', 오른쪽으로 이동은 'R'로 표시된다. 로봇팔의 움직임을 나타내는 이 문자열의 길이는 최대 250이다.
출력
로봇팔이 지나지 않은 점은 '.'으로, 로봇팔이 수직 방향으로만 지난 점은 '|'으로, 로봇팔이 수평 방향으로만 지난 점은 '-'으로, 수직과 수평 방향 모두로 지난 점은 '+'로 표기하도록 한다. 네 문자의 ASCII 코드는 각각 46, 124, 45, 43이다.
예제 입력 1 복사
5
DRDRRUU
예제 출력 1 복사
|..|.
++.|.
.+-+.
.....
.....
예제 입력 2 복사
4
RRRDDDDULL
예제 출력 2 복사
---+
...|
.--+
...|
예제 입력 3 복사
5
RRDDLLUURRDDLLUUR
예제 출력 3 복사
+-+..
|.|..
+-+..
.....
.....
• 풀이
dydx로 n*n 크기 배열 안벗어나게 돌면 되는 문젠데..
예제 3번이 자꾸 안나와서 bool 배열 두개에 가로/세로 입력을 지나가면 true로 바꾸니까 됬다
로직은 똑같은거 같은데 문자열 업데이트 하는 방식으로 예제3번이 안돌아갔고
bool 배열 두개로 바꾸니 돌아가서 왜 이런지 이해할 수가 없다..
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String s = br.readLine();
boolean[][] passVertical = new boolean[n][n];
boolean[][] passHorizontal = new boolean[n][n];
int dy = 0;
int dx = 0;
for (int i = 0; i < s.length(); i++){
char tmp = s.charAt(i);
if (tmp == 'U'){
if (dy - 1 >= 0){
passVertical[dy][dx] = true;
dy -= 1;
passVertical[dy][dx] = true;
}
}
else if (tmp == 'D'){
if (dy + 1 < n){
passVertical[dy][dx] = true;
dy += 1;
passVertical[dy][dx] = true;
}
}
else if (tmp == 'L'){
if (dx - 1 >= 0){
passHorizontal[dy][dx] = true;
dx -= 1;
passHorizontal[dy][dx] = true;
}
}
else if (tmp == 'R'){
if (dx + 1 < n){
passHorizontal[dy][dx] = true;
dx += 1;
passHorizontal[dy][dx] = true;
}
}
}
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
if (passVertical[i][j] && passHorizontal[i][j]) System.out.print('+');
else if (passVertical[i][j]) System.out.print('|');
else if (passHorizontal[i][j]) System.out.print('-');
else System.out.print('.');
}
System.out.println();
}
}
}
'자바 알고리즘 > 백준' 카테고리의 다른 글
백준 18870 : 좌표압축 (TreeMap) (1) | 2024.12.19 |
---|---|
백준 3085 사탕게임 (0) | 2024.12.15 |
11068 : 회문인 수 (1) | 2024.12.15 |
백준 2108 : 통계학(구현?) (0) | 2024.11.19 |
백준 18110 ( 구현, 정렬, 소수점 처리) (0) | 2024.11.18 |