알고리즘 이론 & 풀이/프로그래머스
프로그래머스 Lv.0 | 구슬을 나누는 경우의 수
문제 https://school.programmers.co.kr/learn/courses/30/lessons/120840 💻 풀이 원래 5, 6, 7, 28, 33, 34, 35번 테스트 케이스에서 에러가 났다. 원인을 찾아보니까 balls와 share가 최대 30인데 곱셈을 축적해서 팩토리얼을 구하는 방식으로는 값을 감당하지 못해서 그런거였다. 분수 부분 결과값이 너무 커서 그런가 생각해서 factorial(balls) / factorial(balls - share) / factorial(share)로 이 부분을 바꿔봤는데도 틀린다. 내 생각에는 여전히 수가 크기때문에 계속 부동소수점 이슈가 발생하는 듯 싶다. 그래서 그냥 BigInt()를 씌워서 아래와 같이 풀었다. function solution(..
프로그래머스 Lv.0 - 직각삼각형 출력하기 +) nodejs readline
문제 https://school.programmers.co.kr/learn/courses/30/lessons/120823 문제 자체는 어렵지 않다. 다만 아래처럼 nodejs의 readline 모듈을 이용해 입출력을 받아야 해서 당황했는데, 차근차근 해석하면 로직을 어디에 작성해야 할 지 알 수 있다. const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); let input = []; rl.on('line', function (line) { input = line.split(' '); }).on('close', function () { c..
프로그래머스 Lv.0 | 최빈값 구하기
문제 https://school.programmers.co.kr/learn/courses/30/lessons/120812 💻 풀이 최빈값을 count하기 위해 Map() 객체로 값 - 빈도수 쌍을 저장할 것이다. get()으로 쉽게 해당 값의 빈도수를 참조할 수 있기 때문이다. 주어진 숫자 배열을 돌며 최빈값을 기록하는 Map 객체에 현재 숫자가 저장되어 있다면 횟수를 +1 하고, 없다면 새로 추가한다. Array.from으로 Map을 배열로 만든 다음, 오름차순 정렬한다. 맨 뒤와 뒤에서 두번째값을 비교해서 숫자가 같다면 최빈값이 여러개이므로 -1을 반환하고, 아니라면 가장 큰 값인 맨 뒷 값을 반환한다. ...는 아이디어인데 여기에 함정이 있다. 맨 뒤와 뒤에서 두번째값을 비교하려다가 같은 숫자만 여..
프로그래머스 Lv.0 | 분수의 덧셈
문제 https://school.programmers.co.kr/learn/courses/30/lessons/120808 📝풀이 분모를 서로 곱해 통분하고, 각 분자에는 상대방의 분모를 곱해 통분한 다음 더해준다. 기약분수가 되려면 분모와 분자를 두 수의 최대공약수(GCD)로 나눠줘야 한다. (GCD - Greatest Common Divisor) 최대공약수의 범위는 1에서부터 최대 Math.min(분모, 분자)까지 될 수 있다. 따라서 for문을 돌며 분모와 분자를 나눠 나누어 떨어지게 하는 수를 gcd에 저장하고, for문이 종료될 때 나오는 최종 gcd로 분모와 분자를 나눈 결과를 반환하면 된다. 💻코드 function solution(numer1, denom1, numer2, denom2) { l..
프로그래머스 Lv.0 | 자릿수 더하기
문제 문제 링크 - https://school.programmers.co.kr/learn/courses/30/lessons/120906 풀이 1 자릿수를 문자열로 생각하는 방법 function solution(n) { return n.toString().split('').reduce((acc, curr) => acc + Number(curr), 0); } 풀이 2 수학적으로 자릿수에 해당하는 숫자 구하는 방법 function solution(n) { let sum = 0; let num = n; while(num > 0) {// ---3) sum += num % 10;// --- 1) num = Math.floor(num / 10);// --- 2) } return sum; } 1) 10으로 나눈 나머지..
프로그래머스 Lv.0 | 캐릭터의 좌표
문제 주소 - https://school.programmers.co.kr/learn/courses/30/lessons/120861 📝사고의 흐름 방향키가 들어있는 배열을 돌며 switch case로 무슨 키인지 검사하고, 좌표값을 ++ 혹은 -- 해주자. [0, 0]에서 시작하므로 [0, 0] 배열을 선언하고, 이 배열의 값을 증감하자. 그런데 무한정 이동할 수는 없다. max x값과 max y값을 구한다. 음수방향으로 가는 경우도 있으므로 max x 혹은 max y에 마이너스를 붙인 값도 잊으면 안된다. 만약 max x와 max y, 그리고 음수방향을 넘으면 더이상 값이 증가하지 않도록 해야 한다. switch case에서 방향키를 검사할 때 현재 좌표가 최대값에 다다르지 않았는지 검사하고, 최대값이 ..