TIL 13일차 - Javascript 코딩 테스트 풀이 답안 정리(4)

박찬웅·2023년 2월 18일
0

항해99

목록 보기
18/105

23년 2월 18일

  • 모든 문제의 출처는 프로그래머 스쿨에서 가져왔으며, 아래 적은 코드들의 답은 되도록 스스로 풀려고 생각했으나, 모르는 것들은 팀원들과 같이 풀거나, 기술매니저님한테 도움을 받았습니다.
    아울러 오늘 같은 경우에는 월요일에 풀었던 모의고사 예상문제 3문제를 풀었습니다.

모의고사(1) 신대륙 발견(하)

// 기원이는 오늘 항해99를 시작했다. 성격이 급한 기원이는 항해 1일 차부터 언제 수료를 하게될 지 궁금하다.
// 항해 1일 차 날짜를 입력하면 98일 이후 항해를 수료하게 되는 날짜를 계산해주는 알고리즘을 만들어보자.

// ### 제한 조건

// - 1 ≤ month ≤ 12
// - 1 ≤ day ≤ 31 (2월은 28일로 고정합니다, 즉 윤일은 고려하지 않습니다.)

// 입출력 예
// month day result
// 11    27  "3월 5일"
// 6     22  "9월 28일"

// 지정 입력값
// month day result
// 1     18  "4월 26일"

function solution(month, day){
	let date = new Date(2022, month - 1, day + 98); // 98일 후 날짜 변수 생성 (2023으로 하면 2024넘어갈때 윤년이 생겨서 성립 불가능)
	let newMonth = date.getMonth() + 1; // 월 구하는 변수 생성
	let newDay = date.getDate(); // 일 구하는 변수 생성
	  return newMonth + "월" + newDay + "일"; // 날짜 반환
  }
console.log(solution(1,18)) // 1월 18일 < 4월 26일

둘째 날에 풀었던 13번 문제를 변형 한 문제로, date 함수를 이용하면 금방 풀 수 있던 문제였다. 현재 날짜에서 98일 후를 계산하면 되기에 day에다 98을 더하면 되고, 월은 저번에도 말했듯이, 인덱스가 0~11까지 지정되기 때문에 1을 빼야하고 getMonth 함수에도 1~12를 출력하기 위해서 1을 더하면 된다.
답은 맞았으나 여기서 한가지 흠이 있는데 올해 년도인 2023을 하면 내년 2024년이 윤달이 있어서 2월은 무조건 28일 이라는 조건이 맞지 않아 2022년으로 지정을 하였다.

모의고사(2) 몇시간 했더라?(중)

// 지용이는 항해에서 한 주 동안 공부 기록을 남길 알고리즘을 만들어보기로 결심했다.
// 항해의 체크인 페이지에는 몇가지 조건이 있는데 이를 만족하는 알고리즘을 만들어보자.

// - 체크인과 체크아웃은 항상 정시에 진행한 것으로 가정한다. 9 9
// - 체크아웃을 할 때 익일 시간은 24+a 로 계산한다. 즉 새벽 2시는 24+2 인 26으로 표기한다.
// - 체크인 페이지는 체크아웃이 새벽 5시 정각이나 새벽 5시를 넘어가면 체크아웃을 깜빡한 것으로 간주한다.
// 따라서 새벽 5시가 넘어가 체크아웃을 하게 되면 자동으로 체크아웃을 오후 9시(21시)로 한 것으로 처리한다.

// ### 제한 조건

// - 체크인(checkin)과 체크아웃(checkout)을 진행한 시간이 담긴 배열 두 개가 주어진다.
// - 각 배열에는 월요일부터 일요일까지 체크인/아웃을 한 시간이 담겨있다.
// - checkin과 checkout 배열의 길이는 각각 7 이다.

// 입출력 예
// checkIn                 checkOut                       result
// [9, 9, 8, 8, 7, 8, 9] | [21, 25, 30, 29, 22, 23, 30] | 96
// [9, 7, 8, 9, 7, 9, 8] | [23, 22, 26, 26, 29, 27, 22] | 110

// 지정 입력값
// checkIn                 checkOut                       result
// [9, 9, 9, 9, 7, 9, 8] | [23, 23, 30, 28, 30, 23, 23] | 102

function solution(arr1, arr2){
	let answer=0; // 총 시간 구할 변수 선언
    // 두 배열 요일 순회
    for (let i = 0; i < arr1.length; i++) {
        // 새벽 5시 넘어서 체크 아웃 할 경우 오후 9시로 체크아웃 한걸 판정
        if (arr2[i] >= 29) {
            arr2[i] = 21
        }
        answer = answer + arr2[i] - arr1[i] // 각 요일마다 시간 합산
    }
	return answer; // 총 시간 반환
}
let arr1=[9, 9, 9, 9, 7, 9, 8];
let arr2=[23, 23, 30, 28, 30, 23, 23];
console.log(solution(arr1, arr2)) // 102

두 배열 시간 차이를 구하고 그대로 더하는 아주 간단한 방식이지만, 다음날 새벽 5시가 넘어가서 체크아웃 하면 금일 오후 9시에 체크한 것으로 간주를 해야 하는 조건이 있었다. 다음날 새벽 5시라고 하면 기존 24시에 5를 더해서 29를 넘기면 오후 9시인 21로 바꾸는 조건을 세우고 난 뒤, 두 배열의 차이를 구하고 모두 더하면 되었다.

모의고사(3) 소수의 개수와 덧셈(상)

// 문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 소수의 최대값과 소수가 
// 아닌 수의 최소값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.

// 예를들어 s가 "2 3 4 5"라면 "4 5"를 리턴하고, "15 3 10 9 7 8"라면 "8 7"을 리턴하면 됩니다.

// ---

// ### 제한사항

// - s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.
// - 문자열에는 소수가 한개 이상 섞여 있습니다.
// - 문자열에는 소수가 아닌 수가 한개 이상 섞여 있습니다.
// - 음수는 없습니다.

// 입출력 예
// s                result
// "2 3 4 5"        "4 5"
// "15 3 10 9 7 8"  "8 7"

// 지정 입력값
// s                        result
// "97 75 88 99 95 92 73"   "75 97"

// (소수의 최대값) (소수가 아닌 수의 최소값)

function solution(s){
  let answer="";
  let item = s.split(" ") // 배열로 만들기
  let max = []; // 최댓값 선언
  let min = []; // 최솟값 선언

  // 배열에서 가장 큰 소수 값, 가장 작은 소수 아닌 값
  item.forEach(elem => {
    if(primeChk(elem)){
      max.push(Number(elem)) // 소수에서 가장 큰 값
    }else{
      min.push(Number(elem)) // 소수 아닌 것 중 가장 작은 값
    }
  });
  answer = Math.min(...min)+" "+Math.max(...max)
	return answer;
}
// 소수를 찾기 위한 함수 선언
function primeChk(num){
  for(let i = 2 ; i <= num ** 0.5 ; i++) {
    if(num % i == 0){
      return false;
    }
  }
  return true;
}

let s="97 75 88 99 95 92 73"; // 75 97

console.log(solution(s))
  • 이 문제는 스스로 노력했으나 끝내 풀지 못해서, 카톡 단톡방 중 한분의 정답을 가져와다 코드를 이해하는데 사용함을 알려드립니다.

먼저 기존 s를 배열화로 만들고 난뒤, 최댓값과 최솟값을 만들기 위한 배열을 생성해준다. 그리고 함수 하나를 더 만들어서 소수인지 아닌지 판별하는 함수를 만들었다. * 두개 적은거는 거듭제곱의 연산자로 루트를 만들기 위한 식이며, 임의의 숫자가 2 이상의 수로 나눠지지 않게 하기 위해서 num % i == 0로 하면 소수를 찾을 수 있다.
이제 그걸 토대로 값을 추적하는 forEach 함수를 이용해서, 아까 소수 정의를 한 primeChk를 참조한다. 만약 true이면 소수이기 때문에 가장 큰 값을 찾는 max 함수를 통해서 출력하되, 현재 배열이 문자열이기 때문에, 다시 숫자로 바꿔주는 Number 함수를 써야 한다. false이면 전과 같은 방식으로 소수가 아닌 값중 가장 작은 값을 넣어 준다. 그렇게 나온 두 숫자를 answer에다 반환해주면 된다.

알게 된 점

오늘은 월요일 코딩테스트 시험을 대비하기 위해서 모의고사 3문제를 풀어 보았다. 예상대로 1,2번은 1시간도 안되서 풀었다. 하지만 3번문제는 3시간을 머리를 써도 풀지 못해서 결국에는 같은 기수 중에서 한분의 답안을 참고해서 이해를 하였다.
그리고 오후부터 저녁까지는 지금까지 풀었던 1번부터 28번까지 복습공부를 하는데 힘을 썼다. 물론 여기에 적히지는 않았지만 챌린지문제까지 고려하면 어제랑 오늘 남은시간을 통해서 36번까지는 풀었다. 근데 챌린지 문제라서 꼭 해야 했던거는 아니라서 챌린지 문제 구간인 29번부턴 블로그에 답안 적은건 올리진 않았지만, 이전에 문제 풀었던거를 생각하면서 문법을 다시 한번 공부를 하는데 힘을 썼다.
마지막으로 그동안 풀었던 문제를 git에다 전부 파일을 올려서 업로드를 하였다. 매니져님이 올릴거는 없어도 그냥 아무거나 하나라도 readme라도 글 적어서 커밋 하면 좋다고 말씀해 주셨다.

앞으로 계획

이제 2주정도 지난 것 같다. 내일은 쉬고 월요일에 코딩테스트 시험을 볼텐데 기존에 풀었던거 마지막 복습하고 시험을 볼것 같다. 끝나고 남는시간에는 못풀었던 챌린지 문제 더 풀 예정이다.

profile
향해 13기 node.js 백앤드

0개의 댓글