그저 내가 되었고

항해99) 2주차:: 코딩테스트 연습(1~14); How I solved + more 본문

개발/항해99 9기

항해99) 2주차:: 코딩테스트 연습(1~14); How I solved + more

hyuunii 2022. 9. 24. 23:17

🎯 문제 접근법

짧게 훑어본 결과 문제를 크게 세 가지 갈래로 나눌 수 있는 것 같다.

 

   1. 그냥 JS 문법을 베이직하게 묻는 문제

2-1. 수학적 아이디어에 JS 문법을 조금 써서 푸는 문제

2-2. 수학적 아이디어에 JS 문법(특히 함수)를 많이 써서 푸는 문제

 

1👉🏻 문법을 알면 바로 풀면 되고, 모르면 구글링하면 바로 나옴

2👉🏻

 2.1)수학적 아이디어를 캐치하고

 2.2)그걸 JS로 어떻게 구현할지 스케치한 후

 2.3) 적절한 문법을 활용할 수 있어야 함. 이 과정에서 생각지도 못한 방법을 많이 쓸 수 있음. How? JS는 JS엔진을 구동시킬 수 있으니까, 내장된 함수, 객체, 라이브러리 등등 사용해서 다양한 방법으로 풀이 가능한 것. 또한, 생각한대로 풀 수 없을 수도 있음. 최대한 러프하게 아이디어를 짜되 구글링했을 때 현실화가 어렵다 싶으면 빨리 버리고 새 방법을 찾아야 함.


🎈 Today's my BEST

1. 직사각형 별찍기

How I solved👇🏻

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

Study more👇🏻

- Variables; var vs let vs const

- consol.log() vs return

 

 

 

2. 짝수와 홀수

How I solved👇🏻

function solution(num) {
   if (num % 2 == 0) {
       return "Even"
   } { return "Odd"}
}

 

 

 

3. 가운데 글자 가져오기

How I solved👇🏻

  function solution(s) {
        var len = s.length;
        if (len % 2 == 0) {
            return ((s.charAt(parseInt(len % 2) + 1)) + (s.charAt(parseInt(len % 2)+2)))
        } {return s.charAt(parseInt(len % 2)+1)
        }
    }

→turns out.. the wrong answer.... why😭😭😭😭😭😭

 

Model Answer👇🏻

function solution(s) {
    if (s.length % 2 === 0) {
        return s.substring(parseInt(s.length / 2)-1, parseInt(s.length / 2)+1)
    } else {
        return s.substring(parseInt(s.length / 2), parseInt(s.length / 2)+1)  
    }
}
function solution(s) {
  return s.substring(Math.ceil(s.length / 2) - 1, Math.floor(s.length / 2) + 1);
}

▶두 번째 풀이 진짜 인상깊네. string에 substring 메소드가 있었는지 전혀 몰랐고요.......

올림, 내림을 '아이디어적'으로만 생각했지 '구체적인 수학 식'으로는 뱉어내지 못했는데 ㄷ ㄷ 

저런 방법이.........!!!!! 신박하당

 

 

Study more👇🏻

- parseInt

- charAt

 

 

 

 

4. 두 정수 사이의 합

How I solved👇🏻

function solution(a, b) {
    return (a+b)*(Math.abs(b-a)+1)/2;
    }

Study more👇🏻

- Math.abs()

 

 

 

5. 문자열을 정수로 바꾸기

How I solved👇🏻

function solution(s) {
    return (s/1)
}

 

 

 

6. 없는 숫자 더하기

: 0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

 

How I solved👇🏻

function solution(numbers) {
    const allNb = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    arr = allNb.filter(x => !numbers.includes(x));
    
    var sum = arr.reduce((a, b) => a + b, 0);
    return sum
    }
    
    or
    
    function solution(numbers) {
    let oneToNine = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    let temp = oneToNine.filter(x => !numbers.includes(x));

    let sum = 0;
    for (i = 0 ; i < temp.length ; i++) {
        sum += temp[i]
    }
    
    return sum
}

Study more👇🏻

- const ___ = [ _, _, _, ....] (how to make an array exactly?)

- ___.filter(x => !numbers.includes(x));

- ___.reduce((a, b) => a+b, 0);

 

 

 

7. 음양 더하기

How I solved👇🏻

function solution(absolutes, signs) {
    let sum = 0;
    for ( i = 0 ; i < signs.length ; i++) {
        if (signs[i] === true) {
            sum += absolutes[i]
        }
    }
    for ( i = 0 ; i < signs.length ; i++) {
        if (signs[i] === false) {
            sum -= absolutes[i]
        }
    }
    return sum
}

or

function solution(absolutes, signs) {
    let answer = 0;
    for (let i = 0; i < absolutes.length; i++) {
        if (signs[i] === true) {
            answer +=  absolutes[i];
        } else {
            answer -= absolutes[i];
        }
    }
    return answer
}

Idea👇🏻

- You don't need to match symbols and numbers 1:1 or -1/1 and numbers but just do minus when it comes to false comes, and do plus when true comes.

 

 

 

8. 평균 구하기

How I solved👇🏻

function solution(arr) {
    let sum = 0
    for (let i = 0; i < arr.length; i++) {
    sum += arr[i];
    }
    var answer = sum/(arr.length);
    return answer
}

of

function solution(arr) {
    const avg = arr.reduce((acc, curr) => acc + curr) / arr.length;
    return avg
}

Study more👇🏻

- still confusing... sum += arr[i];

 

 

 

9. 핸드폰 번호 가리기

How I solved👇🏻

function solution(phone_number) {
    var len = phone_number.length
    const ast = "*".repeat(len-4);
    var answer = ast + phone_number.substring(phone_number.length-4);
    return answer;
}

or

function solution(phone_number) {
   let num = phone_number.toString();
   let nums = num.slice(-4);
   let answer = "*".repeat(phone_number.length - 4) + nums
   return answer
}

Study more👇🏻

- _____.substring();

- ___.slice(_);

 

 

 

10. 행렬의 덧셈⭐

How I solved👇🏻

function solution(arr1, arr2) {   
    var answer = [];
    for (let i=0; i<arr1.length; i++) {
        let temp = [];
        for (let j=0; j<arr1[i].length; j++) {
            arrays = arr1[i][j] + arr2[i][j];
        }
         answer.push(temp);
    }
    return answer;
}

→TOTALLY Wrong answer. Well, not "TOTALLY" but just missed tiiiiinitiny codes..... anyway still don't couldn't solve it

→중첩 for문을 돌 때, 뭘 얼마나 돌게 하는지 헷갈렸음

→(위의 내 답안을 맞게 하려면) 두 번째 for문 안에서 arrays라는 변수를 만들고(var arrays = arr1[i][j] + arr2[i][j];) 난 후 바로 temp에 그 결과를 push 했어야 함(temp.push(arrays);)

→즉, 두 번째 for문 안에서 배열을 한 번 만들어 값을 집어넣고, 바깥의 for문에서도 한 번 더 배열을 만들어 값을 넣어야 함.

 

Correct Answer👇🏻

function solution(arr1, arr2) {   
    var answer = [];
    for (let i = 0 ; i < arr1.length ; i++) {
        var temp = [];
        for (let j = 0 ; j < arr1[i].length ; j++) {
            var arrays = arr1[i][j] + arr2[i][j];
            temp.push(arrays);
        }
        answer.push(temp);
    }
    return answer;
}

 

Model Answer👇🏻

function solution(arr1, arr2) {   
    var answer = [];
    for (let i = 0; i < arr1.length; i++) {
        var temp = [];
        for (let j = 0; j < arr1[i].length ; j++) {
            temp.push(arr1[i][j] + arr2[i][j]);
        }
        answer.push(temp)
    }
    return answer;
}
function solution(A, B) {
    return A.map((a, i) => a.map((b, j) => b + B[i][j]));
}


///.........진짜 이거면 답 나옴...............

 

Study more👇🏻

- let temp = [ ];

- ___.push(temp);

 

 

 

11. x만큼 간격이 있는

How I solved👇🏻

function solution(x, n) {
    let temp = [];
    for(let i = 1; i < n+1 ; i++) {
        temp.push(x * i);
    }
    return temp;
}

Study more👇🏻

- let temp = [ ];

- temp.push(__);

 

 

 

12. 부족한 금액 계산하기

How I solved👇🏻

function solution(p, m, c) {
    var howMuch = m - p*((c*(c+1))/2)
    if (howMuch < 0) { 
    return Math.abs(howMuch);
    } else {
    return 0;
    }
}

 

 

 

13. 2016년

How I solved👇🏻

function solution(a, b) {
    const date1 = new Date(2016, 0, 1);
    const date2 = new Date(2016, a-1, b);
    
    const elapsedMSec = Math.ceil(
        date2.getTime() - date1.getTime());
    const elapsedDay = 
          elapsedMSec / (1000 * 60 * 60 * 24);
    
    const remain = (elapsedDay % 7);
    
    if (remain == 0) {return "FRI"}
    else if (remain == 1) {return "SAT"}
    else if (remain == 2) {return "SUN"}
    else if (remain == 3) {return "MON"}
    else if (remain == 4) {return "TUE"}
    else if (remain == 5) {return "WED"}
    else if (remain == 6) {return "THU"}
}

@if문을 for문으로 바꿀 수 없을까..? 너무 원시적인 느낌이 난다.

@처음에 1월을 0으로 표기하는걸 몰라서(...) 채점하면 me

한 3문제 정도만 계!!!!!속 틀리게 나와서 "아니 식이 맞는데 왜이래!?!!?!" 하면서 진짜 개---빡쳤었는데.... 알고보니 내가 함수를 제대로 모르고 진짜 마구 달려드느라 그런거였단걸 깨닫고......... 반성했다..... 제대로 알고 또는 알아보면서 쓰자ㅠ

 

How I solved👇🏻

찝찝해서 특별한 함수 안쓰고 그냥 풀려고 했는데...... 제출하면 3개 맞고 나머지는 틀리게 나온다............

아니 이유를 모르겟네.............? 왜................................?

function solution(a, b) {
    let day = ["FRI","SAT","SUN","MON","TUE","WED", "THU"];
    let lastdate = [31,29,31,30,31,30,31,31,30,31,30,31];
    
    for (i = 0; i < a-1 ; i++) {
        var sum = 0;
        var sum = sum + lastdate[i];
    }
    
    let remain = (sum + b-1) % 7;
    let answer = day[remain];
    return answer
}

 

To Correct👇🏻

scope 문제였음... let sum = 0을 밖으로 빼줘야 함ㅠ

왜?!??!!?!?!?! 왜냐면 이거를... for문 안에서 선언해버리면 재할당이 안됨. 밖에서  먼저 선언해주고 들어와야 for문을 돌면서 계속 그 값이 바뀌어 나감.........!!!!!!!!!!!!!⭐

function solution(a, b) {
  let day = ["FRI","SAT","SUN","MON","TUE","WED","THU"];
  let lastdate = [31,29,31,30,31,30,31,31,30,31,30,31];
  
  let sum = 0;
  for (i = 0; i < a-1 ; i++) {
      sum = sum + lastdate[i];
  }
  
  let remain = (sum + b-1) % 7;
  let answer = day[remain];
  
  return answer
}

Study more👇🏻

- Math.ceil(____)

 

 

 

14. 나누어 떨어지는 숫자 배열

How I solved👇🏻

function solution(arr, divisor) {
    var maybe = [];
    for (i=0; i<arr.length; i++) {
        if (arr[i] % divisor == 0) {
            maybe.push(arr[i]);
        }
    }
    if (maybe.length !== 0 ) {
        return maybe.sort(function(a, b) {
    return a - b;
    });  
    } else { return [-1] }
}

Study more👇🏻

- Ascending order:

return maybe.sort(function(a, b) {
   return a - b;

});  


🎨 소회 및 향후 공부 방향

일단, 개념을 다 정리하고 문법을 다 보고.. 그리고 문제를 열어봐야지!!! 하지 않았던 나 자신을 칭찬해,,,

문제 먼저 보면 너무 겁먹을까봐 그냥 미루려다가 에라이~! 싶어서 봤고, 물론 겁은 먹었는데(ㅋㅋ기본으로 깔렸던 코드가 너무나도 생경했음;;) 그래서 더욱 필요한 개념이나 풀이법을 찾아보려 달려들었던 것 같다.

다음주 목요일날 당장 알고리즘 테스트를 봐야한다. 일주일만에 모든 개념이나 문법을 싹 잡고 시험을 치는건 불가능하다.

그러므로 지금처럼 문제를 꾸준히 접하면서 그때그때 필요한 개념을 정리하는게 맞겠다.

사실 오늘.. 14문제나 보고 풀 생각은 없었는데;; 다른 사람들 현황표에 O 늘어보니까 지기 싫어섴ㅋㅋㅋㅋㅋㅋ 그냥 계속 풀었네. 사실 재밌기도 했고😌😎📚📚!!

어쨌든, 오늘 문제 풀면서 공부할 게 많이 쌓였으므로 내일은 저것들 쭉 다 정리하고 알고리즘 문제 몇 개 더 풀어 보기로 하자~!