티스토리 뷰

 

사고의 확장

 

갑자기 길어진 지문의 길이에 놀랐지만 내가 할 수 있는 것부터 하기로 했다.

전체 문제가 어렵다면 어렵지 않을정도로 잘게 쪼개는 것.

 

따라서 어떤 방식으로 사고를 돌려야하는지 순서를 나누어 생각해보았다.

 

1. goal 배열을 차례로 검사
2. cards1 또는 cards2에서 순서대로 찾기
3. 현재 단어가 card1 인덱스에 있다면 card1을 증가, cards2에 있다면 card2를 증가
4. 어디에서도 찾을 수 없다면 No
5. 모든 단어를 순서대로 사용할 수 있다면 Yes
function solution(cards1, cards2, goal) {
    let idx1 = 0, idx2 = 0;
    
    for (let word of goal) {
        if (idx1 < cards1.length && word === cards1[idx1]) {
            idx1++; 
        }

        else if (idx2 < cards2.length && word === cards2[idx2]) {
            idx2++;
        }

        else {
            return "No";
        }
    }
    
    return "Yes";
}

 

더 나은 코드

function solution(cards1, cards2, goal) {
    for(const s of goal) {
        if(cards1[0] == s) {
            cards1.shift();
        } else if(cards2[0] == s) {
            cards2.shift();
        } else {
            return "No"
        }
    }
    return "Yes";
}

 

shift 메서드를 사용해 배열의 첫 번째 요소를 제거했다.

각 단어가 goal에 맞는지 확인하는데,

이 코드는 첫 번째 요소를 알아서 제거하므로 인덱스를 관리할 필요가 없다.

 

또, goal의 각 단어가 순서대로 단어를 사용하므로 직관적이다.

 

하지만 조금 더 나아질 수 있을 것 같다.

사실 여기서 쓰인 shift 메서드를 잘 모르기 때문에 MDN 사이트를 뒤지다가,

index가 더 적합하다는 생각을 했기 때문이다.

 

 

Array.prototype.shift() - JavaScript | MDN

shift() 메서드는 배열에서 첫 번째 요소를 제거하고, 제거된 요소를 반환합니다. 이 메서드는 배열의 길이를 변하게 합니다.

developer.mozilla.org

shift는 배열의 첫 번째 요소를 제거하고 반환하는 메서드인데

자연히 모든 요소를 한 칸씩 움직여줘야한다.

 

성능이 저하될 수 밖에 없다는 의미.

 

반면, index는 배열의 요소를 이동시키지 않기 때문에

성능이 더 좋아질 것으로 판단된다.

 

더 나아진 코드

function solution(cards1, cards2, goal) {
    let idx1 = 0, idx2 = 0;
    
    for (const s of goal) {
        if (idx1 < cards1.length && cards1[idx1] == s) {
            idx1++;
        } else if (idx2 < cards2.length && cards2[idx2] == s) {
            idx2++;
        } else {
            return "No";
        }
    }
    return "Yes";
}

 


문자열 내 p와 y의 개수

 

대문자와 소문자가 섞여있는 문자열에서 p와 y의 개수를 세고

개수가 같다면 true, 다르면 false를 반환한다.

 

function solution(s) {
    s = s.toLowerCase();
    let pCount = 0;
    let yCount = 0;

    for (let char of s) {
        if (char === 'p') {
            pCount++;
        } else if (char === 'y') {
            yCount++;
        }
    }

    return pCount === yCount;
}

 

다른 사람의 코드

function numPY(s){
    return s.toUpperCase().split("P").length === s.toUpperCase().split("Y").length;
}

 

문장이 끊기긴 하지만 확실히 간결한 매력이 있다.


문자열을 정수로 바꾸기

 

문자열을 숫자로 변환하는 문제이다.

function solution(s) {
    return parseInt(s);
}

 

생각보다 간단한 문제라 당황했다.

다음은 그냥 새롭게 배운 다른 사람의 코드다.

 

다른 사람의 코드

function strToInt(str){
  return str/1
  }

 

JavaScript에서는 피연산자 중 하나가 숫자가 아니라면,

다른 피연산자에 따라 타입 변환을 시도한다.

 

이 경우는 문자열을 숫자로 변환한 셈 치는거다.

 


하샤드 수

 

이 문제는 주어진 숫자의 각 자릿수 합을 구한다.

그 합으로 원래 숫자가 나눠지는지를 확인하면 된다.

 

문제 해결 과정

 

1. 자릿수 합산

2. 나누어 떨어지는지 확인

 

function solution(x) {
    const sumOfDigits = x.toString().split('').reduce((acc, digit) => acc + parseInt(digit), 0);
    
    return x % sumOfDigits === 0;
}

 

댓글