알고리즘/코딩 테스트

[코딩 테스트] 프로그래머스 JS 연습 - 개미군단, 숨어있는 숫자의 덧셈, 직각삼각형 출력하기, 암호해독, 대문자와 소문자

Judith Hopps 2023. 1. 17. 19:41
반응형

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

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
    })

 

 

반응형