프로그래머스 캐릭터의 좌표

KIMYEONGJUN·7일 전
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

머쓱이는 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]까지 이동할 수 있습니다.

내가 이 문제를 보고 생각해본 부분

main 메서드
두 가지 입출력 예시 데이터를 직접 생성하고 solution 메서드를 호출하여 결과를 확인하는 역할을 한다.
실행 결과를 콘솔에 출력하여 테스트를 쉽게 도와준다.
solution 메서드
방향키 배열(keyinput)과 맵의 크기(board)를 매개변수로 받아 캐릭터의 최종 좌표를 계산한다.
시작 좌표 초기화
캐릭터는 항상 정중앙인 [0, 0]에서 시작하므로 x와 y 변수를 모두 0으로 설정한다.
최대 이동 범위 계산
맵의 크기(board)를 2로 나누어 캐릭터가 이동할 수 있는 최대 경계값인 maxX와 maxY를 구한다.
방향키 이동 및 경계 검사
for 문으로 입력받은 키들을 하나씩 순회하며 switch 문을 통해 방향별로 좌표를 증감시킨다.
이동할 때 조건문을 사용하여 맵의 최대 경계를 벗어나지 않는 경우에만 좌표를 변경한다. 범위를 벗어나는 입력은 무시된다.
결과 반환
모든 키 입력 처리가 끝난 최종 x, y 좌표를 새로운 배열에 담아 반환한다.

코드로 구현

class Solution {
    public int[] solution(String[] keyinput, int[] board) {
        int x = 0;
        int y = 0;
        
        int maxX = board[0] / 2;
        int maxY = board[1] / 2;
        
        for (String key : keyinput) {
            switch (key) {
                case "up":
                    if (y < maxY) {
                        y++;
                    }
                    break;
                case "down":
                    if (y > -maxY) {
                        y--;
                    }
                    break;
                case "left":
                    if (x > -maxX) {
                        x--;
                    }
                    break;
                case "right":
                    if (x < maxX) {
                        x++;
                    }
                    break;
            }
        }
        
        return new int[] {x, y};
    }
}

프로그래머스 코드

package programmers.programmers2;

// 프로그래머스 캐릭터의 좌표
public class Main161 {
    public static void main(String[] args) {
        Main161 main = new Main161();

        String[] keyinput1 = {"left", "right", "up", "right", "right"};
        int[] board1 = {11, 11};
        int[] result1 = main.solution(keyinput1, board1);
        System.out.println("[" + result1[0] + ", " + result1[1] + "]");

        String[] keyinput2 = {"down", "down", "down", "down", "down"};
        int[] board2 = {7, 9};
        int[] result2 = main.solution(keyinput2, board2);
        System.out.println("[" + result2[0] + ", " + result2[1] + "]");
    }

    public int[] solution(String[] keyinput, int[] board) {
        int x = 0;
        int y = 0;

        int maxX = board[0] / 2;
        int maxY = board[1] / 2;

        for (String key : keyinput) {
            switch (key) {
                case "up":
                    if (y < maxY) {
                        y++;
                    }
                    break;
                case "down":
                    if (y > -maxY) {
                        y--;
                    }
                    break;
                case "left":
                    if (x > -maxX) {
                        x--;
                    }
                    break;
                case "right":
                    if (x < maxX) {
                        x++;
                    }
                    break;
            }
        }

        return new int[] {x, y};
    }
}

위에 있는 코드를 변경한 코드

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글