-
[코딩 테스트] 프로그래머스 JS 연습 - 개미군단, 숨어있는 숫자의 덧셈, 직각삼각형 출력하기, 암호해독, 대문자와 소문자알고리즘/코딩 테스트 2023. 1. 17. 19:41
1. 개미군단
개미 군단이 사냥을 나가려고 합니다. 개미군단은 사냥감의 체력에 딱 맞는 병력을 데리고 나가려고 합니다. 장군개미는 5의 공격력을, 병정개미는 3의 공격력을 일개미는 1의 공격력을 가지고 있습니다. 예를 들어 체력 23의 여치를 사냥하려고 할 때, 일개미 23마리를 데리고 가도 되지만, 장군개미 네 마리와 병정개미 한 마리를 데리고 간다면 더 적은 병력으로 사냥할 수 있습니다. 사냥감의 체력 hp가 매개변수로 주어질 때, 사냥감의 체력에 딱 맞게 최소한의 병력을 구성하려면 몇 마리의 개미가 필요한지를 return하도록 solution 함수를 완성해주세요.
function solution(hp) { var 장군개미 = parseInt(hp/5); var 병정개미 = parseInt(hp%5/3); var 일개미 = (hp%5) - 병정개미*3 return 장군개미 + 병정개미 + 일개미; }
메모리 소비가 있지만 하나씩 천천히 계산을 하는 것이 좋다.
2. 숨어있는 숫자의 덧셈 (1)
문제 설명
문자열 my_string이 매개변수로 주어집니다. my_string안의 모든 자연수들의 합을 return하도록 solution 함수를 완성해주세요.
function solution(my_string) { return my_string.replace(/[^0-9]/g,"") .split('') .reduce((pre,cur) => {return pre+cur*1},0) }
1. 입력값에서 문자열을 없앤다.
2. 그것을 배열로 만든다.
3. reduce함수로 더한다. 단, 문자열이기에 암묵적 타입변환을 해서 숫자형으로 전환해야한다.
3. 직각삼각형 출력하기
문제 설명
"*"의 높이와 너비를 1이라고 했을 때, "*"을 이용해 직각 이등변 삼각형을 그리려고합니다. 정수 n 이 주어지면 높이와 너비가 n 인 직각 이등변 삼각형을 출력하도록 코드를 작성해보세요.
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 () { console.log(star(Number(input[0]))); }); const star = (n) => { let str = ''; for (let i = 1; i <= n ; i++ ) { str +="*".repeat(i) str += "\n" } return str }
함수로 작성하지 않으면 oupsize differ 오류가 뜨기 때문에 함수를 따로 작성했다.
1부터 Number(input[0])까지 for문을 돌린 후 마지막에 줄바꿈 이스케이프를 넣었다.
이때, 주의해야 할 것은 기본 입력창이
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 () {
console.log(Number(input[0]));
});이렇게 뜬다. 이 문제를 풀때 rl.on('close', function () { } 이 부분에 입력하면 된다.
4. 암호 해독
군 전략가 머쓱이는 전쟁 중 적군이 다음과 같은 암호 체계를 사용한다는 것을 알아냈습니다.
- 암호화된 문자열 cipher를 주고받습니다.
- 그 문자열에서 code의 배수 번째 글자만 진짜 암호입니다.
문자열 cipher와 정수 code가 매개변수로 주어질 때 해독된 암호 문자열을 return하도록 solution 함수를 완성해주세요.
function solution(cipher, code) { return cipher.split('') .filter((_,i) => { return (i+1) % code ==0 }).join('') }
문자열을 배열로 만든 후 filter(_,i) 메소드를 사용한다.
filter의 경우 두번째 인자는 인덱스이다.
5. 대문자와 소문자
문제 설명
문자열 my_string이 매개변수로 주어질 때, 대문자는 소문자로 소문자는 대문자로 변환한 문자열을 return하도록 solution 함수를 완성해주세요.
function solution(my_string) { var answer =''; var lower = my_string.toLowerCase(); for (let i in my_string) { if (my_string[i] === lower[i]) { answer+=lower[i].toUpperCase() } else answer+=lower[i] } return answer; }
소문자 str을 만든 후 소문자와 str이 같으면 대문자로, 아니면 소문자로 만든 후 answer에 더하는 것으로 문제를 풀었다.
사실 이 문제를 푸는데 생각보다 많은 시간이 걸렸다. 처음 이 문제를 보았을 때 replace로 하면 되겠네! 하고 for 문 돌렸다가 첫번째만 replace가 반복되는 것을 확인했다. 더 좋은 방법이 있지 않을까 하다가 생각해낸 방법이다.이 방법은 메모리가 소비되므로 아래 방법을 좀 더 추천한다.
function solution(my_string) { var answer = ''; for (let c of my_string) answer += c === c.toLowerCase() ? c.toUpperCase() : c.toLowerCase(); return answer; }
+ 그외)
제곱수 판별
Number.isInteger(Math.sqrt(n))
str의 문자 제거
str.replaceAll(/[^\d]/g,'')
숫자 아닌 것 제거하라는 의미
2배씩 증가
n << t
n * Math.pow(2,t)
filter - index
arr.filter((_,i) => (i+1) % code)
forEach - index
cipher.split('').forEach((n, idx) => { if((idx + 1)%code === 0) answer += n })
'알고리즘 > 코딩 테스트' 카테고리의 다른 글