TIL

TIL 8/20 (1) - 알고리즘 문제풀이 2

nbcssw 2024. 8. 20. 15:11

문제 1


주어진 문자열에서 중복된 문자를 제거하고, 남은 문자들을 원래 순서대로 반환하는 함수를 작성하세요.

제한사항:

  • 문자열의 길이는 1 이상 1000 이하입니다.

 

function solution (str){
    const result = [];
    for(let i=0; i<str.length; i++){
        if(!result.includes(str[i]))
            result.push(str[i]);
    }

    return result.join('');
}

console.log(solution('abca')); // abc

 

 

 

문제 2


주어진 배열에서 최솟값과 최댓값을 찾고, [최솟값, 최댓값] 형태의 배열을 반환하는 함수를 작성하세요.

제한사항:

  • 배열의 길이는 1 이상 1000 이하입니다.
  • 배열의 원소는 -1000 이상 1000 이하의 정수입니다.
function solution (arr){
    let max = arr[0];
    let min = arr[0];

    for (let i=0; i<arr.length; i++){
        if (arr[i] > max)
            max = arr[i];
    }

    for (let i=0; i<arr.length; i++){
        if (arr[i] < min)
            min = arr[i];
    }

    return [min, max];
}

console.log(solution([14,24,56,7,51,63,42])); // [ 7, 63 ]

 

 

 

문제 3


주어진 문자열을 요약하는 함수를 작성해주세요!

 

 

function solution(str) {
    let obj = {};
    let answer = '';

    for (let i = 0; i < str.length; i++) {
        if (!obj[str[i]])
            obj[str[i]] = 1;
        else
            obj[str[i]]++;
    }

    for (const [alpahbet, count] of Object.entries(obj)) {
        answer += `${alpahbet}${count}/`;
    }
    
    return answer.slice(0, -1);
}

console.log(solution('ahhhhz')); // a1/h4/z1

 

 

 

문제 4


주어진 배열에서 두 수를 선택하여 그 합이 주어진 target 값과 일치하는지 확인하는 함수를 작성하세요. 일치하는 경우 true, 그렇지 않은 경우 false를 반환하세요.

제한사항:

  • 배열의 길이는 2 이상 1000 이하입니다.
  • 배열의 원소는 1 이상 1000 이하의 자연수입니다.
function solution(arr, target){
    let result = false;

    for(let i=0; i<arr.length-1; i++){
        for(let j=i+1; j<arr.length; j++){
            if(Number(arr[i]) + Number(arr[j]) === target)
                result = true;
        }
    }

    return result;
}

console.log(solution([2,7,11,15], 9)); // true
console.log(solution([2,7,11,15], 13)); // true
console.log(solution([2,7,11,15], 6)); // false
console.log(solution([2,7,11,15], 26)); // true

 

 

 

문제 5


주어진 문자열이 유효한 괄호 조합인지 확인하는 함수를 작성하세요. 유효한 조합은 모든 여는 괄호가 올바르게 닫혀야 하며, 괄호의 순서도 일치해야 합니다.

제한사항:

  • 문자열의 길이는 1 이상 1000 이하입니다.
  • 괄호는 (), {}, []의 세 종류입니다.

예시:

({[]}) // 출력: true
({][}) // 출력: false

 

예시 안보고 [ { ( ) } ] 순서로 생각하고 작성한 슈도코드. 실제 코드는 [ 와 ( 가 반대

 

function solution(str) {
    let stack = [];
    let result = true;

    for (let i = 0; i < str.length; i++) {
        if (str[i] === '(') { // 소괄호 열 차례인데
            if (stack.length !== 0) { // 스택이 차있으면
                result = false; // false
                console.log('( 가 제일 바깥쪽에 위치해야 합니다.');
                break;
            } else {
                stack.push(str[i]);
                console.log('소괄호 열림');
                continue;
            }
        } else if (str[i] === '{') { // 중괄호 열 차례인데
            if (stack[stack.length - 1] === '[') { // 대괄호가 이미 열려있으면
                result = false; // false
                console.log('[ 안에 { 가 있으면 안됩니다.');
                break;
            } else {
                stack.push(str[i]);
                console.log('중괄호 열림');
                continue;
            }
        } else if (str[i] === '[') { // 대괄호는 그냥 들어가기만 하면 됨
            stack.push(str[i]);
            console.log('대괄호 열림');
        } else if (str[i] === ')') { // 소괄호 닫을 차례인데
            if (stack[stack.length - 1] !== '(') { // 소괄호가 열려있지 않으면
                result = false; // false
                console.log('괄호가 제대로 닫히지 않았습니다.');
                break;
            } else if (stack[stack.length - 1] === '(') { // 소괄호가 열려있으면
                stack.pop(); // 스택 제일 위에서 꺼냄
                console.log('소괄호 닫힘');
                continue;
            }
        } else if (str[i] === '}') { // 중괄호 닫을 차례인데
            if (stack[stack.length - 1] !== '{') { // 중괄호가 열려있지 않으면
                result = false; // false
                console.log('괄호가 제대로 닫히지 않았습니다.');
                break;
            } else if (stack[stack.length - 1] === '{') { // 중괄호가 열려있으면
                stack.pop(); // 스택 제일 위에서 꺼냄
                console.log('중괄호 닫힘');
                continue;
            }
        } else if (str[i] === ']') { // 대괄호 닫을 차례인데
            if (stack[stack.length - 1] !== '[') { // 대괄호가 열려있지 않으면
                result = false; // false
                console.log('괄호가 제대로 닫히지 않았습니다.');
                break;
            } else if (stack[stack.length - 1] === '[') { // 대괄호가 열려있으면
                stack.pop(); // 스택 제일 위에서 꺼냄
                console.log('대괄호 닫힘');
                continue;
            }
        }
    }

    if (stack.length !== 0 && result === true) {
        result = false;
        console.log('열려있는 괄호가 있습니다.');
    }
    return result;
}

console.log(solution('())'));