고양이와 코딩

[프로그래머스] 2월3일 ~ 2월15일 본문

javascript

[프로그래머스] 2월3일 ~ 2월15일

ovovvvvv 2024. 2. 3. 22:20
728x90

2월3일

크기가 작은 부분문자열

 

내 풀이

function solution(t, p) {
    const p_len = p.length;
    let count = 0;
    let result = [];
    
    for (let i = 0; i <= t.length - p_len; i++){
        result.push(t.substring(i, i + p_len));
        
        if(Number(result[i]) <= Number(p)) {
            count++;
        }
    }
    
    return count;
}

 

 

2월5일

삼총사

 

풀이 

function solution(number) {
    let count = 0;
    
    for (let i = 0; i < number.length; i++){
        for(let j = 0; j < number.length; j++){
            for(let k = 0; k < number.length; k++){
                // 서로 다른 인덱스를 가진 경우에만 계산
                if (i !== j && j !== k && i !== k) {
                    // 합이 0인 경우 answer 증가
                    if (number[i] + number[j] + number[k] === 0){
                        count += 1;
                    }
                }
            }
        }
    }
    // 중복 순열을 고려하여 각 경우의 수를 6으로 나누어 준다
    return count / 6;
}

조합을 사용 해 보려고 했는데 .... 너어무 어려워서 결국 ㅎ ㅎ남의 코드를 봤다! 

이해하면 된거 아니겠는가...

i = 0, j = 0, k = 0
i = 0, j = 0, k = 1
i = 0, j = 0, k = 2
i = 0, j = 0, k = 3
i = 0, j = 0, k = 4
i = 0, j = 0, k = 5

i = 0, j = 1, k = 0
i = 0, j = 1, k = 1
i = 0, j = 1, k = 2
i = 0, j = 1, k = 3
i = 0, j = 1, k = 4
i = 0, j = 1, k = 5

for문은 이런식으로 작동하며 조건을 거치면 

입력값: [-2, 3, 0, 2, -5]

i : 0, j : 2, k : 3
i : 0, j : 3, k : 2
i : 1, j : 3, k : 4
i : 1, j : 4, k : 3
i : 2, j : 0, k : 3
i : 2, j : 3, k : 0
i : 3, j : 0, k : 2
i : 3, j : 1, k : 4
i : 3, j : 2, k : 0
i : 3, j : 4, k : 1
i : 4, j : 1, k : 3
i : 4, j : 3, k : 1

이렇게 작동한다

 

2월15일

최소직사각형

가로x세로에 너무 집착하면 머리가 빙빙 돌게된다. 

sizes[i][0]과 sizes[i][1]을 비교해서 더 큰 값은 width라고 하고, 작은 값은 height라고 가정하고 풀면 된다 ! (반대로도 가능)

 

내 풀이

function solution(sizes) {
    let width = [];
    let height = [];

    for (let i = 0; i < sizes.length; i++) {
        if (sizes[i][0] < sizes[i][1]) {
            width.push(sizes[i][1]);
            height.push(sizes[i][0]);
        } else {
            width.push(sizes[i][0]);
            height.push(sizes[i][1]);
        }
    }
    const maxWidth = Math.max(...width);
    const maxHeight = Math.max(...height);

    return maxWidth * maxHeight;
}

 

 

시저 암호

이건,, 잘 모르겠어서 gpt의 도움을 받았다 ㅎㅎ

 

풀이

function solution(s, n) {
    let result = "";

    for (let i = 0; i < s.length; i++) {
        if (s[i] === " ") {
            result += " ";
            continue;
        }
        // 대문자인 경우
        if (s[i] >= "A" && s[i] <= "Z") {
            result += String.fromCharCode(((s[i].charCodeAt() - 65 + n) % 26) + 65);
        }
        // 소문자인 경우
        else if (s[i] >= "a" && s[i] <= "z") {
            result += String.fromCharCode(((s[i].charCodeAt() - 97 + n) % 26) + 97);
        }
    }

    return result;
}

charCodeAt이랑 fromCharCode는 생소했지만, 이름으로 대충 어떤 역할을 하는 메서드인지 파악이 가능하다.

 

`String.fromCharCode()`는 유니코드 코드 포인트로부터 문자열을 생성하는 메서드인데, 즉 String.fromCharCode(65)는 "A" 를 반환한다.

`charCodeAt()`은 문자열에서 주어진 인덱스에 해당하는 문자의 유니코드 코드 포인트를 반환한다.  즉 "A".charCodeAt()은 65를 반환한다.

 

위 코드에서는 알파벳을 숫자로 바꾼 다음 다시 문자로 바꾸는데 사용되었다고 이해하면 될 것 같다.

 

  1. s[i].charCodeAt() - 65: 문자 s[i]의 ASCII 코드 값에서 대문자 A의 ASCII 코드 값(65)을 뺀 값을 계산합니다. 이를 통해 해당 문자가 알파벳 대문자 중에서 몇 번째 문자인지를 파악
  2. (s[i].charCodeAt() - 65 + n) % 26: 밀어야 하는 거리 n을 더한 후에 알파벳 길이인 26으로 나누어 줍니다. 이를 통해 알파벳을 한 바퀴 돌게 될 경우를 처리
  3. String.fromCharCode(...)을 사용하여 유니코드 코드 포인트를 문자로 변환

마지막에 65와 97을 더해주는 이유는 알파벳을 밀 때 대소문자를 구분해서 처리해야 하기 때문이다!

 

 

 

한동안 코테를 안풀었더니 머리가 굳었다악!!!
앞으로 열심히 해야지 ㅎㅎ