고양이와 코딩

[프로그래머스] 1월16일 ~ 1월21일 본문

javascript

[프로그래머스] 1월16일 ~ 1월21일

ovovvvvv 2024. 1. 16. 16:05
728x90

1월16일

행렬의 덧셈

 

내 풀이

function solution(arr1, arr2) {
    const numRows = arr1.length;
    const numCols = arr1[0].length;
    const result = [];
    
    for (let i = 0; i < numRows; i++){
        const resultRows = [];
        for (let j = 0; j < numCols; j++){
            const sum = (arr1[i][j] + arr2[i][j]);
            resultRows.push(sum);
        }
        result.push(resultRows);
    }
    
    return result;
}

 

다른 사람의 풀이

function sumMatrix(A,B){
    return A.map((arr1, idx1) => arr1.map((val, idx2) => val+B[idx1][idx2]));
}
  1. A.map에서 첫 번째 행 arr1 = [1, 2]을 선택합니다.
  2. arr1.map에서 첫 번째 요소 val = 1에 대해 B[0][0]를 더합니다. 결과는 1 + 3이므로 첫 번째 결과 행의 첫 번째 요소는 4가 됩니다.
  3. 동일한 방식으로 arr1.map이 진행되고, 두 번째 요소도 더해져서 결과 행의 두 번째 요소가 결정됩니다.
  4. 이 과정을 모든 행과 모든 요소에 대해 반복하여 최종적으로 행렬 덧셈의 결과가 반환됩니다.

좀 더 복잡한 예시로 두 번째 입력인 A = [[1], [2]]와 B = [[3], [4]]를 사용해도 같은 방식으로 동작합니다. 함수는 각 위치의 값에 대해 A와 B의 값을 더해 새로운 행렬을 생성합니다.

 

직사각형 별찍기

 

내 풀이

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]), b = Number(n[1]);
   
    for(let i = 0; i < b; i++){
        console.log("*".repeat(a));
    }
});

 

 

 

최대공약수와 최소공배수

 

내 풀이

function solution(n, m) {
    let result = [];
    let mul = n * m;
    let gcd = 0;
    let lcm = 0;
    
    while ( m !== 0){
        const temp = m;
        m = n % m;
        n = temp;
    }
    gcd = n;
    
    lcm = mul / gcd;
    
    return [gcd, lcm];
}

 

다른 사람의 풀이

function gcdlcm(a, b) {
    var r;
    for(var ab= a*b;r = a % b;a = b, b = r){}
    return [b, ab/b];
}

개발자 그만 둘래요...ㅠㅠ~~~

 

 

 

1월19일

3진법 뒤집기

 

내 풀이

function solution(n) {
    let reversedBase3 = n.toString(3).split('').reverse().join('');
    const result = parseInt(reversedBase3, 3);
    return result;
}

parseInt() 함수의 두 번째 인수는 기수(진법)을 나타내기 때문에 여기에 3을 전달하여 3진법으로 해석하도록 지정 해 줄수 있습니다

 

 

 

1월20일

예산

 

내 풀이

function solution(d, budget) {
    let sorted_d = d.sort((a, b) => a - b);
    let count = 0;
    let sum = 0;
    let index = 0;

    while (index < sorted_d.length) {
        sum += sorted_d[index];
        if (sum <= budget) {
            count++;
        }
        index++;
    }

    return count;
}

처음엔 while문 안에 forEach를 사용했는데, 무한루프에 빠져버렸다

그냥 while문을 사용하고 index를 증가하는 방식으로 변경

 

for문이 성능은 제일 좋다고 한다 ㅎㅎ

function solution(d, budget) {
    let sorted_d = d.sort((a, b) => a - b);
    let count = 0;
    let sum = 0;

    for (let i = 0; i < sorted_d.length; i++) {
        if (sum + sorted_d[i] <= budget) {
            sum += sorted_d[i];
            count++;
        } else {
            break; 
        }
    }

    return count;
}

 

 

 

1월21일

이상한 문자 만들기

문제가 잘 안풀린다면? 이 있다면 1트에 성공할수 없다는것이.. 학계의 정설

아무튼 이 문제에서 생각해야할건

  1.  문자열의 앞 뒤에 공백이 있는 경우
  2. 공백을 기준으로, 각 단어별 홀/짝 을 판단해야함 (문자열 전체 0,1,2,3,.. 을 세는게 아님)
function solution(s) {
    let isEvenIndex = true;
    let result = [];

    for (let i = 0; i < s.length; i++) {
        if (s[i] === ' ') {
            // 공백을 만나면 홀짝 기준 초기화
            isEvenIndex = true;
            result.push(' ');
        } else {
            result.push(isEvenIndex ? s[i].toUpperCase() : s[i].toLowerCase());
            isEvenIndex = !isEvenIndex;
        }
    }

    return result.join('');
}