본문 바로가기
자바 알고리즘/백준

백준 1730 : 판화 (구현)

by hoshi03 2024. 12. 16.

문제

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