상하좌우 문제 (교재 110p)
난이도 ●○○ | 풀이 시간 15분 | 시간 제한 1초 | 메모리 제한 128MB
문제
아래와 같은 계획서가 주어졌을 때 여행가 A가 최종적으로 도착할 지점의 좌표를 출력하는 프로그램을 작성하시오.
- L : 왼쪽으로 한 칸 이동
- R : 오른쪽으로 한 칸 이동
- U : 위로 한 칸 이동
- D : 아래로 한 칸 이동
가장 왼쪽 위 좌표는 (1,1) 이며, 시작 좌표는 항상 (1,1)이다.
입출력 조건)
입력 조건 | - 첫째 줄에 공간의 크기를 나타내는 N이 주어진다. (1 ≤ N ≤ 100) - 둘째 줄에 여행가 A가 이동할 계획서 내용이 주어진다. (1 ≤ 이동 횟수 ≤ 100) |
출력 조건 | 첫째 줄에 여행가 A가 최종적으로 도착할 지점의 좌표 (X,Y)를 공백으로 구분하여 출력한다. |
입출력 예시)
입력 예시 | 출력 예시 |
5 R R R U D D |
3 4 |
문제 풀이 방법
- 이동 횟수가 N번인 경우 시간 복잡도는 O(N)
- 따라서, 이 문제의 시간 복잡도는 매우 넉넉한 편이다.
- dx, dy 1차원 배열을 각각 선언하여 방향 설정
- L,R,U,D를 갖고있는 String 배열을 선언
- 그에 따른 이동 방향 설정하기
- 현재 x y좌표, 나중 x y좌표를 선언
- 이중 for문을 선언하여
바깥 for문에는 입력받은 이동방향을 element에 저장하고
안쪽 for문에서는 LRUD에 따른 방향 처리를 해준다. - 주의할점.
- 공간을 벗어나는 경우를 처리해야함
- 그 후에, 이동 수행
- dx, dy, move_types의 각 index의 값을 올바르게 설정
예를 들어, 입력받은 방향이 L일 때 안쪽 for문의 index가 왼쪽으로 옮기도록
move_types의 0번째 값, dx의 0번째 값, dy의 0번째 값을 올바르게 설정
- 공간을 벗어나는 경우를 처리해야함
실수한 점 & 부족한 점
- 책과 달리 LRUD 배열을 따로 선언하지 않고, Swith문에 바로 문자 선언을 하였던 점
- 공간을 벗어나는 경우를 한 줄로 표시하지 않고, Switch문 각각에서 이미 이동한 뒤에 처리해 주었던 점
- 책에서는 아래와 같이 1차원 배열로 x방향 y방향 나누어 선언하였고,
public static int[] dx = {-1, 0, 1, 0}; // 북, 동, 남, 서
public static int[] dy = {0, 1, 0, -1};
나는 아래와 같이 2차원 배열의 방향으로 작성하여 코드가 가독성이 떨어지고 복잡하였다.
public static int[][] dir = {{-1,0},{0,1},{1,0},{0,-1}}; // 북동남서
소스 코드
package exam04_implementation;
import java.io.*;
import java.util.StringTokenizer;
public class Q1_UDLR {
static int[] dx = {0, 0, -1, 1}; // L, R, U, D
static int[] dy = {-1, 1, 0, 0};
static String[] move_types = {"L", "R", "U", "D"};
public static int[] solution(String[] plan, int n) {
int curX = 1;
int curY = 1;
int nx = 0;
int ny = 0;
for (int i = 0; i < plan.length; i++) {
String element = plan[i];
for(int j=0 ; j<move_types.length ; j++) {
// 이동 후 좌표 구하기
if (element.equals(move_types[j])){
nx = curX + dx[j];
ny = curY + dy[j];
}
// 공간을 벗어나는 경우 무시
if(nx < 1 || ny < 1 || nx > n || ny > n)
continue;
// 이동 수행
curX = nx;
curY = ny;
}
}
int[] result = {nx, ny};
return result;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine()); // N개 입력
StringTokenizer st = new StringTokenizer(br.readLine());
String[] plan = new String[st.countTokens()]; // 계획
int index = 0;
while (st.countTokens() != 0) {
plan[index] = st.nextToken();
index++;
}
int[] result = solution(plan, n);
System.out.println(result[0] + " " + result[1]);
br.close();
bw.close();
}
}
내가 풀었던 방법...
package exam04_implementation;
import java.io.*;
import java.util.StringTokenizer;
public class Q1_UDLR_self {
static int[][] dir = {{-1,0},{1,0},{0,-1},{0,1}};
public static int[] solution(String[] plan, int n){
int[] cur = {1, 1};
for(int i=0 ; i< plan.length ; i++) {
String element = plan[i];
switch (element) {
case "U":
cur[0] += dir[0][0];
if(cur[0] < 1)
cur[0] -= dir[0][0];
break;
case "D":
cur[0] += dir[1][0];
if(cur[0] > n)
cur[0] -= dir[1][0];
break;
case "L":
cur[1] += dir[2][1];
if(cur[1] < 1)
cur[1] -= dir[2][1];
break;
case "R":
cur[1] += dir[3][1];
if(cur[1] > n)
cur[1] -= dir[3][1];
break;
}
}
return cur;
}
public static void main (String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine()); // N개 입력
StringTokenizer st = new StringTokenizer(br.readLine());
String[] plan = new String[st.countTokens()]; // 계획
int index = 0;
while(st.countTokens() != 0){
plan[index] = st.nextToken();
index ++;
}
int[] result = solution(plan,n);
System.out.println(result[0]+" "+result[1]);
br.close();
bw.close();
}
}
반응형
'자료구조&알고리즘 > 구현' 카테고리의 다른 글
[이.코.테] Chapter 04 구현 - 게임 개발 (Java) (0) | 2021.04.10 |
---|---|
[이.코.테] Chapter 04 구현 - 왕실의 나이트 (Java) (0) | 2021.04.10 |
[이.코.테] Chapter 04 구현 - 시각 (Java) (0) | 2021.04.10 |
구현 (0) | 2021.04.10 |
댓글