본문 바로가기
자료구조&알고리즘/구현

[이.코.테] Chapter 04 구현 - 상하좌우 (Java)

by _din 2021. 4. 10.

상하좌우 문제 (교재 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();
    }

}
반응형

댓글