Front-End

프로그래머스 기초트레이닝 21 일차 본문

알고리즘

프로그래머스 기초트레이닝 21 일차

jeongsso 2023. 10. 31. 07:16

이제 얼마 안남았습니다 .  ㅎㅎ 

ㅎㅇㅌ..!

 

 

문제 102.  qr code


문제 설명

두 정수 q, r과 문자열 code가 주어질 때,
code의 각 인덱스를 q로 나누었을 때 나머지가 r인 위치의 문자를 앞에서부터 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.

입출력 예

q r code result
3 1 "qjnwezgrpirldywt" "jerry"
1 0 "programmers" "programmers"

 

입출력 예 설명

 

 

 

저의 풀이!

function solution(q, r, code) {
    let answer = '';

    for (let i = 0; i < code.length; i++) {
        if (i % q === r) {
            answer += code[i];
        }
    }
    return answer;
}

console.log(solution(3, 1, 'qjnwezgrpirldywt'));

 

 

메모

조건 : code의 각 인덱스를 q로 나누었을 때 나머지가 r인 인덱스를 앞에서부터 순서대로 이어붙여 만든
문자열을 리턴하면 됐습니다.
반복문을 code만큼 돌리면서 i(인덱스)를 q로 나눴을 때 r인 경우만 answer라는 변수 빈문자열에 추가해줍니다.
그러고 나서 마지막에 answer를 리턴하면 원하는 값을 출력할 수 있습니다.

 

 

 

 

문제 103.  커피 심부름


문제 설명

팀의 막내인 철수는 아메리카노와 카페 라테만 판매하는 카페에서 팀원들의 커피를 사려고 합니다.
아메리카노와 카페 라테의 가격은 차가운 것과 뜨거운 것 상관없이 각각 4500, 5000원입니다.
각 팀원에게 마실 메뉴를 적어달라고 하였고,
그 중에서 메뉴만 적은 팀원의 것은 차가운 것으로 통일하고 "아무거나"를 적은 팀원의 것은 차가운 아메리카노로 통일하기로 하였습니다.

각 직원이 적은 메뉴가 문자열 배열 order로 주어질 때, 
카페에서 결제하게 될 금액을 return 하는 solution 함수를 작성해주세요. 
order의 원소는 아래의 것들만 들어오고, 각각의 의미는 다음과 같습니다.




입출력 예

order result
["cafelatte", "americanoice", "hotcafelatte", "anything"] 19000
["americanoice", "americano", "iceamericano"] 13500

 

 

입출력 예 설명

예제 1번의 입력을 표로 나타내면 다음과 같습니다.
철수는 차가운 아메리카노 2잔, 차가운 카페 라테 1잔, 따뜻한 카페 라테 1잔을 주문하게 되므로 결제 금액은 4500 × 2 + 5000 × 2 = 19000원입니다. 따라서 19000을 return 합니다.

예제 2번의 입력에서는 모든 음료를 차가운 아메리카노로 시키게 됩니다. 
따라서 결제 금액은 4500 × 3 = 13500원이고 13500을 return 합니다.

 

저의 풀이!

function solution(order) {
    let answer = 0;

    for (let i = 0; i < order.length; i++) {
        if (order[i].includes('americano') || order[i].includes('anything')) {
            answer += 4500;
        } else answer += 5000;
    }
    return answer;
}

console.log(
    solution(['cafelatte', 'americanoice', 'hotcafelatte', 'anything'])
);

 

 

메모

문제를 봤을때 조건만 걸어주면된다고 생각이 든다.
일단 총 금액을 더하면서 담아 둘 변수를 하나 만들어둔다.
그리고나서 order를 반복 순회하면서 order[i]에 아메리카노가 들어있는지 확인하고 또는 아무거나의 의미인 anything이 있는지 확인한다.  왜냐면 핫 / 아이스 아메리카노의 가격은 동일하며, 아무거나의 메뉴는 아이스 아메리카노로 통일한다고 했으니,
이 세개의 가격은 4500원으로 통일 할 수 있다.
그래서 이 세가지 경우가 포함된 메뉴인 경우 answer 변수에 4500원 씩 더하게끔하고,
나머지인 경우 핫 / 아이스 라떼 일거니까 5000원씩 더하게끔해서 마지막에 
answer를 리턴해주면 된다. 

 

 

 

문제 104.  조건에 맞게 수열 변환하기 2


문제 설명

정수 배열 arr가 주어집니다. 
arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다.

이러한 작업을 x번 반복한 결과인 배열을 arr(x)라고 표현했을 때, arr(x) = arr(x + 1)인 x가 항상 존재합니다. 
이러한 x 중 가장 작은 값을 return 하는 solution 함수를 완성해 주세요.

단, 두 배열에 대한 "="는 두 배열의 크기가 서로 같으며, 같은 인덱스의 원소가 각각 서로 같음을 의미합니다.



 

입출력 예

arr result
[1, 2, 3, 100, 99, 98] 5

 

 

입출력 예 설명

 

 

저의 풀이!

function solution(arr) {
    let count = 0;
    let array = [...arr];

    while (true) {
        let 변화배열 = array.map(a => {
            if (a >= 50 && a % 2 === 0) return a / 2;
            if (a < 50 && a % 2 === 1) return a * 2 + 1;
    
            return a;
        });

        let same = array.every((v, i) => v === 변화배열[i]);
        if (same) break;

        count += 1;
        // 요소가 같지않으면, array가 변화배열로 변화해서 계속된 반복 작업을 하도록 하게한다!!!!
        array = 변화배열;
    }
    return count;
}

console.log(solution([1, 2, 3, 100, 99, 98]));

 

메모

x번 반복한 결과인 배열 arr(x)라고 표한할 때, => 이 부분에서 몇번 반복을 했는지 알아야 한다는걸 알 수 있다.
그래서 변수 count를 만들어 반복할 때마다 +1을 하도록 코드를 작성해주어야 한다.

원본 배열을 건들지 않고, 배열을 복사하여 새로운 배열로 변화를 줘야한다.

every 메서드는 배열안의 모든 원소가 조건에 맞는지 확인해서 true false 를 내보내준다.

 

 

문제 105. 배열 만들기 4


문제 설명

정수 배열 arr가 주어집니다. 
arr를 이용해 새로운 배열 stk를 만드려고 합니다.

변수 i를 만들어 초기값을 0으로 설정한 후 i가 arr의 길이보다 작으면 다음 작업을 반복합니다.

만약 stk가 빈 배열이라면 arr[i]를 stk에 추가하고 i에 1을 더합니다.
stk에 원소가 있고, stk의 마지막 원소가 arr[i]보다 작으면 arr[i]를 stk의 뒤에 추가하고 i에 1을 더합니다.
stk에 원소가 있는데 stk의 마지막 원소가 arr[i]보다 크거나 같으면 stk의 마지막 원소를 stk에서 제거합니다.
위 작업을 마친 후 만들어진 stk를 return 하는 solution 함수를 완성해 주세요.

 

입출력 예

arr result
[1, 4, 2, 5, 3] [1, 2, 3]

 

입출력 예 설명

 

 

저의 풀이!

function solution(arr) {
    let stk = [];

    for (let i = 0; i < arr.length; i++) {
        if (stk.length === 0) {
            stk.push(arr[i]);
        } else if (stk[stk.length - 1] < arr[i]) {
            stk.push(arr[i]);
        } else if (stk[stk.length - 1] >= arr[i]) {
            stk.pop();
            i -= 1;
        }
    }
    return stk;
}

console.log(solution([1, 4, 2, 5, 3]));

 

 

메모

조건이 정확히 명시되어 있기 때문에, 문제를 잘 읽고 난 후 풀었습니다.
새로만드는 배열의 원소가 없을 경우, 있다면 마지막 원소가 arr[i]보다 작다면 arr[i]를 새로 만든 배열 뒤에 추가하고,
크거나 같다면 마지막 원소를 제거해야합니다.
이때 제거할 경우 i(반복 횟수)를 -1 을 해줘야합니다. 
왜냐하면 입출력 예를 봤을 때 pop()됐을 때는 i가 증감하지않고 그대로 유지되고 있는것을 확인할 수 있습니다.

while문을 통해서도 작성해볼 수 있습니다. 

function solution1(arr) {
    let stk = [];
    let i = 0;

    // false일때까지 반복해준다. break를 따로 걸어두지않았음에도!!!
    while (i < arr.length) {
        if (stk.length === 0) {
            stk.push(arr[i]);
            i += 1;
        } else {
            if (stk[stk.length - 1] < arr[i]) {
                stk.push(arr[i]);
                i += 1;
            } else {
                stk.pop();
            }
        }
        return stk;
    }
}

console.log(solution([1, 4, 2, 5, 3]));
 
Comments