백준 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이므로 사실상 무시해도 될만큼 적다고 봐도 될듯 하다.
반응형
'알고리즘 > 백준' 카테고리의 다른 글
백준 2817 ALPS식 투표 (JAVA 자바 풀이) (1) | 2023.06.24 |
---|---|
백준 2840 행운의 바퀴 (JAVA 자바 풀이) (0) | 2023.06.24 |
백준 11068 회문인 수 (JAVA 자바 풀이) (0) | 2023.06.09 |
백준 11005 진법 변환 2 (JAVA 자바 풀이) (0) | 2023.06.09 |
백준 10448 소인수 분해 (JAVA 자바 풀이) (0) | 2023.06.08 |