CodingTest

Programmers - 개인 정보 수집 유효기간

취업하고싶다! 2024. 3. 22. 15:28
 

프로그래머스

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

programmers.co.kr

 

 

문제

고객의 약관 동의를 얻어서 수집된 1~n번으로 분류되는 개인정보 n개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.

예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다.
당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.

모든 달은 28일까지 있다고 가정합니다.

다음은 오늘 날짜가 2022.05.19일 때의 예시입니다.

약관 종류 유효기간
A 6
B 12
C 3
번호 개인정보 수집 일자 약관 종류
1 2021.05.02 A
2 2021.07.01 B
3 2022.02.19 C
4 2022.02.20 C

첫 번째 개인정보는 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 함수를 완성해 주세요.

 

 

접근방식

개인정보를 담은 배열 privacies 안의 문자열들을 돌면서(pr) 그 안에서 약관의 유효기간을 담은 terms 배열 안의 문자열들을 돌면서(t) 어떤 약관인지 먼저 확인함. t는 알파벳과 유효기간이 공백을 두고 나오므로 t의 공백의 앞부분이 pr안에 있는지 확인 후 있으면 공백의 뒷부분(유효기간)을 12로 나눈 몫과 나머지를 new_year, new_month 라는 변수에 기존의 값과 더해서 할당해줌.

 

그리고 new_month가 12보다 클 경우 new_year에 1을 더해주고 new_month는 12를 뺀 값으로 할당해줌

그리고 new_month가 예를 들어 '2'일 경우 앞에 '0' 문자열을 더해서 today 문자열과 형식을 같게 맞춰줌

그 후 new_date 라는 변수에 new_year, new_month, 그리고 today의 날짜부분을 더해서 새로운 값을 생성하고 그 값이 today보다 작거나 같을 경우 answer에 privacies에서 pr의 인덱스에 1을 더한 값을 더해줌

 

이렇게 푸니까 

다음과 같이 테케에서 몇 문제가 틀렸다고 떴음

 

뭐가 문젠지 알아보다가 반례를 찾게 됨

tc가 예를 들어 순서대로

"2020.05.15", ["A 1"], ["2001.01.10 A", "2001.01.10 A"] 다음과 같을 경우 answer은 [1,2]가 나와야하지만 [1,1]이 나옴.

왜냐하면 내 기존의 코드는 privacies에서 pr의 인덱스에 1을 더한 값을 answer에 append 했는데 privacies에서 1번째 문자열과 두 번째 문자열이 동일하므로 1번째 문자열의 인덱스가 들어가게 됨

 

이처럼 원소를 찾아서 해당 원소의 인덱스에 접근하게 되면 동일한 원소일 경우 인덱스를 잘못 반환하는 경우가 생기게 됨

따라서 인덱스와 원소를 동시에 접근할 수 있는 파이썬 내장함수 enumerate()를 사용해서 해결함

 

 

기존 코드

def solution(today, terms, privacies):
    answer = []
    for pr in privacies:
        for t in terms:
            if t.split()[0] in pr:
                year_plus = (int(t.split()[1])) // 12
                month_plus = (int(t.split()[1])) % 12
                new_year = int(pr[0:4]) + year_plus
                new_month = int(pr[5:7]) + month_plus   
                if new_month > 12:
                    new_year += 1
                    new_month -= 12
                if len(str(new_month)) == 1:
                    new_month = '0' + str(new_month)
                new_date = str(new_year) + '.' + str(new_month) + '.' + pr[8:10]         
                if new_date <= today:
                    answer.append(privacies.index(pr) + 1)
                    break
    return answer

 

수정 코드

def solution(today, terms, privacies):
    answer = []
    for i, pr in enumerate(privacies, 1):
        for t in terms:
            if t.split()[0] in pr:
                year_plus = (int(t.split()[1])) // 12
                month_plus = (int(t.split()[1])) % 12
                new_year = int(pr[0:4]) + year_plus
                new_month = int(pr[5:7]) + month_plus   
                if new_month > 12:
                    new_year += 1
                    new_month -= 12
                if len(str(new_month)) == 1:
                    new_month = '0' + str(new_month)
                new_date = str(new_year) + '.' + str(new_month) + '.' + pr[8:10]
                print(new_date)
                if new_date <= today:
                    answer.append(i)
                    break
    return answer

'CodingTest' 카테고리의 다른 글

Programmers - 귤 고르기  (0) 2024.03.23
Programmers - 할인 행사  (1) 2024.03.23
Programmers - 신고 결과 받기  (0) 2024.03.18
Programmers - 신규 아이디 추천  (0) 2024.03.18
Programmers - 숫자 짝꿍  (0) 2024.03.13