프로그래머스

[프로그래머스_Kotlin] 개인정보 수집 유효기간

내손은개발 🐾 2024. 3. 19. 19:51
 

프로그래머스

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

programmers.co.kr

 

문제

  • 고객의 약관 동의를 얻어서 수집된 1~n번으로 분류되는 개인정보 n개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.
  • 예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다.
    당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.
  • 모든 달은 28일까지 있다고 가정합니다.
  • 다음은 오늘 날짜가 2022.05.19일 때의 예시입니다.

 

  • 첫 번째 개인정보는 A약관에 의해 2021년 11월 1일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
  • 두 번째 개인정보는 B약관에 의해 2022년 6월 28일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.
  • 세 번째 개인정보는 C약관에 의해 2022년 5월 18일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
  • 네 번째 개인정보는 C약관에 의해 2022년 5월 19일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.

 

  • 따라서 파기해야 할 개인정보 번호는 [1, 3]입니다.

  • 오늘 날짜를 의미하는 문자열 today, 약관의 유효기간을 담은 1차원 문자열 배열 terms와 수집된 개인정보의 정보를 담은 1차원 문자열 배열 privacies가 매개변수로 주어집니다. 이때 파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열에 담아 return 하도록 solution 함수를 완성해 주세요.

 

제한사항

  • today는 "YYYY.MM.DD" 형태로 오늘 날짜를 나타냅니다.
  • 1 ≤ terms의 길이 ≤ 20
    • terms의 원소는 "약관 종류 유효기간" 형태의 약관 종류와 유효기간을 공백 하나로 구분한 문자열입니다.
    • 약관 종류는 A~Z중 알파벳 대문자 하나이며, terms 배열에서 약관 종류는 중복되지 않습니다.
    • 유효기간은 개인정보를 보관할 수 있는 달 수를 나타내는 정수이며, 1 이상 100 이하입니다.
  • 1 ≤ privacies의 길이 ≤ 100
    • privacies[i]는 i+1번 개인정보의 수집 일자와 약관 종류를 나타냅니다.
    • privacies의 원소는 "날짜 약관 종류" 형태의 날짜와 약관 종류를 공백 하나로 구분한 문자열입니다.
    • 날짜는 "YYYY.MM.DD" 형태의 개인정보가 수집된 날짜를 나타내며, today 이전의 날짜만 주어집니다.
    • privacies의 약관 종류는 항상 terms에 나타난 약관 종류만 주어집니다.
  • today와 privacies에 등장하는 날짜의 YYYY는 연도, MM은 월, DD는 일을 나타내며 점(.) 하나로 구분되어 있습니다.
    • 2000 ≤ YYYY ≤ 2022
    • 1 ≤ MM ≤ 12
    • MM이 한 자릿수인 경우 앞에 0이 붙습니다.
    • 1 ≤ DD ≤ 28
    • DD가 한 자릿수인 경우 앞에 0이 붙습니다.
  • 파기해야 할 개인정보가 하나 이상 존재하는 입력만 주어집니다.

입출력 예

 

풀이

class Solution {
    fun solution(today: String, terms: Array<String>, privacies: Array<String>): IntArray {
        var answer: IntArray = intArrayOf()
        var eachTerms = mutableMapOf<String, Int>()
        val dayOfMonth = 28
        //today 총 요일
        var todaySum = today.split(".")[0].toInt() * 12 * dayOfMonth +
                today.split(".")[1].toInt() * dayOfMonth +
                today.split(".")[2].toInt()

        terms.forEach {//Terms 총 요일 담기
            eachTerms.put(it[0].toString(), it.split(" ")[1].toInt() * dayOfMonth)
        }

        for (i in privacies.indices) {
            var priType = privacies[i].split(".")[2].split(" ")[1]
            var priSum = privacies[i].split(".")[0].toInt() * 12 * dayOfMonth +
                    privacies[i].split(".")[1].toInt() * dayOfMonth +
                    privacies[i].split(".")[2].split(" ")[0].toInt()

            if (todaySum - priSum >= eachTerms[priType]!!) {
                answer += i + 1
            }
        }
        return answer
    }
}

 

코드 분해

더보기

푸는 방식은 모든 요일을 더해서 비교하도록 작성했다.

var eachTerms = mutableMapOf<String, Int>()
terms.forEach {//Terms 총 요일 담기
            eachTerms.put(it[0].toString(), it.split(" ")[1].toInt() * dayOfMonth)
        }

 문제에서 모든 달은 28일까지 있는다고 했다. terms를 Map으로 총 몇일인지 곱해서 저장하는 것이다.

ex) "A 6", "B 12", "C 3" -> A=168(28*6) B=336(28*12) C=84(28*3)

 

//today 총 요일
var todaySum = today.split(".")[0].toInt() * 12 * dayOfMonth +
	today.split(".")[1].toInt() * dayOfMonth +
	today.split(".")[2].toInt()

 today의 총 요일을 todaySum에 담는다.

ex) "2022.05.19" -> (2022*12*28) + (5*28) + (19)

 

 

for (i in privacies.indices) {
	var priType = privacies[i].split(".")[2].split(" ")[1]
	var priSum = privacies[i].split(".")[0].toInt() * 12 * dayOfMonth +
		privacies[i].split(".")[1].toInt() * dayOfMonth +
		privacies[i].split(".")[2].split(" ")[0].toInt()

	if (todaySum - priSum >= eachTerms[priType]!!) {
		answer += i + 1
	}
}

privacies[i]는 0000.00.00 A이런식으로 저장되어 있다.

'.'을 구분하여 총 요일을 계산하고 type과 비교해보면 된다!!

split(".")으로 '.'을 구분하여 privacies[i]의 총 요일 수를 더한 뒤 

5번째 줄의 type을 가져와서 if문으로 비교해서 출력될 answer에 넣어주면 끝이다.

 

 

다른사람의 풀이

class Solution {
    fun solution(today: String, terms: Array<String>, privacies: Array<String>) = 
        privacies.indices.filter { privacies[it].split(" ")
            .first().split("\\.".toRegex()).map(String::toInt)
            .let { (y, m, d) -> (y * 12 * 28) + (m * 28) + d } + (terms.map { it.split(" ") }
                .associate { (a, b) -> a to b.toInt() }.getOrDefault(privacies[it].split(" ")
                    .last(), 0) * 28) <= today.split("\\.".toRegex()).map(String::toInt)
                        .let { (y, m, d) -> (y * 12 * 28) + (m * 28) + d } }
            .map { it + 1 }
}

?!

그래도 총 요일 구해서 계산하는건 똑같다 ㅎ...