RIEN😚
이상한 나라의 개발자
RIEN😚
전체 방문자
오늘
어제
  • 분류 전체보기 (125)
    • Algorithm (68)
      • 알고리즘 (0)
      • Baekjoon (8)
      • 프로그래머스 (55)
      • HackerRank (5)
    • Android (30)
      • Project (1)
      • Error (2)
      • Studio (1)
      • Android (26)
    • Kotlin (6)
    • CS (4)
      • 네트워크 (2)
      • 데이터베이스 (2)
    • Front End (5)
      • React (1)
      • VUE (3)
      • Project (0)
      • 기타 (1)
    • 기록 (11)
      • 회고록 (6)
      • TIL (5)

블로그 메뉴

  • Github🔥
  • 포트폴리오🌹

공지사항

인기 글

티스토리

250x250
반응형
hELLO · Designed By 정상우.
RIEN😚

이상한 나라의 개발자

Algorithm/프로그래머스

[Lv.1] 개인정보 수집 유효기간 - python & Kotlin

2023. 1. 24. 22:30
728x90
반응형
 

프로그래머스

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

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
    'Algorithm/프로그래머스' 카테고리의 다른 글
    • [프로그래머스>Lv.2] 무인도 여행
    • [Lv.2] 이모티콘 할인행사
    • [Lv.2] 점 찍기 - python
    • [Lv3] 가장 긴 팰린드롬 - python
    RIEN😚
    RIEN😚
    안드로이드 / 코틀린 독학으로 취업하자!

    티스토리툴바