1월 30일 TIL

이승원·2024년 1월 29일
0

TIL

목록 보기
12/75
post-thumbnail

프로그래머스 코딩테스트 [ 개인정보 수집 유효기간 ]

Github 링크

  • 이 문제는 주어진 날짜에 n개월수를 더해서 주어진 오늘날짜와 비교하는 문제다.
  • 다른언어로 풀었다면 주어진 날짜의 개월수를 더하고, 예외처리를 해주는 방식을 했을텐데, swift에서는 date를 다룰 수 있는 method가 있다.
  • 우선 주어진 String을 Date 타입을 바꾸는 방법은 아래와 같다.
	let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy.MM.dd"
    let todayDate = dateFormatter.date(from: today)!
  • today 변수에 날짜의 형식은 "2021.05.02" 이런식으로 되어 있어서, DateFormmater를 통해 dateFormat를 설정해줘야 한다. 설정하면 dateFormmater.date(From: "String") 으로 date타입으로 변환해주면 된다.
  • 이제 두번째 문제는 약관종류가 ["A 6", "B 12", "C 3"] 이런식으로 주어지기 때문에, 조금 더 편하게 접근하기 위해 해당 배열을 Dictionary로 변환했다.
	let dictionary = Dictionary<String, Int>(uniqueKeysWithValues: terms.enumerated().map { index, element in
        let temp = element.split(separator: " ")
        let key = String(temp[0])
        let value = Int(temp[1])!
        return (key, value)
    })

-우선 dictionary의 타입을 정해주고 Dictionary <String,Int>, 그리고 uniqueKeysWithvalues: 를 통해 Dictioanry를 생성해준다. uniqueKeysWithvalues: 는 Dictionary 초기화 메서드 중하나 이며, 해당 메서드는 키-값 쌍을 가진 배열을 사요ㅕㅇ하여 Dictionary를 생성한다, 정확히 말하면 매개변수로는 (Key,Value)로 되어있는 시퀸스를 입력해야한다. 하지만 주어진 약관 배열을 시퀸스로 되어 있지 않기 때문에, Map을 통해 시퀸스로 변환해주는 작업을 했고, map 를통해 ("A" , 6) 이런식의 시퀸스를 만들고 해당 시퀸스로 key,value 할당해서 Dictionary를 할당한다.

  • 이제 주어진 날짜와 약관을 통해 실제로 주어진 오늘 날짜 이전인지를 확인해야 한다.
	  let calendar = Calendar.current
      
  for (index, value) in privacies.enumerated(){
          let temp = value.split(separator: " ")
          let date = dateFormatter.date(from: String(temp[0]))!
          let month = dictionary[String(temp[1])]!
          let updatedDate = calendar.date(byAdding: .month, value: month, to:date)!
          let result = todayDate.compare(updatedDate)
          if result != .orderedAscending {
              ans.append(index+1)
          }

      }
  • 우선 privacies 배열을 각각 순회하고, 각각의 약관의 가입 날짜와 약관 종류를 split로 분리 하고, 가입 날짜는 Date 타입으로, 약관 종류의 따른 월 수는 전에 생성한 Dictionary를 통해 참조해온다. 그리고 calendar 메서드 중에 Calendar.date에서 매개변수 중에 (byAdding: .month, value: n, to: date)를 사용해서 가입날짜에 해당 월수를 추가해주고, 다시 현재 날짜와 비교한다. todayDate.compare(updatedDate)의 리턴값은 아래와 같다.
let result = todayDate.compare(updatedDate)

// result가 갖을 수 있는 세가지의 케이스
.orderedAscending -> 첫번째 값 (todayDate)이 두번째 값(updateDate)보다 작다. 
						todayDate가 updateDate보다 이전이다. 
.orderedDescending -> 첫번째 값 (todayDate)이 두번째 값(updateDate)보다 크다. 
						todayDate가 updateDate보다 이후이다. 
.orderedSame -> 첫번째 값 (todayDate)이 두번째 값(updateDate)보다 크다. 
						todayDate가 updateDate와 같다. 
profile
개발자 (진)

0개의 댓글