2차 공부/알고리즘 21

햄버거 만들기

프로그래머스 햄버거 만들기 주어지는 ingredient배열 중 1, 2, 3, 1 순서로 되어있는 요소를 제거하고, 다시 제거된 배열에서 1, 2, 3, 1이 없을때까지 해당 순서의 개수를 찾는 문제이다.   먼저 작성한 코드function solution(ingredient) { var answer = 0; let ingredientStr = ingredient.join('')+'' if (ingredientStr.includes(1231)) { do { ingredientStr = ingredientStr.replace(1231, '') answer++ } while (ingredientStr.includes(1231))..

대충 만든 자판

프로그래머스 - 대충 만든 자판 어떤 버튼을 반복해서 누르면 keymap의 각 요소대로 순서대로 나온다. (스마트폰 천지인 자판, 피쳐폰 자판)이때 targets의 각 요소마다 몇번의 자판누름이 필요할지 각각 배열에 넣어 리턴하는 함수를 만드는 것이다.다만, keymap 배열로 만들 수 없는 targets요소가 있다면, -1을 리턴해야한다.  처음엔 keymap의 요소를 모두 split시키고, 반복문에따라 targets의 각 요소를 split시켜 비교해 결과를 낼 생각이었다.하지만 코드를 작성하면서 이게 맞나 싶었다. keymap과 targets 배열의 요소가 각각 100개까지 가능했고, 각 원소의 길이도 100까지 가능했기 때문이다.비교하는 과정과 계속 split을 시켜야하는 부분에서 시간적으로 손해일..

체육복

학생의 수n / 체육복을 잃어버린 학생 목록 lost / 여벌의 체육복을 가지고있는 학생목록 reserve 가 인자로 들어온다.여벌의 체육복을 가진 학생의 번호 양옆으로만 체육복을 빌려줄 수 있다.체육복을 가진 학생만 체육수업을 들을 수 있다고 할 때, 가능한 최대의 수는 얼마인지 리턴하는 문제이다. 먼저 작성한 코드function solution(n, lost, reserve) { var answer = n; lost.sort((a,b) => a-b) reserve.sort((a,b) => a-b) let realLost = lost.filter((x) => !reserve.includes(x)) let realReserve = reserve.filter((x) => ..

숫자짝꿍

두 정수가 주어질 때 공통으로 들어간 수로 만들 수 있는 가장 큰 정수를 리턴하는 문제이다.공통을 비교할 때 짝꿍의 형태로 같다면 양쪽에서 지워지는 형식이다. 먼저 작성한 코드function solution(X, Y) { var answer = ''; let sortX = X.split('').sort((a,b) => b-a).join('') let sortY = Y.split('').sort((a,b) => b-a).join('') let max = Math.max(sortX, sortY)+'' let min = Math.min(sortX, sortY)+'' do { if (min.length===0 || max.length === 0) { ..

옹알이(2)

문제 해석aya, ye, woo, ma 네가지 단어로만 구성된 배열의 요소를 찾아내라.단, 네가지 단어 중 연속되어 반복되는 것이 포함되어있으면 안된다. ex) ayaaya / yeye/ woowoo / mama해당 조건을 만족하는 요소의 개수를 리턴하라 문제를 처음 이해하고 생각난 것은 네가지 문제를 포함하는 것을 판단한느 정규식이었다.하지만 정규식 사용에 익숙하지 않아 포기하였고, 반복문을 사용하여 판별하려 하였다. 처음 작성한 코드function solution(babbling) { var answer = 0; let arr = ['aya', 'ye', 'woo', 'ma'] for (let i = 0; i발음할 수 있는 단어들을 모아둔 arr 배열을 만들어주었다.반복문을 사용하여 ..

24.06.13 기사단원의 무기

처음 작성한 코드function solution(number, limit, power) { var answer = 0; let arr = []; for (let i =1; ilimit ? answer+=power : answer+=pow } return answer;}아마 정답은 잘 나왔을 것이다. 테스트 코드도 성공했고, 코드실행도 완료는 되었지만, 몇가지가 시간초과로 실패하였다.시간복잡도가 O(N*N)이고, 문제코드 중 입력되는 값이 큰게 있어 시간이 너무 오래걸린 것으로 생각한다.약수를 구하는 방법을 바꿔야겠다. 두번째로 작성한 코드function solution(number, limit, power) { var answer = 0; for (let i =1; ..

소수 만들기

입력되는 숫자의 배열 중 세가지 숫자를 더하여 해당 수가 소수인 경우를 모두 더해 리턴하는 문제이다. 처음 문제를 봤을 때 세가지 수를 더했을 때 같은 수가 있으면 안된다는 생각으로3중 반복문을 사용하여 모든 가지수의 합을 배열화시키고, new Set()을 사용하여 중복된 수를 제거한 뒤중복수가 제거된 배열을 소수판별하여 리턴하는 형식으로 작성했다. 코드는 다음과 같다. 처음 작성한 코드function solution(nums) { var answer = 0; let sumNums = []; for (let i=0; i하지만 문제에는 중복된 수에대한 예외가 없었다. 단순히 '서로 다른 세가지 수를 더해 나온 수가 소수인지'가 제일 중요한 것이었기 때문에 테스트코드는 잘 작동하였으나..

콜라문제

3가지 인수를 받는다. 가진 병의 개수n, 특정 개수마다 바꿔주는 a, a만큼 받으면 특정개수만큼 돌려주는 b세가지 인수를 통하여 교환동안 받은 콜라의 합을 구하는 것이 문제의 핵심이다.  먼저 작성한 코드function solution(a, b, n) { var answer = 0; let flag = false; for (let i = n; i>=a; i/=a){ let remain = i%a answer += Math.floor(i/a) i += remain if (i> a){ flag = true } else { flag = false } } ..

시저암호

작성한 코드function solution(s, n) { let upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' let lower = 'abcdefghijklmnopqrstuvwxyz' var answer = ''; for (let i = 0; i= targetArr.length) targetIndex -= targetArr.length answer += targetArr[targetIndex] } return answer;} 원래 split()을 사용하여 배열화 시킨 뒤 진행하려 하였는데, 알파벳의 순서에 따라 바꿔야 하는점과 사이사이에 띄어쓰기가 포함될 경우를 예외처리 하기 어려워 문자열 연산으로 풀이하였따. continue..