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. 배운 점
객체 이용하니까 코드 가독성 좋은 듯
'알고리즘, CS' 카테고리의 다른 글
[특강] 클린코드_코드 퀄리티 & 가독성 올리기 (0) | 2023.08.04 |
---|---|
[특강] 클린코드_조건과 탈출 (0) | 2023.08.04 |
[프로그래머스 Lv. 1] 부족한 금액 계산하기 (0) | 2023.08.04 |
[프로그래머스 Lv. 1] 문자열 내림차순으로 배치하기 (0) | 2023.08.04 |
[프로그래머스 Lv. 1] 가운데 글자 가져오기 (0) | 2023.08.01 |