문제
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 복사
+-+..
|.|..
+-+..
.....
.....
백준 1730번 문제는 시뮬레이션 문제 인데요.
탐색 관련 문제 입니다.
입력은 첫번째 줄에 판화의 크기인 N의 정수를 입력을 받고
다음줄에 로봇의 명령이 들어 있는 문자열 하나가 주어 집니다.
이 문제 풀이는 주어진 명령어가 D이면 아래쪽으로 이동하고 "|"를 출력하고
U이면 윗쪽으로 이동하고 "|"을 출력하고
R이면 오른쪽으로 이동하고 "-"를 출력하고
L이면 왼쪽으로 이동하고 "-"를 출력을 하고
수직이나 수평방향 모두 움직인 곳은 "+"로 출력을 합는 문제 입니다.
import java.io.*;
import java.util.*;
public class Main {
// 전역 변수로 사용할 변수를 먼저 선언을 합니다.
static int N; // 판화의 칸수를 입력 받을 변수
static String command; // 명령어를 입력 받을 변수
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static boolean[][] horizontal; // 수평으로 움직인 이력을 기록할 배열
static boolean[][] vertical; //수직으로 움직인 이력을 기록할 배열
String ans= ""; //출력에 이용할 문자열 변수
public static void main(String[] args) throws IOException {
//우선 변수를 입력을 받습니다.
N = Integer.parseInt(br.readLine());
horizontal = new boolean[N][N];
vertical = new boolean[N][N];
command = br.readLine();
//로놋팔 대로 움직이기 위한 맨 왼쪽 맨 위를 표현해기 위해 current Row와 current column을 선언 합니다.
int curR =0;
int curC =0;
for(int i =0; i< command.length(); i++) { //입력된 명령어 문자길이 만큼 반복
char cmd = command.charAt(i); // 입력된 명령을 하나씩 보기 위해 char변수 선언 및 입력
if(cmd == 'D') { //D인 경우 아래로 이동을 하면서 이동을 vetical 배열에 true로 기록
if(curR == N -1) continue; // 현재 row가 N-1이면 아래 명령어 skip
vertical[curR][curC] = true; // curR이 N 사이즈의 목판 안에 있는 경우 이동 경로 기록
vertical[curR+1][curC] = true;
curR++; // 기록 후 CURRENT ROW값을 증가
}
else if(cmd == 'U') { // 입력된 명령어가 U인 경우,,, 나머지는 D인 경우와 동일
if(curR ==0) continue;
vertical[curR][curC] = true;
vertical[curR -1][curC] = true;
curR--;
}
else if(command.charAt(i) == 'L') { //왼쪽인 경우
if(curC == 0) continue;
horizontal[curR][curC] = true;
horizontal[curR][curC -1] = true;
curC--;
}
else { //오른쪽 이동
if(curC == N-1) continue;
horizontal[curR][curC] = true;
horizontal[curR][curC+1] = true;
curC++;
}
}
for(int i =0; i <N; i++) { //출력할 부분
String ans= ""; // 출력할 문자열인 ANS를 공백으로 정의 및 초기화
for(int j =0; j <N; j++) {
if(vertical[i][j] && horizontal[i][j]) ans +="+"; // 수평, 수직 모두 True인 경우 "+" 추가
else if(vertical[i][j]) ans += "|"; // 수직만 움직인 경우 ans에 "|" 추가
else if(horizontal[i][j]) ans +="-"; // 수평인 경우 "-"를 ans에 추가
else {
ans += "."; // 이동 이력이 없으면 ".'을 ans에 추가
}
}
System.out.println(ans); // 한라인씩 출력.
}
}
}
'알고리즘' 카테고리의 다른 글
[알고리즘] 백준 13223 자바 문제 풀이 (96) | 2025.02.12 |
---|---|
[알고리즘] 백준 2744 대소문자 문자 바꾸기 문제 풀이 (73) | 2025.02.11 |
[알고리즘] 백준 2840 행운의 바퀴 JAVA 문제 풀이 (45) | 2024.08.13 |
[알고리즘] ACM 호텔 백준 10250 JAVA 문제 풀이 (30) | 2024.08.11 |