-
[코딩 테스트] 프로그래머스 JS 연습 - 다음에 올 숫자,특이한 정렬,문자열 밀기,치킨쿠폰,등수 매기기,캐릭터의 좌표알고리즘/코딩 테스트 2023. 1. 23. 16:21
0. 다음에 올 숫자
문제 설명
등차수열 혹은 등비수열 common이 매개변수로 주어질 때, 마지막 원소 다음으로 올 숫자를 return 하도록 solution 함수를 완성해보세요.
function solution(common) { //등차 수열 let 차이 = common[1] - common[0] === common[2] - common[1] ? common[1] - common[0] : false; if (차이 !== false) return common.at(-1) +차이; if (차이 === false) { //등비 수열 let 등비 = Math.round(common[2] / common[1]); return common.at(-1) * 등비; } }
처음에 if 문을 false가 아닌 0으로 했다가 테스트 6번에서 계속 틀렸다.
차이가 0인 경우와 등비수열인 경우가 같은 케이스로 엮이기 때문이다.
그래서 숫자가 아닌 boolean으로 처리해야 한다.
1. 특이한 정렬
문제 설명
정수 n을 기준으로 n과 가까운 수부터 정렬하려고 합니다. 이때 n으로부터의 거리가 같다면 더 큰 수를 앞에 오도록 배치합니다. 정수가 담긴 배열 numlist와 정수 n이 주어질 때 numlist의 원소를 n으로부터 가까운 순서대로 정렬한 배열을 return하도록 solution 함수를 완성해주세요.
function solution(numlist, n) { //절대값이 같은부분이랑 다른부분 케이스 분류해야함 // 일반 숫자 정렬 // [10, 20, 30, 40, 32, 35, 37].sort((a, b) => a - b) // 어떠한 값 기준 정렬 // [10, 20, 30, 40, 32, 35, 37].sort((a, b) => Math.abs(a - 35) - Math.abs(b - 35)) // 어떠한 값 기준 정렬, 값이 같을 때에는 뒤에 || return numlist.sort((a, b) => Math.abs(a - n) - Math.abs(b - n) || b - a); }
Number(false)는 0이므로 만약 값이 같으면 0이 되므로 true값 즉, 오름차순으로 정렬이 된다.
2. 문자열 밀기
문제 설명
문자열 "hello"에서 각 문자를 오른쪽으로 한 칸씩 밀고 마지막 문자는 맨 앞으로 이동시키면 "ohell"이 됩니다. 이것을 문자열을 민다고 정의한다면 문자열 A와 B가 매개변수로 주어질 때, A를 밀어서 B가 될 수 있다면 밀어야 하는 최소 횟수를 return하고 밀어서 B가 될 수 없으면 -1을 return 하도록 solution 함수를 완성해보세요.
function solution(A, B) { if (A === B) return 0; let arr = B.split(''); for (let i = 1; i <= A.length; i++){ arr.push(arr.shift()); if ( arr.join('') === A) return i; } return -1; }
반복되는 push, shift 메소드 사용은 실행 시간과 메모리 변경으로 인해 추천하지 않는다.
let solution=(a,b)=>(b+b).indexOf(a)
베스트 답안이다. 문자열의 순서는 변경되지 않으므로 indexOf 메소드를 사용할 수 있다.
3. 치킨 쿠폰
문제 설명
프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.
function solution(chicken) { //현재 쿠폰 수 let coupons = chicken; let service = 0; while(coupons> 9){ service += Math.floor(coupons / 10); // 남은 쿠폰은 서비스 치킨 쿠폰 + 치킨 쿠폰 coupons = Math.floor(coupons / 10) + coupons%10; } return service; }
처음에 chicken 값을 while 문으로 돌리다가 남은 쿠폰 수가 서비스에 합쳐지지 않아 애를 썼다.
변수 사용을 해야한다는 단점이 있지만, 가독성을 위해 변수 사용을 해서 문제를 푸는 것이 좋다.
4. 등수 매기기문제 설명
function solution(score) { let avg_score = score.map(x=> (x[0]+x[1])/2); let sort_score = avg_score.slice().sort((a,b) => b-a) return avg_score.map(v => sort_score.indexOf(v)+1) }
등수 매기기는 자주 쓰이는 알고리즘이므로 외워두는 것이 좋다.
평균값을 기준으로 sort를 하는데, 이때 원래 arr의 순서는 변화를 주면 안되므로 slice() 메소드를 사용해야 한다.
5. 캐릭터의 좌표
문제 설명
머쓱이는 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 함수를 완성해주세요.
function solution(keyinput, board) { var answer = [0,0]; for (let s of keyinput) { // ["down", "down", "down", "up"], [3, 3] if (s === "left") answer[0] -=1; if (s === "right") answer[0] +=1; if (s === "up") answer[1] +=1; if (s === "down") answer[1] -=1; for (let i in answer) { if (answer[i] > (board[i]-1)/2) answer[i] =(board[i]-1)/2; if (answer[i]<0 && answer[i] <(board[i]-1)/2*(-1) ) answer[i] =(board[i]-1)/2*(-1); } } return answer; }
이 알고리즘은 캐릭터의 좌표를 옮기고 나서 board의 크기를 한번 더 생각해서 좌표를 수정하는 코드이다.
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; }
위 알고리즘을 쓴다면, board의 좌표를 넘어가는 것을 방지할 수 있다.
'알고리즘 > 코딩 테스트' 카테고리의 다른 글