본문 바로가기

알고리즘 코딩

배열에서 요소 3개를 더했을 때, 소수가 되는 경우의 개수 문제는 제목과 같고 자세한 문제는 아래에서 확인 가능하다. https://school.programmers.co.kr/learn/courses/30/lessons/12977 결과적으로 작성한 코드는 아래와 같다. 이중 재귀함수getCombinations 부분은 인터넷에서 그대로 가져왔다. getCombinations의 자세한 내용은 아래 포스팅으로 정리했다. 대단히 복잡한 함수이고 이걸 만든 사람은 어떻게 만들었을지 궁금하고 그분이 존경스럽다. https://gamunbidev.tistory.com/80 function solution(nums) { var answer = 0; const getCombinations = (arr, num) => { const results = []; if (num ===.. 더보기
재귀함수. 집요한 정리 프로그래머스 문제 하나가 재귀함수를 필요로 했다. 아래 문제이다. 소수 만들기이다. https://school.programmers.co.kr/learn/courses/30/lessons/12977 그래서 재귀함수를 들여다보았는데 문제를 풀기 위해 내가 들여다 본 재귀함수는 아래와 같다. const getCombinations = (arr, num) => { const results = []; if (num === 1) return arr.map(v => [v]); arr.forEach((fixed, index, origin) => { const rest = origin.slice(index + 1); const combinations = getCombinations(rest, num - 1); cons.. 더보기
배열에서 문자열 요소들을 오름차순 정렬하면 대문자부터 나온다. 알고리즘 문제풀이 중 기억하고 싶은 부분이 있어 포스팅한다. 자세한 문제는 아래 링크와 같다. (프로그래머스) https://school.programmers.co.kr/learn/courses/30/lessons/12917 기억할 점 : 배열에서 문자열 요소들을 sort() 메서드로 오름차순 정렬하면 대문자부터 나온다. 이걸 몰라서 풀이가 엄청나게 돌아서 갔다. sort() 만 하면 알아서 대문자가 앞에 오고 그걸 reverse() 하면 끝나는 문제였다. 그런데 나는 sort 메서드를 쓰면서도 대소문자를 구분해 배열하는 코드를 굳이 만들어 넣어 줬다. 아래와 같다. function solution(s) { function isUpper(strValue) { let firstStrValue = strVa.. 더보기
같은 숫자는 싫어 ! 알고리즘 자세한 문제는 아래 프로그래머스 링크 참조바란다. https://school.programmers.co.kr/learn/courses/30/lessons/12906 나의 풀이는 아래와 같다. function solution(arr) { var answer = [] arr.map((_, i)=>{if (arr[i]!==arr[i-1]) { answer.push(arr[i]) } }); return answer } arr = [4,4,4,3,3] console.log(solution(arr)) 풀면서 중요했던 포인트는 map() 메서드가 arr을 돌면서 이전 인덱스 요소와 값이 다른 요소만 var answer [] 배열에 넣는다는 것이다. 굳이 빈 배열을 하나 만들것도 없이 그냥 arr에다 필터를 써서 이전.. 더보기
최소직사각형 알고리즘 feat. apply() 메서드 코딩테스트다. 자세한 문제는 아래와 같다. https://school.programmers.co.kr/learn/courses/30/lessons/86491 나의 답안으로 본격 들어가기 전에 문제에 대한 생각을 해보았다. 어떤 논리 과정을 거쳐야 문제의 답안을 도출할 수 있을까? 아래와 같은 명함 사이즈 배열이 있다고 하자. 이 모든 사이즈의 명함이 들어가는 가장 작은 명함지갑의 크기를 알아내는 것이다. size3 = [[14, 4], [19, 6], [6, 16], [18, 7], [7, 11]] [14,4] 요소에서 14는 가로, 4는 세로길이다. 다른 요소들도 마찬가지다. 물론 명함을 돌리면 가로세로는 서로 바뀐다. 명함들은 길이를 보면 모두 직사각형이기 때문에 긴쪽 길이와 짧은 쪽 길이가 있다. .. 더보기
자연수가 하샤드 수인지 판별하는 알고리즘 문제는 역시 제목 그대로이다. 자세한 문제는 아래와 같다. https://school.programmers.co.kr/learn/courses/30/lessons/12947 나의 답안은 아래와 같다. function solution(x) { a = x.toString().split('').map(Number).reduce((acc, cur)=>acc+cur) return x % a===0 ? true : false; } x = 18 console.log(solution(x)) 이번 문제는 주차하고 집에 돌아오면서 생각해 보았는데 잘 떠올라 줘서 감사하다. 여러 메서드를 섞어 쓰게 되었는데 느낀 점은, 메서드를 잘 알면 정말 편하리라는 점이다. 복잡한 코드를 4분의1도 안되게 줄여 주고, 메서드 이름 덕분.. 더보기
자연수가 몇 번째 콜라프 작업에서 1이 되는지 파악하는 알고리즘 문제는 제목 그대로다. 만약 그 자연수가 500번째 콜라프 작업으로도 1이 되지 않는다면 함수는 -1을 반환해야 한다. 자세한 문제는 아래와 같다. https://school.programmers.co.kr/learn/courses/30/lessons/12943 재귀함수를 써야 할 거 같아서 1.5시간 이상 고생했으나 실패했다. 여기 while문으로 해결한 사례가 있어서 주석으로 파보았다. 코드는 거의 외운거 같다. function collatz(num) { var answer = 0 ; while(num !== 1 && answer < 500) { // answer 더보기
단어별로 짝수번째 index의 문자만 대문자로 만들기 알고리즘 이상한 문자 만들기라는 이름으로 문제가 올라와 있다. 자세한 문제내용은 아래 링크를 보면 된다. https://school.programmers.co.kr/learn/courses/30/lessons/12930?language=javascript 답안코드는 인터넷을 참고했으나 내가 주석했다. function solution(s){ var answer = ''; console.log(s.split(' ').map(i => i.split('') // 문자열을 공백 기준으로 나눠서 배열에 넣는다. -> 배열의 요소들을 i번째 요소부터 한글자 한글자 갈라서 또다른 배열에 넣는다. .map((j, idx) => j = idx % 2 === 0 ? j.toUpperCase():j.toLowerCase()) // 그.. 더보기