C#

[프로그래머스 힌트/답/해석] 캐릭터의 좌표

Guk-blog 2024. 1. 30. 15:09
728x90
반응형

힌트

더보기

- right = [1,0] , left[-1,0], up = [0,1], down[0,-1]

- 플레이어의 위치가 board의 범위에 초과하면 더이상 계산하지 않는다

-board의 범위는 각각 /2를 해주면 된다(board의 범위는 홀수이다)

예시) board[7,5] 는 x축으로 -3~+3, y축으로 -2~+2

정답

더보기
public static int[] Solution63(string[] keyInput, int[] board)
{
    var boardRange = board.Select(x=> x/2);
    int[] playerPos2D = new int[2];
    foreach(var key in keyInput){
        int[] keyValue = MovePosition(key);
        playerPos2D[0] += keyValue[0];
        playerPos2D[1] += keyValue[1];

        if(playerPos2D[0]> boardRange.First()){
            playerPos2D[0]= boardRange.First();
        }else if(playerPos2D[0]< -boardRange.First()){
            playerPos2D[0] = -boardRange.First();
        }

        if(playerPos2D[1]> boardRange.Last()){
            playerPos2D[1]= boardRange.Last();
        }else if(playerPos2D[1]< -boardRange.Last()){
            playerPos2D[1] = -boardRange.Last();
        }
    }
    return playerPos2D;
}

static int[] MovePosition(string keyStr){
    switch(keyStr){
        case "left":
        return new int[]{-1,0};
        case "right":
        return new int[]{1,0};
        case "up":
        return new int[]{0,1};
        case "down":
        return new int[]{0,-1};
    }
    return new int[]{0,0};
}

해석

더보기
var boardRange = board.Select(x=> x/2);

 board의 범위를 수정해서 담은 Ienumerable<int>

int[] keyValue = MovePosition(key);

 foreach문으로 keyInput의 개수만큼 MovePosition(key)를 통해 int[] 배열을 담는다

switch(keyStr){
                case "left":
                return new int[]{-1,0};
                case "right":
                return new int[]{1,0};
                case "up":
                return new int[]{0,1};
                case "down":
                return new int[]{0,-1};
            }
            return new int[]{0,0};

 key 값에 따른 int[] 배열을 리턴해준다

playerPos2D[0] += keyValue[0];
playerPos2D[1] += keyValue[1];

 할당받은 배열을 플레이어의 위치에 더해준다

if(playerPos2D[0]> boardRange.First()){
                    playerPos2D[0]= boardRange.First();
                }else if(playerPos2D[0]< -boardRange.First()){
                    playerPos2D[0] = -boardRange.First();
                }

플레이어의  X축의 위치가 board를 초과하면 수정해준다

if(playerPos2D[1]> boardRange.Last()){
                    playerPos2D[1]= boardRange.Last();
                }else if(playerPos2D[1]< -boardRange.Last()){
                    playerPos2D[1] = -boardRange.Last();
                }

 플레이어의 Y축 위치가 board를 초과하면 수정해준다

 

728x90
반응형