일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- CSS
- 코딩테스트
- 방송대
- 개발자취업
- Python
- nestjs
- 파이썬프로그래밍기초
- HTML
- 코드잇
- 방송대컴퓨터과학과
- presignedurl
- aws
- 항해99
- Git
- 코딩테스트준비
- 꿀단집
- 유노코딩
- 데이터베이스시스템
- 프로그래머스
- redis
- TiL
- SQL
- Cookie
- 중간이들
- 파이썬
- JavaScript
- 99클럽
- node.js
- 엘리스sw트랙
- MySQL
- Today
- Total
배꼽파지 않도록 잘 개발해요
[프로그래머스] 입문 Day 9 수학, 문자열, 해시, 완전탐색, 조건문 (Javascript) 본문
개미 군단
문제 설명
- 개미 군단이 사냥을 나가려고 합니다. 개미군단은 사냥감의 체력에 딱 맞는 병력을 데리고 나가려고 합니다. 장군개미는 5의 공격력을, 병정개미는 3의 공격력을 일개미는 1의 공격력을 가지고 있습니다.
- 예를 들어 체력 23의 여치를 사냥하려고 할 때, 일개미 23마리를 데리고 가도 되지만, 장군개미 네 마리와 병정개미 한 마리를 데리고 간다면 더 적은 병력으로 사냥할 수 있습니다. 사냥감의 체력 hp가 매개변수로 주어질 때, 사냥감의 체력에 딱 맞게 최소한의 병력을 구성하려면 몇 마리의 개미가 필요한지를 return하도록 solution 함수를 완성해주세요.
제한사항
- hp는 자연수입니다.
- 0 ≤ hp ≤ 1000
입출력 예
hp | result |
23 | 5 |
24 | 6 |
999 | 201 |
풀이 1
직접 연산해줌
function solution(hp) {
// 장군 : 5, 병정 : 3, 일 : 1
// 23 = 장군 * 4 + 병정 * 1
/*
1. hp를 5로 나누고, 몫을 저장한다.
2. 해당 몫을 3으로 나눈다.
3. 다시 해당 몫을 1로 나눈다.
*/
var answer = 0;
general = Math.trunc(hp / 5) // 4
soldier = Math.trunc((hp - (general * 5)) / 3) // 1
normal = Math.trunc(hp - (general * 5 + soldier * 3) / 1) // 0
answer = general + soldier + normal
return answer;
}
풀이 2
나머지를 활용한 풀이
function solution(hp) {
general = Math.floor(hp / 5)
soldier = Math.floor((hp % 5) / 3)
normal = (hp % 5) % 3;
return general + soldier + normal;
}
모스부호 (1)
문제 설명
- 머쓱이는 친구에게 모스부호를 이용한 편지를 받았습니다. 그냥은 읽을 수 없어 이를 해독하는 프로그램을 만들려고 합니다. 문자열 letter가 매개변수로 주어질 때, letter를 영어 소문자로 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.
- 모스부호는 다음과 같습니다.
morse = {
'.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',
'--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',
'--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',
'...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',
'-.--':'y','--..':'z'
}
제한사항
- 1 ≤ letter의 길이 ≤ 1,000
- return값은 소문자입니다.
- letter의 모스부호는 공백으로 나누어져 있습니다.
- letter에 공백은 연속으로 두 개 이상 존재하지 않습니다.
- 해독할 수 없는 편지는 주어지지 않습니다.
- 편지의 시작과 끝에는 공백이 없습니다.
입출력 예
letter | result |
".... . .-.. .-.. ---" | "hello" |
".--. -.-- - .... --- -." | "python" |
풀이 1
for 반복문으로 객체의 key값에 맞는 value를 문자열에 넣기
function solution(letter) {
const morse = {
'.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',
'--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',
'--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',
'...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',
'-.--':'y','--..':'z'
}
var answer = '';
// letter을 공백단위로 쪼개서 배열 생성 => split('')
// 배열의 원소를 순회하며 morse의 key값 중 해당 원소가 있는지 확인
// 있다면 key에 해당하는 value값 반환하도록 함
listOfLetter = letter.split(' ') // [ '....', '.', '.-..', '.-..', '---' ]
for (i = 0; i < listOfLetter.length; i++) {
answer += morse[listOfLetter[i]]
}
}
return answer;
}
풀이 2
reduce 함수 활용
function solution(letter) {
// letter을 공백을 기준으로 나누어 배열 생성
// → [ '....', '.', '.-..', '.-..', '---' ]
// reduce함수로 각 Morse 코드에 대응하는 알파벳을 찾아서 이어 붙임
morse = {
'.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',
'--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',
'--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',
'...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',
'-.--':'y','--..':'z'
}
return return letter.split(' ').reduce((acc, cur) => acc + Morse[cur], '')
}
주의할 점
- 대부분 풀이1의 방법으로 쉽게 풀었다. 그런데 reduce 함수로 더 간단하게 쓸 수 있으니 참고해야겠다.
가위 바위 보
문제 설명
- 가위는 2 바위는 0 보는 5로 표현합니다. 가위 바위 보를 내는 순서대로 나타낸 문자열 rsp가 매개변수로 주어질 때, rsp에 저장된 가위 바위 보를 모두 이기는 경우를 순서대로 나타낸 문자열을 return하도록 solution 함수를 완성해보세요.
제한사항
- 0 < rsp의 길이 ≤ 100
- rsp와 길이가 같은 문자열을 return 합니다.
- rsp는 숫자 0, 2, 5로 이루어져 있습니다.
입출력 예
rsp | result |
"2" | "0" |
"205" | "052" |
풀이 1
반복문으로 객체의 문자열 더하기
function solution(rsp) {
// 2 -> 0
// 0 -> 5
// 5 -> 2
var answer = '';
rsp_list = rsp.split('')
object = {"2":"0", "0":"5", "5":"2"}
for (i = 0; i < rsp_list.length; i++){
answer += object[rsp_list[i]]
}
return answer;
}
풀이 2
reduce 함수 활용
function solution(rsp) {
object = {"2":"0", "0":"5", "5":"2"}
return rsp.split('').reduce((acc, cur) => (acc + object[cur]), '')
}
풀이 3
스프레드 연산자를 활용해서 문자열 rsp를 배열로 변환하고, 각 문자에 대응하는 arr 객체의 값을 가져옴
function solution(rsp) {
let arr = {
2: 0,
0: 5,
5: 2
};
var answer = [...rsp].map(v => arr[v]).join("");
return answer;
}
참고
문자열과 숫자를 더하면 숫자가 문자로 자동 형변환됨
console.log("2" + "5") // "25" → 문자열끼리 더하면 결합
console.log("2" + 5) // "25" → 문자열 + 숫자 의 경우에는 숫자가 문자로 자동 형변환
스프레드 연산자를 사용하면 문자열이 분해되어 배열의 원소로 들어감
function solution(rsp) {
console.log([...rsp])
}
console.log(solution("2052"))
// [ '2', '0', '5', '2' ]
주의) 숫자의 경우는 분해되지 않음
let number = 123;
let numberArray = [...number]
console.log(numberArray);
// TypeError: number is not iterable
구슬을 나누는 경우의 수
문제 설명
- 머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.
제한사항
- 1 ≤ balls ≤ 30
- 1 ≤ share ≤ 30
- 구슬을 고르는 순서는 고려하지 않습니다.
- share ≤ balls
입출력 예
balls | share | result |
3 | 2 | 3 |
5 | 3 | 10 |
풀이 1
반복문으로 팩토리얼 계산
function solution(balls, share) {
// balls 중 share을 고르는 경우의 수
// balls! / (balls - share)! x share!
// 팩토리얼 계산
function factorial (n) {
let result = 1; // n이 0 혹은 1이 들어가면 result는 1
for (let i = 2; i <= n; i++) {
result *= i;
}
return result;
}
const num = factorial(balls); // 분자
const den = factorial(balls - share) * factorial(share); // 분모
let answer = Math.round(num / den); // 정답
}
풀이 2
재귀함수 호출
function solution(balls, share) {
// balls 중 share을 고르는 경우의 수
// balls! / (balls - share)! x share!
// 팩토리얼 계산 (재귀함수)
function factorial (n) {
if ((n === 1) || (n === 0)) { // 0! = 1
return 1;
} else {
return n * factorial(n - 1);
}
}
var answer = Math.round(factorial(balls) / (factorial(balls - share) * factorial(share)));
return answer;
}
// 삼항 연산자
const factorical = (num) => num === 0 ? 1 : num * factorial(num - 1)
// num이 1일 때 factorial(0)이 되어서 1이 호출됨
function solution(balls, share) {
return Math.round(factorial(balls) / factorial(balls - share) / factorial(share))
}
삼항연산자 풀이는 간단하지만 가독성이 떨어짐. 실행 시간에 별 차이가 없음.
주의할 점
- 경우의 수 자체는 중학교 수학에서 나올만한 내용이라 크게 어렵지 않은데 재귀함수 구현이 꽤 까다로움.
- 참고로 재귀함수 작성시 0! = 1을 고려하지 않으면 케이스 몇 개가 에러나는 걸 볼 수 있음.
- 부동소수점 오류 때문에 맨 마지막에 Math.round를 해줘야 통과가 가능함.
Javascript 소수점 오류 원인, 해결방안
자바스크립트에서 소수점 숫자 연산을 하면, 생각지도 못한 오류가 발생한다. 아래처럼 콘솔창에 0.1 + 0.2를 입력하면, 0.3이 아니라 0.30000000000000004 가 나오는 걸 확인해볼 수 있다. 이렇게 소수점
joooing.tistory.com
요약 :
자바스크립트로 소수점 연산을 하면 10진법에서 2진법으로 변환하는 과정에서 무한소수가 되어버림.
이를 방지하기 위해서는 소수점이 생길 때 toFixed와 Math.round를 활용할 수 있음.
- toFixed(자리수) : 반올림해서 자리수까지 표현함, 반환값은 문자 (Number로 형변환 필요)
- Math.round() : 가장 가까운 정수값 반환, 반환값은 숫자
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 입문 Day 11 수학, 반복문 (Javascript) (0) | 2023.12.21 |
---|---|
[프로그래머스] 입문 Day 10 조건문, 배열, 수학, 시뮬레이션 (Javascript) (0) | 2023.12.19 |
[프로그래머스] 입문 Day 8 배열, 구현, 수학 (Javascript) (0) | 2023.12.19 |
[프로그래머스] 입문 Day 7 문자열, 조건문, 수학, 반복문 (Javascript) (0) | 2023.12.19 |
[프로그래머스] 입문 Day 6 문자열, 반복문, 출력, 배열, 조건문 (Javascript) (0) | 2023.12.15 |