[알고리즘]/이코테

구현 - 상하좌우

broship 2021. 2. 19. 13:58

문제


- 여행가 A는 N X N 크기의 정사각형 공간 위에 서 있습니다. 이 공간은 1 X 1 크기의 정사각형으로 나누어져 있습니다. 가장 왼쪽 위 좌표는(1,1)이며, 가장 오른쪽 아래 좌표는 (N,N)에 해당합니다. 여행가 A는 상하좌우로 이동할 수 있으며, 시작 좌표는 항상 (1,1)입니다. 우리 앞에는 여행가 A가 이동할 계획이 적힌 계획서가 놓여 있습니다.

L - 왼쪽으로 한칸 이동

R - 오른쪽으로 한칸 이동

U -  위로 한 칸 이동

D - 아래로 한칸 이동- 이때 여행가 A가 N X N 크기의 정사각형 공간을 벗어나는 움직임은 무시됩니다. 예를 들어 (1,1)의 위치에서 L혹은 U를 만나면 무시됩니다.

 

입력조건:- 첫째 줄에 공간에 크기를 나타내는 N이 주어집니다.(1<=N<=100)- 둘째 줄에 여행가 A가 이동할 계획서 내용이 주어집니다.(1<=이동횟수<=100)ex)5R R R U D D

 

출력조건:- 첫째줄에 여행가 A가 최종적으로 도착할 지점의 좌표(X,Y)를 공백을 기준으로 구분하여 출력합니다.ex)3 4

 

 

 

문제해결


1) 내 풀이

public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	//n, 계획서 입력받기
	int n = Integer.parseInt(sc.nextLine());
	String plan = sc.nextLine();
	String[] goal = plan.split(" ");

	//방향    		 L   R  U  D
	int[] dx = { 0, 0, -1, 1 };
	int[] dy = { -1, 1, 0, 0 };
	int direction = 0;
	
	//현재 좌표
	int x = 0;
	int y = 0;

	int tmpX = 0;
	int tmpY = 0;
	for (int i = 0; i < goal.length; i++) {
		switch (goal[i]) {
		case "L":
			direction = 0;
			tmpX = x+dx[direction];
			tmpY = y+dy[direction];
			if(tmpX>=0 && tmpX<n && tmpY>=0 && tmpY<n) {
				x = tmpX;
				y = tmpY;
			}
			break;
		case "R":
			direction = 1;
			tmpX = x+dx[direction];
			tmpY = y+dy[direction];
			if(tmpX>=0 && tmpX<n && tmpY>=0 && tmpY<n) {
				x = tmpX;
				y = tmpY;
			}
			break;
		case "U":
			direction = 2;
			tmpX = x+dx[direction];
			tmpY = y+dy[direction];
			if(tmpX>=0 && tmpX<n && tmpY>=0 && tmpY<n) {
				x = tmpX;
				y = tmpY;
			}
			break;
		case "D":
			direction = 3;
			tmpX = x+dx[direction];
			tmpY = y+dy[direction];
			if(tmpX>=0 && tmpX<n && tmpY>=0 && tmpY<n) {
				x = tmpX;
				y = tmpY;
			}
			break;
		}
	}
	//처음 위치가 (1,1)이기 때문에 +1씩
	System.out.print((x+1)+" "+(y+1));
}

 

2) 정답

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    // N을 입력받기
    int n = sc.nextInt();
    sc.nextLine(); // 버퍼 비우기
    String[] plans = sc.nextLine().split(" ");
    int x = 1, y = 1;

    // L, R, U, D에 따른 이동 방향 
    int[] dx = {0, 0, -1, 1};
    int[] dy = {-1, 1, 0, 0};
    char[] moveTypes = {'L', 'R', 'U', 'D'};

    // 이동 계획을 하나씩 확인
    for (int i = 0; i < plans.length; i++) {
        char plan = plans[i].charAt(0);
        // 이동 후 좌표 구하기 
        int nx = -1, ny = -1;
        for (int j = 0; j < 4; j++) {
            if (plan == moveTypes[j]) {
                nx = x + dx[j];
                ny = y + dy[j];
            }
        }
        // 공간을 벗어나는 경우 무시 
        if (nx < 1 || ny < 1 || nx > n || ny > n) continue;
        // 이동 수행 
        x = nx;
        y = ny;
    }
    System.out.println(x + " " + y);
}

 

 

해설


- 시뮬레이션 유형, 완전 탐색 유형이라고도 불리는 구현 문제는 요구사항대로 충실히 구현하기만 하면 되는 문제이다. 딱히 어려운 점은 없었지만 코드가 길어지고, 변수가 많아짐에 따라 지금 맞게 하고 있는건가?... 라는 의구심은 든다....

 

'[알고리즘] > 이코테' 카테고리의 다른 글

구현 - 왕실의 나이트  (0) 2021.02.23
구현 - 시각  (0) 2021.02.20
그리디 - 모험가 길드  (0) 2021.02.18
그리디 - 곱하기 혹은 더하기  (0) 2021.02.17
그리디 - 1이 될때까지  (0) 2021.02.16