티스토리 뷰
https://school.programmers.co.kr/learn/courses/30/lessons/150370
안녕하세요. 간만에 문제풀이로 돌아왔습니다.
이번 문제는 사실 Date 타입에 대한 개념만 있으면 누구나 쉽게 풀 수 있습니다.
Date 타입에 대해 잘 모르시는 분들은 아래 글을 참고해주세요.
2023.09.13 - [iOS개발/Swift 기본] - Swift Date 타입을 활용해보자 (덧셈,뺄셈등)
자 그럼 천천히 상황을 봅시다.
문제 상황
한 회사에서 개인 정보를 파기 하기 위한 알고리즘은 만들려고 합니다.
각 사용자마다 계약한 수집 기간이 다르며 수집기간이 만료된 개인정보는 폐기해야한다고 합니다.
단 모든 날짜는 "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!
}
짠!
기본적인 활용으로도 무언가 할수있다는걸 보여드리고 싶어서
한 번 풀어보았는데 어떨지 모르겠네요.
난이도 자체는 굉장히 쉬운 문제이기 때문에 연습문제로 추천 드립니다.
오늘도 파이팅입니다.
'iOS개발 > 프로그래머스 연습' 카테고리의 다른 글
순열 과 중복 순열 만들기 (with swift) (0) | 2023.08.24 |
---|---|
프로그래머스 이모티콘 할인행사 (Lv.2) 문제 풀이 (0) | 2023.08.18 |
프로그래머스 성격유형검사(Lv. 1) 문제풀이 (0) | 2023.08.11 |