[코딩문제_자바스크립트] 실수를 눈치채지 못했다
프로그래머스 코테를 풀어봤는데, 허무한 실수를 발견하지 못해서 시간을 많이 소요했다.
오랜만에 풀어서 그런지 이런 세세한 것도 눈치채지 못했다. 그래서 오답을 남긴다.
[문제]
- 직원들은 본인들이 출근 희망 시각을 정해서 +10분까지 출근해야한다.
- 7일중 주말(토,일)은 이벤트에서 제외한다.
- 이벤트 시작일이 주어지면 그 시작일로 부터 7일간(토,일 제외) 지각안한 직원 수를 추출할 것이다.
- 함수의 매개변수는 schedules, timelogs, startday 세가지가 주어진다.
- schedules: 직원 n명이 설정한 출근 희망시간을 담은 1차원 배열
- timelogs: 직원들이 일주일 동안 출근한 시각을 담은 2차원 정수 배열
- startday: 이벤트를 시작한 요일을 의미하는 정수
모든 시각은 시에 100을 곱하고 분을 더한 정수로 표현됩니다. 예를 들어 10시 13분은 1013이 되고 9시 58분은 958이 됩니다.
--> 이 부분을 크게 고려안해서 시간 낭비를 했다.
처음에 코드는 이러했다
// 시간 *100 + 분
// <=희망시간 +10
// '오늘'부터 일주일간 희망 시간 늦지않은(토,일 제외) 직원들의 수를 리턴
function solution(schedules, timelogs, startday) {
//schedules 설정 시간/ 제한 1이상 1000 이하 , 값은 700 ≤ schedules[i] ≤ 1100
// 2차 배열 직원수 1이상 1000 이하 , j는 7길이
// startday 7 이하
var answer = 0;
let weeks =[];
// 시작일 기준으로 7일동안 이벤트가 유효한 일자
for (let i=0 ; i< 7 ; i++){
if(startday + i>7){
weeks.push(startday + i - 7);
}else {
weeks.push(startday + i);
}
};
for(let i =0; i<schedules.length ; i++ ){
let cnt =0;
for(let j=0 ; j< timelogs[i].length; j++){
const effectDays = !(weeks[j] == 6 || weeks[j] == 7)? true : false ;
const scheduleOk = (schedules[i] >=700 && schedules[i] <= 1100)? true : false;
const timelogsOk = (timelogs[i][j] >= 600 && timelogs[i][j] <= 2359) ? true : false ;
if(effectDays){
if(scheduleOk && timelogsOk){
if(timelogs[i][j] <= Number(schedules[i])+10){
// 해당 직원이 한날에 출근했을때 지켰다.
cnt++;
}
}
};
}
if(cnt == 5){
answer ++;
} ;
}
return answer;
}.
그러나 제출을 하면 한 두가지 테스트가 실패.. 아무리 봐도 논리는 이상이 없었다.
그래서 문제를 다시 읽었다. 뭘 놓친거지 그런데 잘못된 케이스가 눈에 들어왔다.
바로 시간을 100곱하고 분을 더하는 거라서 8시59분이 희망 출근 시간이라면 이는 859로 주어진다. 그렇다면 +10을 단순히 해버린다면 869가 된다. 단순히 생각했을때 859 <=869 라서 이상이 없을 것 같지만 분은 60분.. 때문에 905도 지각이 아니지만 지각이 되버리는 것이다.
그래서 아래 처럼 분을 다시 구하는 함수를 만들어 계산해야한다.
// 시간 *100 + 분
// <=희망시간 +10
// '오늘'부터 일주일간 희망 시간 늦지않은(토,일 제외) 직원들의 수를 리턴
function solution(schedules, timelogs, startday) {
//schedules 설정 시간/ 제한 1이상 1000 이하 , 값은 700 ≤ schedules[i] ≤ 1100
// 2차 배열 직원수 1이상 1000 이하 , j는 7길이
// startday 7 이하
var answer = 0;
let weeks =[];
// 시작일 기준으로 7일동안 이벤트가 유효한 일자
for (let i=0 ; i< 7 ; i++){
if(startday + i>7){
weeks.push(startday + i - 7);
}else {
weeks.push(startday + i);
}
};
// 시간(HHMM)을 분으로 변환하는 함수
function toMinutes(time) {
const hour = Math.floor(time / 100);
const min = time % 100;
return hour * 60 + min;
}
for (let i = 0; i < schedules.length; i++) {
let count = 0;
const hopeTime = toMinutes(schedules[i]);
for (let j = 0; j < 7; j++) {
const day = weeks[j];
const logTime = toMinutes(timelogs[i][j]);
// 주말 제외 (1=월, ..., 5=금)
if (day >= 1 && day <= 5) {
if (logTime <= hopeTime + 10) {
count++;
}
}
}
// 월~금 중 5일 지킨 경우
if (count === 5) {
answer++;
}
}
return answer;
}
.
.
.
.
.
.
다른 사람 풀이를 봤는데 좀 세련되게 푸시는 분이 있어서 남긴다.
출처: https://school.programmers.co.kr/learn/courses/30/lessons/388351/solution_groups?language=javascript
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
작성자 닉네임: 정상영