본문 바로가기
🐣 알고리즘

[프로그래머스] Swift - 날짜 비교하기 (LV.0)

by @Eddy 2024. 6. 6.
728x90

👆문제풀러 가기👆

문제 설명

 

정수 배열 date1과 date2가 주어집니다. 두 배열은 각각 날짜를 나타내며 [year, month, day] 꼴로 주어집니다. 각 배열에서 year는 연도를, month는 월을, day는 날짜를 나타냅니다.

만약 date1이 date2보다 앞서는 날짜라면 1을, 아니면 0을 return 하는 solution 함수를 완성해 주세요.

제한사항

  • date1의 길이 = date2의 길이 = 3
    • 0 ≤ year ≤ 10,000
    • 1 ≤ month ≤ 12
    • day는 month에 따라 가능한 날짜로 주어집니다.

몹시 쉬운 문제이다. 그래서 이런 문제들은 문제를 푸는 것이 중요하다고 생각하지 않는다.

오히려 구조연습이나 재사용성을 연습하기 좋은 문제라고 생각한다.

6월 6일 기념, 66줄 코드 작성 ㅎ..

 

풀이

enum CompareDate: Int {
    case past = -1   // 비교군보다 앞서는 날
    case same = 0    // 비교군과 같은 날
    case future = 1  // 비교군보다 늦은 날.
}

protocol CompareDateProtocol {  // 재사용성을 위한 프로토콜 사용
    func compareDate(_ time: Time) -> CompareDate
    func compareYear(_ time: Time) -> CompareDate
    func compareMonth(_ time: Time) -> CompareDate
    func compareDay(_ time: Time) -> CompareDate
}

struct Time: CompareDateProtocol {
    private let year: Int  // 프로퍼티에 직접 접근하지 못하도록 은닉화
    private let month: Int
    private let day: Int
    
    init(date: [Int]) { // Date는 항상 3개의 element를 가지므로 별도 조건 추가 없음.
        self.year = date[0]
        self.month = date[1]
        self.day = date[2]
    }
    
    func compareDate(_ time: Time) -> CompareDate {
        let compareYear = self.compareYear(time)
        let compareMonth = self.compareMonth(time)
        let compareDay = self.compareDay(time)
        
        if compareYear == .same {
            if compareMonth == .same {
                if compareDay == .same {
                    return compareDay
                }
                return compareDay
            }
            return compareMonth
        }
        return compareYear
    }
    
    func compareYear(_ time: Time) -> CompareDate { 
        if self.year < time.year { return .past }   // 현재 연도가 비교군의 연도보다 빠르면, (과거)
        if self.year > time.year { return .future } // 현재 연도가 비교군의 연도와 같거나 늦으면, (미래)
        return .same                                // 현재 연도가 비교군의 연도와 같으면, (동년)
    }
    
    func compareMonth(_ time: Time) -> CompareDate { 
        if self.month < time.month { return .past }   // 현재 월이 비교군의 월보다 빠르면, (과거)
        if self.month > time.month { return .future } // 현재 월이 비교군의 월과 같거나 늦으면, (미래)
        return .same                                  // 현재 월이 비교군의 월과 같으면, (동월)
    }
    
    func compareDay(_ time: Time) -> CompareDate { 
        if self.day < time.day { return .past }   // 현재 일자가 비교군의 일자보다 빠르면, (과거)
        if self.day > time.day { return .future } // 현재 일자가 비교군의 일자와 같거나 늦으면, (미래)
        return .same                              // 현재 일자가 비교군의 일자와 같으면, (동일)
    }
}

func solution(_ date1:[Int], _ date2:[Int]) -> Int {
    let findingDay = Time(date: date1) // date1 = 찾는 날짜
    let today = Time(date: date2)      // date2 = 오늘이라고 가정. 
    
    return findingDay.compareDate(today) == .past ? 1 : 0 // 앞서는 날이 아니면 나중 날짜
}

 

 

단순 풀이에 초점을 맞춘다면, 이정도로도 충분하다.

func solution(_ date1:[Int], _ date2:[Int]) -> Int {
    
    for i in 0..<date1.count {
        if date1[i] < date2[i] { return 1 }
        if date1[i] > date2[i] { return 0 }
    }
    
    return 0
}
반응형

댓글