[프로그래머스] 캐릭터의 좌표 – JAVA

프로그래머스 “캐릭터의 좌표” 문제 해결과정입니다.

캐릭터의 좌표

문제 설명

머쓱이는 RPG게임을 하고 있습니다. 게임에는 up, down, left, right 방향키가 있으며 각 키를 누르면 위, 아래, 왼쪽, 오른쪽으로 한 칸씩 이동합니다. 예를 들어 [0,0]에서 up을 누른다면 캐릭터의 좌표는 [0, 1], down을 누른다면 [0, -1], left를 누른다면 [-1, 0], right를 누른다면 [1, 0]입니다. 머쓱이가 입력한 방향키의 배열 keyinput와 맵의 크기 board이 매개변수로 주어집니다. 캐릭터는 항상 [0,0]에서 시작할 때 키 입력이 모두 끝난 뒤에 캐릭터의 좌표 [x, y]를 return하도록 solution 함수를 완성해주세요.

  • [0, 0]은 board의 정 중앙에 위치합니다. 예를 들어 board의 가로 크기가 9라면 캐릭터는 왼쪽으로 최대 [-4, 0]까지 오른쪽으로 최대 [4, 0]까지 이동할 수 있습니다.

제한 사항

  • board은 [가로 크기, 세로 크기] 형태로 주어집니다.
  • board의 가로 크기와 세로 크기는 홀수입니다.
  • board의 크기를 벗어난 방향키 입력은 무시합니다.
  • 0 ≤ keyinput의 길이 ≤ 50
  • 1 ≤ board[0] ≤ 99
  • 1 ≤ board[1] ≤ 99
  • keyinput은 항상 up, down, left, right만 주어집니다.

입출력 예

keyinputboardresult
[“left”, “right”, “up”, “right”, “right”][11, 11][2, 1]
[“down”, “down”, “down”, “down”, “down”][7, 9][0, -4]

문제 해결과정

본인은 프로그래머스에서 코드를 작성하기에 어려움을 느껴 먼저 이클립스에서 코드를 실행하고 확인 후 프로그래머스 웹 텍스트 에디터로 옮기는 작업을 했다. 이클립스에서 클래스 파일을 생성하고 main에서 실행하여 확인하였다.

이클립스 코드

package Practice;
// 캐릭터 좌표
import java.util.Arrays;

public class practice4 {
	public static void main(String[] args) {
	    int[] answer = {0, 0};
	    String[] keyinput = {"down", "down", "down", "down", "down"};
	    int[] board = {7, 9};
	    
        int left = -(board[0] / 2);
        int right = board[0] / 2; // 4
        int up = board[1] / 2;
        int down = -(board[1] / 2);
        
	    int x = 0; 
        int y = 0;
        
        for(String s : keyinput){
            if(s == "left"){
                x--;
                if(x < left) x = left; 
            }else if(s == "right"){
                x++;
                if(x > right) x = right; 
            }else if(s == "up"){
                y++;
                if(y > up) y = up; 
            }else if(s == "down"){
                y--;	
                if(y < down) y = down;
                System.out.println(y);
                System.out.println("down : " + down);
            }
            
        }
        System.out.println("7(board[0]) / 2 : " + (board[0]) / 2);
        System.out.println("9(board[1]) / 2 : " + (board[1]) / 2);
        System.out.println("7(board[1]) / 2 : " + (-1 * board[0]) / 2);
        System.out.println("9(board[1]) / 2 : " + (-1 * board[1]) / 2);
        System.out.println("y: " + y);
       
        
        System.out.println(x);
        System.out.println(y);
        answer[0] = x;
        answer[1] = y;
        System.out.println(Arrays.toString(answer));
	    }
	}

먼저 주어진 변수들을 선언했다. 처음에는 answer에 {0, 0}, x와 y를 선언해서 keyinput에 들어있는 것을 for문으로 끝까지 반복시키고 각 조건마다 증감시킨 뒤에 각 좌표마다의 최대치를 넘었으면 좌표 최대치로 변환해주어 x와 y를 answer에 넣는 코드를 작성했었다. 하지만 프로그래머스에서 동작시키니 8번 예시에서 실패했다… 실패한 이유를 알기 위해 찾아보니 본인과 똑같은 상황의 사람이 쓴 글을 발견하여 알아냈다. 여기에 등장하는 반례는 아래와 같았다.

입력값board기댓값
[“right”, “right”, “right”, “right”, “right”, “left”][9, 5][3, 0]

위에 조건에 “board의 크기를 벗어난 방향키 입력은 무시합니다.” 라는 조건이 있다. 이 말은 만약 최대 x좌표가 5이고 캐릭터의 x좌표가 5인 상태에서 6으로 넘어가는 키입력을 받게 된다면 그 입력은 무시한다는 말이었다… 이 조건이 없었다면 위 표대로 진행하면 1 -> 2 -> 3 -> 4 -> 5 -> 4로 x좌표가 3이 아닌 4가 나와야 한다. 하지만 9가 전체 x좌표의 길이 이므로 [-4, 4]의 제한이 있다. 따라서 4에서 5로 넘어가는 키입력은 받지 않아서 5가 되지않고 4 그래도 유지, 후에 “left” 입력을 받아 x좌표는 3이 된다. 이 조건 때문에 미리 각 좌표의 최댓값을 선언해서 for문 안에 넣어주었다… 이후로 프로그래머스로 옮겨주었다.

프로그래머스 코드

import java.util.*;

class Solution {
    public int[] solution(String[] keyinput, int[] board) {
        int[] answer = new int[2];
        
        int left = -(board[0] / 2);
        int right = board[0] / 2; // 4
        int up = board[1] / 2;
        int down = -(board[1] / 2);
        
        for(String s : keyinput){
        if(s.equals("left")){
            answer[0]--; 
            if(answer[0] < left) answer[0] = left; 
        }else if(s.equals("right")){
            answer[0]++;
            if(answer[0] > right) answer[0] = right; 
        }else if(s.equals("up")){
            answer[1]++;
            if(answer[1] > up) answer[1] = up; 
        }else if(s.equals("down")){
            answer[1]--;	
            if(answer[1] < down) answer[1] = down;
        }
    }
        
    return answer;
    }
}

프로그래머스에서는 이클립스에서 변수들을 확인하기 위해 썼던 print문을 정리하고, x좌표와 y좌표를 없애고 바로 answer에서 배열안의 값들이 증감하도록 변경하였다. 또한 answer의 형태를 새로운 정수 배열 선언으로 바꿔주고, 이클립스에서는 if조건문에 “s == “left”” 을 써도 잘 동작했는데 프로그래머스에서는 인식이 되지않아 “equals” 메소드를 사용하여 “s.equals(“left”)”으로 다 바꿔주었다. 조금 지저분했던 코드가 그나마 깔끔해 보인다..

참고 – https://school.programmers.co.kr/questions/78745

최신글

댓글 남기기

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.