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

백준 1730 판화 (JAVA 자바 풀이)

by Renechoi 2023. 6. 9.

백준 1730 판화 (JAVA 자바 풀이)

 


 

 

 


 

 

 

💡 코드 구현

 


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	private static final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

	public static void main(String[] args) throws IOException {
		int N = Integer.parseInt(bufferedReader.readLine());

		char[][] map = new char[N][N];
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				map[i][j] = 46;
			}
		}

		char[] movements = bufferedReader.readLine().toCharArray();
		currentPosition currentPosition = new currentPosition(N);
		for (char movement : movements) {

			currentPosition.move(movement, map);
		}

		StringBuilder stringBuilder = new StringBuilder();
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				stringBuilder.append(map[i][j]);
			}
			stringBuilder.append("\n");
		}

		System.out.println(stringBuilder);
	}

	static class currentPosition {
		int x;
		int y;
		int limit;

		final char up = 124;
		final char down = 124;
		final char left = 45;
		final char right = 45;
		final char dual = 43;
		final char untouched = 46;

		public currentPosition(int limit) {
			this.limit = limit - 1;
		}

		public void move(char movement, char[][] map) {
			if (isOutOfLine(movement)) {
				return;
			}
			if (movement == 'D') {
				mark(down, map);
				moveDown();
				mark(down, map);
			}

			if (movement == 'U') {
				mark(up, map);
				moveUp();
				mark(up, map);
			}

			if (movement == 'L') {
				mark(left, map);
				moveLeft();
				mark(left, map);
			}

			if (movement == 'R') {
				mark(right, map);
				moveRight();
				mark(right, map);
			}

		}

		private boolean isOutOfLine(char movement) {
			if (movement == 'D' && this.y == limit) {
				return true;
			}

			if (movement == 'U' && this.y == 0) {
				return true;
			}

			if (movement == 'L' && this.x == 0) {
				return true;
			}

			if (movement == 'R' && this.x == limit) {
				return true;
			}

			return false;
		}

		public void moveLeft() {
			this.x -= 1;
			if (x < 0) {
				this.x += 1;
			}
		}

		public void moveRight() {
			this.x += 1;
			if (x > limit) {
				this.x -= 1;
			}
		}

		public void moveUp() {
			this.y -= 1;
			if (y < 0) {
				this.y += 1;
			}
		}

		public void moveDown() {
			this.y += 1;
			if (y > limit) {
				this.y -= 1;
			}
		}

		public void mark(int mark, char[][] map) {

			if (map[y][x] == untouched) {
				map[y][x] = (char)mark;
				return;
			}

			if (map[y][x] == up) {
				if (mark == up) {
					return;
				} else {
					map[y][x] = dual;
				}
			}
			if (map[y][x] == right) {
				if (mark == right) {
					return;
				} else {
					map[y][x] = dual;
				}
			}

		}

		@Override
		public String toString() {
			return String.format("%d, %d", x, y);
		}

	}
}

 

 

 

시뮬레이션을 구현해주었다.

 

개인적으로 방향 시뮬레이션이 있는 문제의 경우 이처럼 객체를 만들어 사용하면 풀이가 좀 더 수월해진다. 

 

 

시간복잡도는 배열을 입력하고 출력하는 부분에서 O(N^2)인데 N은 10이므로 사실상 무시해도 될만큼 적다고 봐도 될듯 하다.

 

 

 

 

 

 

 

 

반응형