알고리즘

알고리즘 2023kakaoblind-개인정보 수집 유효기간(python)

2료일 2023. 4. 30. 01:45

def solution(today, terms, privacies):
    termDict = {}
    answer =[]
    todayyear, todaymonth, todayday = int(today[0:4]), int(today[5:7]), int(today[8:])
    for i in terms:
        termDict[i[0]] = int(i[2:])
    for index, j in enumerate(privacies):
        uhogigan = termDict[j[-1]]
        year = int(j[0:4])
        month = int(j[5:7])
        day = int(j[8:10])
        aftermonth = month + int(uhogigan)
        if(aftermonth>12):
            year+=1
            aftermonth -= 12
        if(year>todayyear): #이미 유효기간이 개인정보년보다 길면
            continue
        elif(year==todayyear):
            if(aftermonth>todaymonth):
                continue
            elif(aftermonth == todaymonth):
                if(todayday<day):
                    continue
        answer.append(index+1)
    return answer

첫번째 트라이. 주어진 예시들은 다 통과지만 테스트 결과 30밖에 안나왔다. 일단 틀린 풀이지만 천천히 설명을 해보자면 terms에 ["A 9","B 4"]이런식으로 주어지면 이것을 {"A": 9, "B" : 4} 딕셔너리 형식으로 바꿨다. 후에 privacies마지막 char이 알파벳이 될텐데 거기서 뽑아서 바로 키값에 넣어 value를 찾기 위해서이다. 유효기간이 넘는것의 인덱스넘버+1을 출력하는게 목표기에 enumerate로 배열을 받아왔다. 그 후 이전에만든 dict의 키로 우리가 원하는 기간을 꺼낸뒤 그것을 privacies의 month와 더해준다. 
만약 그것이 12월을 넘은경우는 연도에 +1을 해주고 aftermonth는 12를 빼준다.

그 후 이후연도와 오늘연도를 비교해 만약 작다면 추가해야하고 아니라면 이후월과 오늘월을 비교해 작다면 추가하고 아니라면 이후일과오늘일을 비교해 작다면 추가하기 위해 그 외의것들을 continue로 해주고 위에 말한경우만 append해주었다. 

에러가 뜨는 이유를 한참동안 수정하다가 반례를 찾아버렷다. 바로 if(aftermonth>12)여기인데

today = "2024.4.12", terms= ["F 24"]가 나왔고 privacies가 "2022.12.12 F"라고 해보자 이렇게 되면 aftermonth는 36이되는데 if문 한번돌면 24가 되고 년도는 2023이 되기에 추가되지 않는다. 그렇기에 while문으로 돌려주어야 우리가 원하는 값을 내보낼 수 있다. 

왜 놓쳤지..?최종코드

def solution(today, terms, privacies):
    termDict = {}
    answer =[]
    todayyear, todaymonth, todayday = int(today[0:4]), int(today[5:7]), int(today[8:])
    for i in terms:
        termDict[i[0]] = int(i[2:])
    for index, j in enumerate(privacies):
        uhogigan = termDict[j[-1]] 
        year,month,day = int(j[0:4]), int(j[5:7]),int(j[8:10]) 
        aftermonth = month + uhogigan
        while(aftermonth>12):
            year+=1
            aftermonth -= 12
        if(year>todayyear): #이미 유효기간이 개인정보년보다 길면
            continue
        elif(year==todayyear):
            if(aftermonth>todaymonth):
                continue
            elif(aftermonth == todaymonth):
                if(todayday<day):
                    continue
        answer.append(index+1)
    return answer

이건 시간복잡도가 n이기에 시간초과 이슈는 없었다.