programmers

[Programmers Level 0] 캐릭터의 좌표 Javascript

냠냠맨 2022. 12. 2. 22:34

문제정보

 

 

쉽게 풀 수 있을 것 같았는데 조금 애먹은 문제입니다.그냥 냅다 좌표를 움직여주면 끝~ 이라면 if문만으로 처리할 수 있는데맵크기를 제한시켜버리니까 곤란해지네요

 

 


 

예시

 

keyinput	                                   board	        result
["left", "right", "up", "right", "right"]	[11, 11]	        [2, 1]
["down", "down", "down", "down", "down"]	[7, 9]	                [0, -4]

 

 

 


 

나의풀이

 

function solution(keyinput, board) {
    let row = 0
    let column = 0
    for(i=0 ; i < keyinput.length ; i++) {
        if(keyinput[i] == "left" && Math.abs(row) <= Math.floor(board[0] / 2) ) row = row -1  
        if(keyinput[i] == "right" && Math.abs(row) <= Math.floor(board[0] / 2)) row = row +1
        if(keyinput[i] == "up" && Math.abs(column) <= Math.floor(board[1] / 2)) column = column + 1
        if(keyinput[i] == "down" && Math.abs(column) <= Math.floor(board[1] / 2)) column = column - 1
    }

    return [row,column]
}

 

처음 생각해낸 풀이입니다.

if문으로 좌표를 더해주고 맵크기보다 더 많이 나가지 못하도록 제한시켜줬습니다.근데 이렇게 푸니까 8번 케이스가 통과가 안됐습니다.맵의 한쪽 끝을 찍은 다음엔 연산을 멈춰버리기때문에 왼쪽 끝을 찍은 다음 마지막에 오른쪽칸으로 이동시키면오른쪽칸으로 이동을 해야하는데 그대로 멈춰있는 문제가 있었습니다.

 

function solution(keyinput, board) {
    let row = 0
    let column = 0
    for(i=0 ; i < keyinput.length ; i++) {
        if(keyinput[i] == "left") row = row - 1
        if(keyinput[i] == "right") row = row + 1
        if(row > Math.floor(board[0] / 2)) row = Math.floor(board[0] / 2)
        if(row < -Math.floor(board[0] / 2)) row = -Math.floor(board[0] / 2)
        
        if(keyinput[i] == "down") column = column - 1
        if(keyinput[i] == "up") column = column + 1
        if(column > Math.floor(board[1] / 2)) column = Math.floor(board[1] / 2)
        if(column < -Math.floor(board[1] / 2)) column = -Math.floor(board[1] / 2)
    }

    return [row,column]
}

 

냅다 if문 떡칠해서 풀어버림

if문의 수가 많으면 switch문이 더 좋다고 하는데

switch문으로 구현하려고하니까 아무래도 좀 손에 안익더라고요..

switch문을 좀 더 공부해봐야할듯..

 

일단 구현하는것에 우선순위를 두고 짜봤습니다.

 

 


 

다른사람의 풀이

 

function solution(keyinput, board) {
    let res = [0,0];
    for (let p of keyinput) {
        switch(p){
            case 'left': if (-res[0] < board[0]/2-1) res[0]--; break;
            case 'right': if (res[0] < board[0]/2-1) res[0]++; break;
            case 'up': if (res[1] < board[1]/2-1) res[1]++; break;
            case 'down': if (-res[1] < board[1]/2-1) res[1]--; break;
        }
    }
    return res;
}

 

 

제가 하고싶었던 switch네요.. 

 

반응형