알고리즘

[알고리즘] 백준 1730 판화 java 문제 풀이

트리스탄1234 2024. 8. 14. 16:33
728x90
반응형

문제

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이면 왼쪽으로 이동하고 "-"를 출력을 하고 
 
수직이나 수평방향 모두 움직인 곳은 "+"로 출력을 합는 문제 입니다. 

728x90
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);  // 한라인씩 출력. 
		}
	
	}	
}

 

728x90
반응형