티스토리 뷰

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

안녕하세요. 간만에 문제풀이로 돌아왔습니다. 

이번 문제는 사실 Date 타입에 대한 개념만 있으면 누구나 쉽게 풀 수 있습니다.

Date 타입에 대해 잘 모르시는 분들은 아래 글을 참고해주세요.

2023.09.13 - [iOS개발/Swift 기본] - Swift Date 타입을 활용해보자 (덧셈,뺄셈등)

 

Swift Date 타입을 활용해보자 (덧셈,뺄셈등)

안녕하세요. 가만 생각해보니 Date 타입은 생각보다 많이 쓰는데 Date 가 무엇인지 그리고 어떻게 사용하는지는 정리를 안했더라고요. ( Date String 전환하는 것만 올렸더라고요;;) 2022.10.14 - [iOS개발/

world-of-larooly.tistory.com

 

자 그럼 천천히 상황을 봅시다. 

 

문제 상황 

한 회사에서 개인 정보를 파기 하기 위한 알고리즘은 만들려고 합니다.

 

각 사용자마다 계약한 수집 기간이 다르며 수집기간이 만료된 개인정보는 폐기해야한다고 합니다.

단 모든 날짜는 "YYYY.MM.DD"형태로 주어지고 각 계약서에따른 수집기간은 "A 6" 이런 식으로 표기되며

내용은 "A 계약은 6달기간 유지한다" 라는 의미입니다. (즉 6달 후 폐기)

 

오늘의 날짜 today(String) 와 계약 종류 terms([String]) 그리고 사용자의 계약한 날짜가 적힌 privacies([String]) 가 주어졌을때 폐기해야하는 사용자의 번호([Int])를 출력하는 함수를 완성해주세요.

(출력 번호 주의!!!!)    

 

정답 예시 

today terms privacies result
"2022.05.19" ["A 6", "B 12", "C 3"] ["2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"] [1, 3]
"2020.01.01" ["Z 3", "D 5"] ["2019.01.01 D", "2019.11.15 Z", "2019.08.02 D", "2019.07.01 D", "2018.12.28 Z"] [1, 4, 5]

 

문제 풀이 (swift)

생각보다 어렵지 않은 문제입니다. 

String을 다루는 방법과 Date 만 알면 간단합니다. 

 

0. String->Date 로 바꾸기

1. 계약기간 확인하고 해당 today 와 비교하기 

2. 1번을 privacies 에 있는 모든 항목에 하기 (for 문 하시면 됩니다.)

 

왜 굳이 Date 를 사용하시나 의문일수있는데 날짜계산은 이게 더 편해서 쓰는 것 뿐입니다.

 

0. String->Date 로 바꾸기

이번 문제에서 제일 많이 쓰일 부분이기 때문에 함수로 바꿔서 이용합시다.

func changeStringToDate(text : String) -> Date? {
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy.MM.dd"
    let textDate = formatter.date(from: text)
    return textDate
}

 

1. 계약기간 확인하고 해당 today 와 비교하기 

이걸 하실 때 저희는 사용자의 기존 날짜 + 계약기간 과 today를 비교해야합니다. 

(그냥 날짜가 아닙니다!!)

그래서 날짜를 더 해주는 함수를 만들어볼께요.  (간단하죠?)

func addMonth(past:Date,month:Int) -> Date? {
    return Calendar.current.date(byAdding: .month,value: month, to: past)
}

 

그럼 이제 본격적으로 비교해봅시다. 

(true 면 폐기 / false 면 보관으로 할께요.)

func compareUserDay(userData : String, today : String, terms:[String]) -> Bool {
    let userDay = userData.split(separator: " ")[0]
    let userKind = userData.split(separator: " ")[1]

    var limitMonth = 0
    for term in terms {
        if(term.contains(userKind)){
            limitMonth = Int(term.split(separator: " ")[1]) ?? 0
        }
    }
    let userLimitDay = addMonth(past: changeStringToDate(text: String(userDay))!, month: limitMonth)
	//true 면 폐기
    return changeStringToDate(text: today)! >= userLimitDay!
}

 

2. 1번을 privacies 에 있는 모든 항목에 하기 (for 문 하시면 됩니다.)

이제 이걸 간단하게(?) for 문을 통해 돌려봅시다. 

확실히 간단해지죠?

func solution(_ today:String, _ terms:[String], _ privacies:[String]) -> [Int] {
    var resultArray : [Int] = [] // index에 1이 더해진 형태로 보관해야함
    for index in 0..<privacies.count{
        if(compareUserDay(userData: privacies[index], today: today, terms: terms)){
            resultArray.append(index+1) //1 더한 형태로 보관
        }
    }
    return resultArray
}

 

최종 코드 (swift)

import Foundation

func solution(_ today:String, _ terms:[String], _ privacies:[String]) -> [Int] {
    var resultArray : [Int] = [] // index에 1이 더해진 형태로 보관해야함
    for index in 0..<privacies.count{
        if(compareUserDay(userData: privacies[index], today: today, terms: terms)){
            resultArray.append(index+1)
        }
    }
    return resultArray
}

func changeStringToDate(text : String) -> Date? {
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy.MM.dd"
    let textDate = formatter.date(from: text)
    return textDate
}
func addMonth(past:Date,month:Int) -> Date? {
    return Calendar.current.date(byAdding: .month,value: month, to: past)
}
func compareUserDay(userData : String, today : String, terms:[String]) -> Bool {
    let userDay = userData.split(separator: " ")[0]
    let userKind = userData.split(separator: " ")[1]

    var limitMonth = 0
    for term in terms {
        if(term.contains(userKind)){
            limitMonth = Int(term.split(separator: " ")[1]) ?? 0
        }
    }
    let userLimitDay = addMonth(past: changeStringToDate(text: String(userDay))!, month: limitMonth)

    return changeStringToDate(text: today)! >= userLimitDay!
}

짠!

묘하게 기분 좋네요

 

기본적인 활용으로도 무언가 할수있다는걸 보여드리고 싶어서 

한 번 풀어보았는데 어떨지 모르겠네요. 

난이도 자체는 굉장히 쉬운 문제이기 때문에 연습문제로 추천 드립니다. 

오늘도 파이팅입니다.

댓글