프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
노션에 정리하던 풀이를 다시 블로그로 이동시키고 있습니다.ㅎㅎ
잘 부탁드립니다. 🤗
1. 문제
고객의 약관 동의를 얻어서 수집된 1~n번으로 분류되는 개인정보 n개가 있습니다.
당신은 오늘 날짜로 파기해야 할 개인 정보 번호들을 구하려고 합니다.
이 때, 모든 달은 28일까지 있다고 가정합니다.
[입력]
- today: 오늘 날짜를 의미하는 문자열
- terms: 약관의 유효기간을 담은 1차원 문자열 배열
- privacies: 수집된 개인정보의 정보를 담은 1차원 문자열 배열
[출력]
파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열에 담아 return
2. 제한사항
2.1 날짜
- today와 privacies에 등장하는 날짜
- YYYY,MM.DD
- 2000 <= YYYY <= 2022
- 1 <= MM <= 12 ( * MM이 한 자리 수인 경우 앞에 0이 붙습니다. )
- 1 <= DD <= 28 ( * DD가 한 자리 수인 경우 앞에 0이 붙습니다. )
3. 풀이
3.1 날짜 > 숫자
YYYY.MM.DD로 표현되는 날짜를 숫자로 변경하는 코드를 먼저 작성해보겠습니다.
오늘 날짜가 보관 유효기간이 지나지 않았는지 비교할 때는 숫자가 편하기 때문입니다.
다행히 모든 달이 28일이고, 빨라도 2000년부터 시작하기 때문에 쉽게 계산할 수 있습니다.
def getDate(date):
year, month, day = map(int, date.split('.'))
return day + (month-1)*28 + (year-2000)*28*12
3.2 비교문
가장 중요한 비교문은 어떻게 작성할 수 있을까요?
🌹 개인정보 수집일자 + 약관의 보관일자 - 1 < 오늘 날짜
이렇게 비교문을 구성할 수 있을거 같습니다. 즉, 오늘이 보관 유효기간을 지난 경우를 체크하면 됩니다.
4. 코드
4.1 Python
def solution(today, terms, privacies):
answer = []
# 약관 정보
data = {}
for k, d in [x.split() for x in terms]:
data[k] = int(d) * 28
# 현재 날짜
today = getDate(today)
# 파기 여부 계산
for i, (d, k) in enumerate([x.split() for x in privacies]):
date = getDate(d) + data[k] - 1
if date < today:
answer.append(i+1)
answer.sort()
return answer
def getDate(date):
year, month, day = map(int, date.split('.'))
return day + (month-1) * 28 + (year-2000) * 28 * 12
4.2 Kotlin
Python과 동일한 기능을 제공하는 Kotlin 코드입니다.
class Solution {
fun solution(today: String, terms: Array<String>, privacies: Array<String>): IntArray {
var answer = mutableListOf<Int>()
// 약관 정보
val mapOfTerms = hashMapOf<String, Int>()
terms.forEach{
val (type, date) = it.split(" ")
mapOfTerms[type] = date.toInt() * 28
}
// 현재 날짜
val todayNum = getDate(today)
// 파기 여부 계산
privacies.forEachIndexed { index, privacies ->
val (date, type) = privacies.split(" ")
val deadLine = getDate(date) + (mapOfTerms[type] ?: 0) - 1
if (deadLine < todayNum)
answer.add(index+1)
}
answer.sort()
return answer.toIntArray()
}
// date: YYYY.MM.DD
private fun getDate(date: String): Int {
val (year, month, day) = date.split(".").map{ it.toInt() }
return day + (month-1)*28 + (year-2000)*28*12
}
}
Lv.1 문제여서 그런지 알고리즘적으로는 어렵지 않고, 긴~ 문제를 빠르게 해석하고
이를 코드로 구현할 수 있는가를 검증하는 문제인듯 했습니다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스>Lv.2] 무인도 여행 (0) | 2023.01.31 |
---|---|
[Lv.2] 이모티콘 할인행사 (0) | 2023.01.27 |
[Lv.2] 점 찍기 - python (0) | 2022.12.14 |
[Lv3] 가장 긴 팰린드롬 - python (0) | 2022.09.29 |
[Lv3] 단어 변환 - python (1) | 2022.09.29 |