고양이와 코딩

[프로그래머스] 12월18일 ~ 12월25일 본문

javascript

[프로그래머스] 12월18일 ~ 12월25일

ovovvvvv 2023. 12. 18. 23:49
728x90

12월18일

특별한 이차원 배열2

 

내 풀이

function solution(arr) {
    for (let i = 0; i < arr.length; i++){
        for (let j = 0; j < i; j++){
            if (arr[i][j] !== arr[j][i]){ 
                return 0; 
            }
        }
    }
    return 1; 
}

만약 if문을 

if (arr[i][j] === arr[j][i]){
	return 1;

이런식으로 작성하면 오류가 나는데요 !! 문제에서는 모든 조건이 같은 경우에 1을 리턴하도록!! 을 말하는 것 같아요..

그래서 같은 경우가 하나 나왔을때 바로 1을 return 해버리면 안댐 ..

 

 

정사각형으로 만들기

 

내 풀이

function solution(arr) {
    const rowNum = arr.length;
    const colNum = arr[0].length;
    
    // 행의 수가 열의 수보다 많으면 열의 수를 현재 행의 수와 동일하게 맞춰준다
    if (rowNum > colNum) {
        for (let i = 0; i < rowNum; i++) {
            while (arr[i].length < rowNum) {
                arr[i].push(0);
            }
        }
    }
    // 열의 수가 행의 수보다 많으면 행의 수를 현재 열의 수와 동일하게 맞춰준다
    else if (colNum > rowNum) {
        while (arr.length < colNum) {
            arr.push(new Array(colNum).fill(0));
        }
    }
    
    return arr;
}

 

 

이차원 배열 대각선 순회하기

 

처음 코드

function solution(board, k) {
    var answer = 0;
    
    for (let i = 0; i < board.length; i++){
        for (let j = 0; j < i; j++){
            if (i + j <= k){
                answer += board[i][j];
            }
        }
    }
    return answer;
}

여기서 두 번째 for문의 조건에 문제가 있습니다!
j가 i보다 작을 때만 반복하도록 설정하면 j가 i보다 작을 때만 반복하게 되므로 이렇게 하면 안됩니다 ㅎㅎ

 

제출 코드

function solution(board, k) {
    var answer = 0;
    
    for (let i = 0; i < board.length; i++){
        for (let j = 0; j < board[i].length; j++){
            if (i + j <= k){
                answer += board[i][j];
            }
        }
    }
    return answer;
}

 

 

이걸로 기초 문제를 끝냈어요 ~~~ ( ´͈ ꇴ  `͈)੭⁾⁾·°˖✧˖°

 

 

12월19일

[PCCP 기출문제] 1번 / 붕대 감기

 

내 풀이

function solution(bandage, health, attacks) {
    let time = 0;
    const [t, heal, y] = bandage;
    let currentHealth = health;
    let continuousSuccess = 0; // 연속 성공 횟수
    const maxHealth = health;

    attacks.sort((a, b) => b[0] - a[0]);
    const lastAttackTime = attacks[0][0];

    for (time = 0; time <= lastAttackTime; time++) {
        let isAttacked = false; // 몬스터의 공격을 받았는지 여부

        // 공격 시간에 따라 현재 체력 갱신
        for (let i = 0; i < attacks.length; i++) {
            if (time === attacks[i][0]) {
                currentHealth -= attacks[i][1];
                isAttacked = true; // 공격을 받음
                continuousSuccess = 0; // 공격 받으면 연속 성공 초기화
            }
        }

        // 연속으로 붕대 감기를 성공한 경우
        if (!isAttacked && currentHealth < maxHealth) {
            currentHealth += heal;
            continuousSuccess++;

            // 붕대 감기로 회복한 경우 추가 회복량 적용
            if (continuousSuccess === t) {
                currentHealth += y;
                continuousSuccess = 0; // 추가 회복 적용 후 연속 성공 초기화
            }

            // 최대 체력 초과 방지
            if (currentHealth > maxHealth) {
                currentHealth = maxHealth;
            }
        }

        // 현재 체력이 0 이하라면 -1 반환 후 종료
        if (currentHealth <= 0) {
            return -1;
        }
    }

    return currentHealth; // 마지막 공격 시간 이후 남은 체력 반환
}

처음에는 while문을 사용해서 time <= lastAttackTime 의 조건을 걸고, time++로 시간을 증가시키는 코드를 작성했는데
몇 테스트 케이스가 계속 통과하지 못했습니다 .. 
찾아보니 for문을 사용해 time을 증감식으로 작성하면 루프가 반복 될 때 마다 조건을 검사하고 time이 증가하는데,

while문을 저렇게 작성하면 이미 time이 증가하고 조건을 보게 되어 문제가 발생한다고 합니다 !

 

또 continuousSuccess = 0으로 추가 회복을 적용 한 후 연속 성공 변수를 초기화 시켜주는걸 생각도 못하고 있어서 계속 테스트 케이스를 통과하지 못했네요 ,,, ㅎㅎ,,,,,,,,,

 

짝수와 홀수

 

내 풀이

function solution(num) {
    return num % 2 == 0 ? "Even" : "Odd";
}

 

약수의 합

 

내 풀이

function solution(n) {
    let answer = 0;
    
    for (let num = 1; num <= n; num++){
       if (n % num === 0){
           answer += num
       }
    }
    return answer;
}

 

 

12월21일

나머지가 1이 되는 수 찾기

 

내 풀이

function solution(n) {
    for (let i = 0; i < n; i++){
        if (n % i == 1){
            return i;
        }
    }
}

 

다른 사람의 풀이

function solution(n, x = 1) {    
    while (x++) {
        if (n % x === 1) {
            return x;
        }
    }    
}

while문 조건으로 증감을 넣을수 있다는 사실을 알았다 !!

 

문자열을 정수로 바꾸기

 

내 풀이

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

 

 

 

평균 구하기

 

내 풀이

function solution(arr) {
    let answer = 0;
    
    arr.forEach((value) => {
        answer += value;
    })
    const avg = answer / arr.length;
    
    return avg;
}

 

 

최댓값과 최솟값

 

내 풀이

function solution(s) {
    const arr = s.split(" ").map(Number);
    
    const max = Math.max(...arr);
    const min = Math.min(...arr);
    
    return `${min} ${max}`;
}

템플릿 리터럴 사용

 

다른 사람의 풀이

function solution(s) {
    const arr = s.split(' ');

    return Math.min(...arr)+' '+Math.max(...arr);
}

 

문자열인데 max, min 사용이 된다니요,,,

자유로운 우릴 봐 자유로워

 

 

JadenCase 문자열 만들기

 

 

내 풀이

function solution(s) {
    const words = s.toLowerCase().split(" ");

    for (let i = 0; i < words.length; i++) {
        if (words[i].length > 0) {
            words[i] = words[i][0].toUpperCase() + words[i].substring(1);
        }
    }

    return words.join(" ");
}

맨 첫 글자만 대문자로 바꾸고 substring(1)로 인덱스 1부터 문자열 끝까지를 반환한다.

 

 

12월23일

최솟값 만들기

 

내 풀이

function solution(A,B){
    A.sort((a, b) => a - b); // 오름차순 정렬
    B.sort((a, b) => b - a); // 내림차순 정렬
    
    let answer = 0;

    for(let i = 0; i < A.length; i++){
        answer += A[i] * B[i];
    }

    return answer;
}

배열에서 가장 큰 값, 다음 배열에서 가장 작은 값을 곱해주면 되므로 정반대로 정렬 한 뒤 곱한다.

 

 

이진 변환 반복하기

 

 

12월25일

타겟 넘버(DFS탐색)

 

내 풀이(한 50퍼만)

function solution(numbers, target) {
    let answer = 0;
    
    const dfs = (idx, sum) => {
        if(idx === numbers.length) {
            if(sum === target) {
                answer++;
            }
            return;
        }
        
        // 현재 숫자를 더하거나 빼는 경우를 재귀탐색
        dfs(idx + 1, sum + numbers[idx]);
        dfs(idx + 1, sum - numbers[idx]);
    };
    
    dfs(0, 0);
    return answer;
}

입력값이 [4, 1, 2, 1] , 4 인 경우에