문제

 

풀이 코드

function solution(a, b) {
    const monthDays = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    const weekDay = ['FRI','SAT','SUN','MON','TUE','WED','THU'];
    let days = 0;
    for (let i = 0; i < a - 1; i++)
        days += monthDays[i];
    days += b;
    
    const checkDay = days % 7 - 1
    return weekDay[checkDay < 0 ? 6 : checkDay];
}

 

풀이 과정

우선, 각 달마다 일수를 monthDays 배열에 담아 주었다,

그리고 요일의 정보를 weekDay 배열에 담아 주었다.

 

문제가 1월 1일부터 시작이니, days 변수에

입력된 월과 일을 계산하여, 해당 일자 까지의 총 일수를 더해주었고,

 

해당 일수를 7로 나누었을때 나머지값에 해당하는 부분이 해당 요일이 되기 때문에

index 접근을 위해 - 1을 해주었다.

 

지금 이 글을 적으면서 생각한건데, 요일 정보의 배열을 THU 부터 시작하면 굳이 -1 을 하지 않아도 됐을거같다.

그러면 마지막에 인덱스 범위 넘어갔을때 처리하는 로직을 굳이 하지 않아도 됐는데,

 

문제를 풀고나서 한번더 코드를 보며 생각을 해봐야 할것 같다!

 

다른사람의 풀이

function getDayName(a,b){
  var date = new Date(2016, (a - 1), b);
    return date.toString().slice(0, 3).toUpperCase();
}

date 객체를 이용할수도 있었다

대박!

문제

 

풀이 코드

function solution(sizes) {
  const largeNum = sizes.map((item) => (item[0] < item[1] ? item[1] : item[0]));
  const smallNum = sizes.map((item) => (item[0] > item[1] ? item[1] : item[0]));

  return Math.max(...largeNum) * Math.max(...smallNum);
}

 

풀이 과정

20분 정도를 어떻게 풀어야 할지 고민을 했다.

해당 문제는 사고력 문제인거 같았고, 스스로 아무리 고민해도 해결할 수 없을것 같았다.

 

그래서 구글링을 통해 개념만 파악했다.

해당 문제의 해결 방법은 다음과 같다.

1. 각 2차원 배열 내에서, 각 요소마다 큰수와 작은수가 반드시 나뉘어 진다. ( 명함을 정사각형으로 만들지 않을 뿐더러, 정사각형 이라 하여도 크게 문제는 없다 )

2. 각 배열내에서 큰수와 작은수를 각각 나누어 각각의 배열을 생성해 할당한다.

3. 큰수만 모여있는 배열과 작은수만 모여있는 배열에서의 각각 최대값을 뽑아 두수의 곱을 반환한다

해당 문제를 푸는 과정에서 사고력을 좀 키워야 겠다는 생각이 들었다.

 

다른사람의 풀이

function solution(sizes) {
    const [hor, ver] = sizes.reduce(([h, v], [a, b]) => [Math.max(h, Math.max(a, b)), Math.max(v, Math.min(a, b))], [0, 0])
    return hor * ver;
}

reduce 를 이용해 깔끔히 풀어낸 솔루션도 있지만.

개인적으로 가독성 측면에서 내가 푼 방법이 보기 편하다는 생각을 하게 되었다.

 

다만, reduce 를 이용해 한줄로 깔끔하게 풀어내신것도 감탄이 나왔다!

문제

 

풀이 코드

function solution(price, money, count) {
    let total = 0;
    for (let i = 1; i <= count; i++)
        total += price * i
    return total - money < 0 ? 0 : total - money
}

 

풀이 과정

간단하게 풀어냈다.

처음 가격 * 1 + 처음 가격 * 2 ... 처음 가격 * n 

 

으로 계산하면 된다고 생각하여 for 문을 돌려 구현했다.

최종적으로 구한 값 - 소지한 돈 이 음수면, 돈이 모자르지 않기 때문에 0을 반환, 그렇지 않으면 차이값을 반환했다.

 

다른사람의 풀이

function solution(price, money, count) {
    const tmp = price * count * (count + 1) / 2 - money;
    return tmp > 0 ? tmp : 0;
}

이분을 for 문을 돌리지 않았고, 가우스 공식을 이용하셨다.

가우스 공식이란

1 ~ n 까지의 합을 구할때, 

(n * (n + 1)) / 2 

를 하면 합을 알수있다는 공식이다.

 

따라서 

count * (count + 1) / 2  에다가, 처음의 가격 Price 를 곱해 

price * count * (count + 1) / 2 를 수행한다.

 

공식숙지의 중요성

문제

 

풀이 코드

function solution(n) { 
    const start = n % 2 === 0 ? 3 : 2;
    for (let i = start; i < n; i += 2) {
        if (n % i === 1)
            return i;
    }
}

 

풀이 과정

간단한 문제였다, 다만 1부터 증가시켜 찾기엔 너무 비효율 적이라고 생각했다.

왜냐하면 n이 짝수라면, 짝수로 나누었을때는 무조건 1이 나올수가 없다,

반대로 n이 홀수라면 짝수로 나누어야지만, 1이 나올것이다.

 

이에 따라 start 값을 짝수일경우 3으로, 홀수일경우 2 로 설정하여

2씩 증가시키며 값을 찾아 나갔다.

 

문제

 

풀이 코드

function solution(s) {
    let lengthCheck = s.length / 2;
    let index = Math.floor(lengthCheck);
    return lengthCheck !== index ? s[index] : s[index - 1] + s[index]  ;
}

 

풀이 과정

문자열의 길이를 2로 나누어, 가운데 인덱스를 구해 주었다.

2로 나누었을때 값이 소수로 나온다면, 해당 길이가 홀수이기 때문에 한글자만 반환하고,

정수로 나온다면 해당길이가 짝수이기 때문에 두글자를 반환하도록 했다.

 

다른사람의 풀이

function solution(s) {
    return s.substr(Math.ceil(s.length / 2) - 1, s.length % 2 === 0 ? 2 : 1);
}

substr 을 사용해 본 적이 없어서 몰랐다.

substr을 사용하여 간결하게 나타낼수 있는 문제였다

+ Recent posts