문제
https://www.acmicpc.net/problem/1347
풀이(40분)
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int l = Integer.parseInt(br.readLine());
Character[][] arr = new Character[100][100]; // 최초 배열 초기화
// null 값 사용을 위한 Character 배열
int row = 49; // 초기 시작 위치
int col = 49; // ''
int maxRow = row; // 배열을 자르기 위한 정보
int maxCol = col; // ''
int minRow = row; // ''
int minCol = col; // ;;
int[][] direction = {{-1, 0}, {0,1}, {1,0},{0, -1}}; // 북 동 남 서
int nowDirection = 2; // 현재의 방향으로 초기 남쪽을 가르킴
arr[row][col] = '.'; // 시작점 체크
String map = br.readLine();
for(int i = 0; i < l; i++){
char point = map.charAt(i);
nowDirection = directionChange(nowDirection, point); // 방향 결정
if (point == 'F') { // 이동하는 것이라면
row += direction[nowDirection][0]; // 좌표 변경
col += direction[nowDirection][1]; // ''
maxRow = Math.max(row, maxRow); // 배열을 자르기 위한 정보 수정
minRow = Math.min(row, minRow); // ''
maxCol = Math.max(col, maxCol); // ''
minCol = Math.min(col, minCol); // ''
arr[row][col] = '.'; // 좌표 체크
}
}
StringBuilder sb = new StringBuilder();
for(int i = minRow; i <= maxRow; i++){ // 배열을 잘라 사용
for(int j = minCol; j <= maxCol; j++){ // ;;
if(arr[i][j] != null){ // null 값이라면 #으로 표시
sb.append(arr[i][j]);
}else{
sb.append('#');
}
}
sb.append("\n");
}
System.out.println(sb);
}
public static int directionChange(int direction, char point){ // 방향을 결정해주는 메서드
switch(point){
case 'L': // 왼쪽으로 회전하는 경우
if(direction == 0){
return 3;
}
return direction - 1;
case 'R': // 오른쪽으로 회전하는 경우
if(direction == 3){
return 0;
}
return direction + 1;
}
return direction;
}
}
문제를 시작할 때 방향 전환 등에 대해서는 이미 많은 경험을 통해 어렵지 않다고 생각했다.
하지만, 출력을 어떻게 해주어야 하는 것인지가 고민되었다.
-> 문제 조건을 정확히 파악하는 것을 우선으로 하자.
고민이 될 때는 머릿속으로만 하는 것이 아닌 문제를 여러 번 꼼꼼하게 읽고자 했었고, 풀이를 어렵지 않게 찾아낼 수 있었다.
-> 구현 실력을 길러야겠다. 생각보다 오래걸렸다.
풀이는 단순하다. 문제 조건 자체가 이동하는 정보의 길이가 50을 넘지 않는다고 하였다.
-> 어떤 방향으로 가더라도 100으로 정해둔다면 문제가 없다.
초기 위치와 방향을 설정해 주고, 방향을 전환하는 함수를 따로 만들어준다.
최종적으로 F 가 나오는 경우에만 이동을 하며, 이때 결과를 출력하기 위한 최솟값과 최댓값의 바운더리를 정하는 것까지 하였다.
결과적으로 정해진 바운더리 안에서 배열을 순회하며 값을 출력하면 된다!
'문제 풀이 > 백준' 카테고리의 다른 글
[백준] 2553번. 마지막 팩토리얼 수(JAVA) (0) | 2025.02.03 |
---|---|
[백준] 2210번. 숫자판 점프(JAVA) (1) | 2025.02.02 |
[백준] 1946번. 신입 사원(JAVA) (1) | 2025.02.01 |
[백준] 1850번. 최대공약수(JAVA) (0) | 2025.01.30 |
[백준] 1105번. 팔(JAVA) (0) | 2025.01.25 |