배꼽파지 않도록 잘 개발해요

다이아몬드를 찾아라 - for...of를 이용한 문자열 탐색 (Javascript) 본문

코딩테스트/그밖의출처

다이아몬드를 찾아라 - for...of를 이용한 문자열 탐색 (Javascript)

꼽파 2023. 12. 12. 13:35


 

요즘 취업 때문에 부트캠프에 지원하고 있는 와중, 코딩테스트라는 것을 처음 접하게 되었다.

12월 초에는 다른 직무 면접과 자격증 시험 준비를 하느라 코딩은 손을 떼고 있었다.

당시에는 프로그래머스 레벨 0단계 문제도 거의 풀지 않아서 쉬운 문제만 간신히 클리어하였다.

지금 본격적으로 문제를 푼지 3일째 되었지만 실력이 늘어나는 것이 느껴진다.

 

지원한 부트캠프 5곳 중에서 코딩테스트를 보는 곳이 총 두 군데였다.

아래는 풀었지만 정확도가 80%정도로 나와서 다시 점검해보려고 비슷하게 복기해본 문제이다.


문제

문자열이 입력되면 해당 문자열에 'd', 'i', 'a', 'm', 'o', 'n', 'd'가 순서대로 들어 있으면 true를 반환, 그렇지 않으면 false를 반환하도록 하라.

 

입출력 예시

weodkigwaenmvoqznsd true  diamond를 찾을 수 있음
dwrqwndomasdfid false  diamond가 거꾸로 있음
diamonddiamond true  diamond를 찾을 수 있음
zxbananaapple false diamond가 없음

풀이 

for...of문을 이용한 문자열 탐색

function findDiamond(input) {
    
    let target = 'diamond';  // 찾을 단어
    let index = 0;  // 문자열이 몇 번째 글자인지 나타내는 인덱스
    let is_it_diamond = '';  // 찾을 단어의 글자와 일치하는 글자를 저장 

    // input이 문자열이라서 for...of문으로 letter 변수에 글자 하나씩 순회함.
    for (const letter of input) {  
        
        // 찾을 단어의 글자와 해당 글자가 일치하면 저장
        if (letter === target[index]) {  
            is_it_diamond += letter
            index++; // 인덱스의 값을 하나씩 증가시킴    
        }       
    } 

    // is_it_diamond에 저장된 문자가 target과 일치하면 true 출력
    answer = is_it_diamond === target ? true : false
    return answer
}

// 입력값
input = 'dwrqwndomasdfid'  

// 출력값
let output = findDiamond(input)
console.log(output)

 

문자열인 입력값이 들어오면 순서대로 문자열을 탐색하여 일치하는지 확인하는 방식으로 진행된다.


주의할 점

  • 문자열을 순회하여 단순히 있는지 여부 따지면 안 됨. (순서가 뒤바뀔 수 있음)
function findDiamond(input) {
    
    let answer = false;  // 불린값을 출력할 변수

    // for문으로 문자열 탐색
    for (let i = 0; i < input.length; i++) {
        
        let currentChar = input[i];

        // 만약 'd', 'i', 'a', 'm', 'o', 'n', 'd' 글자가 하나라도 없으면 false 반환
        if (currentChar === 'd' || currentChar === 'i' || currentChar === 'a' ||
            currentChar === 'm' || currentChar === 'o' || currentChar === 'n') {
        } else {
            answer = false;
            break;
        }
    }

    // for문 종료시 answer = false가 아니면 true가 반환되도록 함.
    if (!answer) {
        answer = true;
    }

    return answer;
}

// input 값
let input = 'dwrqwndomasdfid';

// output 값
let output = findDiamond(input);
console.log(output);

 

diamond에 해당하는 모든 알파벳이 있기만 하면 순서가 뒤죽박죽인 경우로도 'true'로 출력되기 때문에 해당 코드는 논리적인 오류가 있음. 

내가 이렇게 풀어서 틀렸음.

 

  • 순서를 고려하지 않는다면 정규표현식으로도 쉽게 찾을 수 있다.
function findDiamond(input) {
    let regex = /diamond/g;
    let matches = input.match(regex)
    let answer = (matches != null) && (matches.length >= 7)
    return answer;
}

let input = 'weodkigwaenmvoqznsd';
let output = findDiamond(input);
console.log(output);

 

  • 기업 채용에서 실시하는 코딩테스트는 경향을 잘 모르겠지만, 난이도가 쉬운 문제 중에서는 문자열 다루는 유형이 꽤 많은 것 같다.
  • 특히 알파벳 대소문자 활용하는 것과 한글자씩 탐색하는 유형을 많이 본 듯함. 
728x90