일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 프로그래머스 lv0
- react강의
- 프로그래머스 JS
- 호이스팅
- 코딩테스트 js
- js
- K디지털기초역량훈련
- API
- 패스트캠퍼스
- js split
- Flex Container
- CSS
- udemy
- DOM
- React
- flex
- margin-left
- javascript
- 바이트디그리
- html
- 국비지원
- 코딩테스트 lv0
- 리액트
- 변수 선언
- 내일배움카드
- 자바스크립트
- flex item
- 나라사랑카드
- 노드
- SVG
- Today
- Total
꺾이지 않는 마음
[프로그래머스] Lv.0 캐릭터의 좌표 JS 풀이 본문
🧡문제 설명
머쓱이는 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]까지 이동할 수 있습니다.
💛제한사항
- board은 [가로 크기, 세로 크기] 형태로 주어집니다.
- board의 가로 크기와 세로 크기는 홀수입니다.
- board의 크기를 벗어난 방향키 입력은 무시합니다.
- 0 ≤ keyinput의 길이 ≤ 50
- 1 ≤ board[0] ≤ 99
- 1 ≤ board[1] ≤ 99
- keyinput은 항상 up, down, left, right만 주어집니다.
💚입출력 예
keyinput | board | result |
["left", "right", "up", "right", "right"] | [11, 11] | [2, 1] |
["down", "down", "down", "down", "down"] | [7, 9] | [0, 4] |
💙입출력 예 설명
입출력 예 설명 #1
- [0, 0]에서 왼쪽으로 한 칸 오른쪽으로 한 칸 위로 한 칸 오른쪽으로 두 칸 이동한 좌표는 [2, 1]입니다.
입출력 예 설명 #2
- [0, 0]에서 아래로 다섯 칸 이동한 좌표는 [0, -5]이지만 맵의 세로 크기가 9이므로 아래로는 네 칸을 넘어서 이동할 수 없습니다. 따라서 [0, -4]를 return합니다.
✨나의 풀이
function solution(keyinput, board) { const nowHere = [0, 0]; const rowLimit = Math.floor(board[0]/2); const colLimit = Math.floor(board[1]/2) keyinput.forEach(v=>{ if (v==="right" && nowHere[0] < rowLimit) { nowHere[0] += 1; } else if (v==="left" && nowHere[0] > -rowLimit) { nowHere[0] -= 1; } else if (v==="up" && nowHere[1] < colLimit) { nowHere[1] += 1; } else if (v==="down" && nowHere[1] > -colLimit) { nowHere[1] -= 1; } }) return nowHere }
내가 있는 위치를 가리킬 변수 nowHere을 선언하고 초기값인 [0, 0]을 할당했다.
가로세로 좌표의 한계값을 담을 변수 rowLimit, colLimit을 선언하고 값을 할당했다.
forEach 반복문 속에 if 조건문을 추가하여 각각의 경우에 nowHere의 값을 변경해주었다.
딱히 어려움은 못느낀 문제였다.
😮다른 풀이
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문을 활용한 풀이법이다.
left, right, up, donw 처럼 이렇게 케이스가 딱딱 나누어 떨어지는 경우에는 switch문을 쓰는게 더 코드가 깔끔해 보인다.
나처럼 if else를 남발하면 코드가 너무 길어지기 때문에 앞으로 switch 코드 사용도 고려해봐야겠다.
for문과 if else문 사용에 너무 익숙해져서ㅎㅎ.. 그만 남발하고 다양하게 코드 짜는 연습을 해보자
'코딩테스트 기록' 카테고리의 다른 글
[프로그래머스] Lv.0 문자열 밀기 JS 풀이 (0) | 2022.11.03 |
---|---|
[프로그래머스] Lv.0 소인수분해 JS 풀이 (0) | 2022.11.01 |
[프로그래머스] Lv.0 구슬을 나누는 경우의 수 JS 풀이 (0) | 2022.11.01 |
[프로그래머스] Lv.0 공 던지기 JS 풀이 (1) | 2022.10.31 |
[프로그래머스] Lv.0 가까운 수 JS 풀이 (0) | 2022.10.29 |