IT/코딩문제

[코딩문제_자바스크립트] 실수를 눈치채지 못했다

파뉴 2025. 6. 16. 23:55

프로그래머스 코테를 풀어봤는데, 허무한 실수를 발견하지 못해서 시간을 많이 소요했다. 

오랜만에 풀어서 그런지 이런 세세한 것도 눈치채지 못했다. 그래서 오답을 남긴다. 

[문제]

- 직원들은 본인들이 출근 희망 시각을 정해서 +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

작성자 닉네임: 정상영