[TIL] 항해99 코딩테스트

이현동·2023년 2월 2일
0

TIL

목록 보기
20/59

모의고사

프로그래밍 기초 주에서는 javascript를 이용해서 코딩테스트 문제를 풀어보고 모의고사를 진행하게 된다. 본 모의고사를 보기 전에 연습으로 제공하는 코딩테스트 문제를 풀어보고 풀이영상을 제출해 봤다.

1. Date

1번 문제는 날짜를 입력하면 98일을 더해준 날짜를 출력해주는 문제였다.

const solutionOne = (month, day) => {
    let endDate = new Date(2022, month, day);
    endDate.setDate(endDate.getDate() + 99);
    console.log(endDate);
    return endDate.getMonth().toString() + '월' + endDate.getDate().toString() + '일';
};

console.log(solutionOne(1, 7));
// 출력 4월 17일

Date객체를 이용해 날짜 정보를 받아오고 99일을 더한 날짜에서 '월'과 '요일'을 출력했다.

2. 시간 계산

2번 문제는 경과한 시간(?)을 계산해주는 문제였는데, 조건은 새벽 5시 (29시)이상이면 21시로 계산해주는 문제였다. check in 시간과 check out 시간이 각각 array로 주어진다.

const solutionTwo = (checkin, checkout) => {
    let timeArray = []; // 값을 넣을 빈 배열을 선언한다.
    for (let i = 0; i < checkin.length; i++) {
        // for문을 사용해 checkin, checkout 배열을 각각 돌려준다.
        if (checkout[i] >= 29) {
            // 만약 checkout 시간이 새벽 5시(29시)를 넘어갈 경우 21시를 고정으로 빼준다.
            timeArray.push(21 - checkin[i]); // 뺀 값을 timeArray 배열에 넣는다.
        } else {
            // 그 외의 경우는 checkout을 잘 한 것이므로 checkin의 값애서 checkout을 뺀다.
            timeArray.push(checkout[i] - checkin[i]); // 뺀 값을 timeArray 배열에 넣는다.
        }
    }
    return timeArray.reduce((a, b) => a + b); // 넣었던 값들을 모두 합해준다.
};
let arr1 = [9, 9, 9, 9, 7, 9, 8];
let arr2 = [23, 23, 30, 28, 30, 23, 23];
// result : 102

console.log(solutionTwo(arr1, arr2));

check out 시간에서 check in 시간을 빼주어서 경과한 시간을 계산한 다음 timeArray에 넣어준다음, reduce()를 사용해 배열의 값을 다 더해주고 리턴해주었다.

3. 소수의 개수

3번 문제는 주어진 문자열에서 소수 중 최댓값과 소수가 아닌 수 중 최솟값을 찾는 문제였다.

function solutionThree(s) {
    let dataArray = s.split(' ');
    dataArray.map((a, i) => (dataArray[i] = +a));
    // 소수가 아닌 수들 배열에 넣기
    let decimal = [2]; // 2는 기본적으로 소수이고, 소수의 최대값을 찾는 문제이기 때문에 default로 넣음
    let notDecimal = [];
    for (let i = 0; i < dataArray.length; i++) {
        for (let j = 2; j < dataArray[i]; j++) {
            if (dataArray[i] % j === 0) {
                notDecimal.push(dataArray[i]);
                break;
            }
        }
    }
    // 전체 배열과 소수가 아닌 수들을 비교해서 소수 찾아내기
    dataArray.concat(notDecimal).filter((a) => {
        if (!dataArray.includes(a) || !notDecimal.includes(a)) {
            decimal.push(a);
        }
    });
    // 소수의 최대값, 소수가 아닌 최소값 찾아서 출력
    const decimalMax = Math.max(...decimal);
    const notDecimalMin = Math.min(...notDecimal);
    return String(notDecimalMin) + ' ' + String(decimalMax);
}
let s = '97 75 88 99 95 92 73';

console.log(solutionThree(s));

뭔가 더 간단하게 풀 수 있었을 것 같은데 복잡하게 푼 것 같아 아쉬웠다. 그리고 조금 복잡하더라도 각 기능마다 함수로 분리해서 풀었다면 좀 더 깔끔했을 것 같다.
일단 소수가 아닌 수들을 찾아내서 소수가 아닌 수들을 notDecimal 배열에 넣고 원래의 배열과 중복을 찾아내 소수를 찾아냈고, 소수들을 다시 decimal 배열에 넣어주었다. 그리고 각 decimal 배열에서 최댓값과 notDecimal 배열에서 최솟값을 찾아내 리턴해주었다.

profile
https://hdlee.dev

0개의 댓글