알고리즘 문제(Swift)

2025 프로그래머스 코드챌린지 1차 예선(유연 근무제)

Goniii 2025. 3. 13. 10:16

https://school.programmers.co.kr/learn/courses/30/lessons/388351

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 요약

자신이 설정한 출근 희망 시간 + 10까지 어플로 출근
희망 시각이 9시 58분이면 10시 8분까지 출근
토, 일은 예외 매일 한 번씩 출근, 모든 시각은 시간에 100을 곱하고 분을 더한 정수로 표현
-> 10시 13분은 1013, 9시 58분은 958
실제로 늦지 않고 출근한 직원이 몇명인지 구하기
schedules: 출근 희망 시각을 담은 배열
timelogs: 직원들이 일주일 동안 출근한 시각을 담은 2차원 배열
startday: 이벤트를 시작한 요일을 의미 (1...7) -> 6, 7은 토요일, 일요일이므로 제외해야 함
상품을 받을 직원의 수 return

 

첫 번재 시도

import Foundation

func solution(_ schedules:[Int], _ timelogs:[[Int]], _ startday:Int) -> Int {
    let maxSchedules = schedules.map{$0 + 10} // 최대 출근 시간
    var answer = 0 // 상품을 받을 직원의 수
    
    for i in 0..<schedules.count { // 직원의 수 만큼 반복
        var isSuccess = true
        for j in 0..<7 { // 일주일 동안 반복
            var day = (j + startday) % 7  // 실제 요일
            day = day == 0 ? 7 : day   // 일요일은 0이 아닌 7이므로 예외 처리
			if (6...7).contains(day) { continue } // 토요일, 일요일 제외
            if timelogs[i][j] > maxSchedules[i] {  // 정시 출근을 하지 못했으면 실패
                isSuccess = false
                break
            }
        }
        if isSuccess { answer += 1 }
    }
    return answer
}

35/42 → 7문제나 틀렸다

예외가 뭐가 있을까

→ schedules에 10을 더한다고 해서 시간이 바뀌지 않는다

시간과 분을 따로 구해야 함

예를들어 9시 55분까지 출근한다고 가정하면 최대 10시 5분까지인데 현재는 9시 65분까지로 구하고 있었다

따라서 시간과 분을 분리하여 계산하고 분이 60을 넘기면 시간을 올려줘야 함

 

두 번째 시도

import Foundation

func solution(_ schedules:[Int], _ timelogs:[[Int]], _ startday:Int) -> Int {
    var maxSchedules = [Int]() // 최대 출근 시간
    for schedule in schedules {
        var time = schedule / 100		// 시간만 추출
        var minute = schedule % 100 + 10 // 분 추출 후 10분 더해줌
        
        if minute >= 60 { // 60분 이상이면 시간을 올려줌
            time += 1	  
            minute -= 60  
        }
        maxSchedules.append(time * 100 + minute) 
    }

    var answer = 0 // 상품을 받을 직원의 수
    
    for i in 0..<schedules.count { // 직원의 수 만큼 반복
        var isSuccess = true
        for j in 0..<7 { // 일주일 동안 반복
            var day = (j + startday) % 7  // 실제 요일
            day = day == 0 ? 7 : day   // 일요일은 0이 아닌 7이므로 예외 처리
			if (6...7).contains(day) { continue } // 토요일, 일요일 제외
            if timelogs[i][j] > maxSchedules[i] {  // 정시 출근을 하지 못했으면 실패
                isSuccess = false
                break
            }
        }
        if isSuccess { answer += 1 }
    }
    return answer
}