알고리즘, CS

[프로그래머스 Lv. 0] 캐릭터의 좌표

차돌박이츄베릅 2023. 8. 4. 09:39

1. 문제

1단계부터 기록하고 있는데,

팀 스터디에서 푼 0단계 문제인데 어려워서 기록

https://school.programmers.co.kr/learn/courses/30/lessons/120861

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

2. 나의 풀이

처음엔 switch문 돌리고 난 뒤에 board길이로 잘라주는 로직이었는데,

case8에서 오류 남. 

그렇게하면 맵의 끝에서 돌아오는게 안되는 이슈가 있다고 한다.

 

그래서 아래 방식으로 case에 if문 추가해줘서 board길이 검증해주도록 변경함

function solution(keyinput, board) {
    let answer = [0, 0];
    let boardMidX = (board[0]-1)/2;
    let boardMidY = (board[1]-1)/2;
    
    keyinput.forEach((key) => {
        switch(key) {
            case "left":
                if (answer[0] > -boardMidX) answer[0] -= 1;
                break;
            case "right":
                if (answer[0] < boardMidX) answer[0] += 1;
                break;
                
            case "up":
                if (answer[1] < boardMidY) answer[1] += 1;
                break;
            case "down":
                if (answer[1] > -boardMidY) answer[1] -= 1;
                break;
        }
    })
    
    return answer;
}

 

 

3. 다른 사람 풀이

프로그래머스의 다른 사람의 풀이를 분석함 && 스터디원 풀이 참고!

 

case 1) switch문 대신 객체 활용하는것도 너무 좋은 듯

const CONTROL = {
    up: [0, 1],
    down: [0, -1],
    left: [-1, 0],
    right: [1, 0],
}

function solution(key, [n, m]) {
    const [x1, x2] = [-(n-1)/2, (n-1)/2];
    const [y1, y2] = [-(m-1)/2, (m-1)/2];
    return key.reduce(([x, y], k) => {
        const [nx, ny] = [x + CONTROL[k][0], y + CONTROL[k][1]];
        if (x1 <= nx && nx <= x2 && y1 <= ny && ny <= y2) return [nx, ny];
        return [x, y];
    }, [0, 0]);
}

 

case2) 객체 이용

function solution(keyinput, board) {
    let key = {"right" : [1,0], "up" : [0,1], "down" : [0,-1], "left" : [-1,0]};


    let rslt = keyinput.map(v => key[v]).reduce((a,b) => { 
        if (Math.abs(a[0] + b[0]) > board[0]/2 || Math.abs(a[1] + b[1]) > board[1]/2) 
            return [a[0],a[1]] ; 

        return [a[0] + b[0], a[1] + b[1]];}
    , [0,0])


    return rslt;
}

 

 

4. 배운 점

객체 이용하니까 코드 가독성 좋은 듯