본문 바로가기
🔅코딩테스트 공부🔅/❗프로그래머스(Lv.1)

[프로그래머스] Level1 개인정보 수집 유효기간(python)

by 윤무무 2023. 2. 12.

https://school.programmers.co.kr/learn/courses/30/lessons/150370

 

프로그래머스

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

programmers.co.kr

 

1. 내가 작성한 코드

 

제가 짠 코드는 넘나리 더러워서,, 다른 분이 푼 걸 참조하길 추천드려여,,

 

저도,,나주엥,,,다시풀어봐야하걸랑요,,,

 

def solution(today, terms, privacies):

    term = {} #이용약관 딕셔너리 형태로 재구성
    pr1 = [] #날짜
    pr2 = [] #약관종류    
    answer = [] #파기해야할 index
    
    for i in terms:
        a,b = i.split()
        term[a] = int(b) * 28
    
    today = (list(map(int,today.split(".")))) #today list로 재구성 [0] yy [1] mm [2] dd
    
    for j in privacies:
        a,b = j.split()
        pr1.append(list(map(int,a.split("."))))
        pr2.append(b)

    for k in range(len(pr1)): #유효기간        
        if (pr1[k][2] + term[pr2[k]]-1)% 28 != 0:
            result = pr1[k][2] + term[pr2[k]] -1
            result1 = ((result // 28) + pr1[k][1])
            pr1[k][2] = (pr1[k][2] + term[pr2[k]] -1) % 28 #DD
            
            if (result1 % 12) == 0:
                pr1[k][1] = 12
                pr1[k][0] += (result // 28) // 12
                
            else:       
                pr1[k][1] = ((result // 28) + pr1[k][1]) % 12 #MM
                pr1[k][0] += (result1 // 12) #YY
            
        else:
            result2 = ((term[pr2[k]] // 28) + pr1[k][1] - 1)
            pr1[k][2] = 28

            if ((term[pr2[k]] // 28) % 12) == 0:
                pr1[k][1] = 12
                pr1[k][0] += (term[pr2[k]]// 28) // 12
                
            else:       
                 pr1[k][1] = ((term[pr2[k]] // 28) + pr1[k][1] - 1) % 12
                 pr1[k][0] += (result2 // 12)
            
  
    for i in range(len(pr1)):
        if pr1[i][0] < today[0]:
            answer.append(i+1)
        elif pr1[i][0] == today[0] and pr1[i][1] < today[1]:
            answer.append(i+1)
        elif pr1[i][0] == today[0] and pr1[i][1] == today[1] and pr1[i][2] < today[2]:
            answer.append(i+1)
        
    answer.sort()
    print(pr1)
    return answer

 

2. 문제 해결 알고리즘

 

1. 약관 종류를 day로 바꿔서 딕셔너리 만들기

 

(모든 달이 28일이라고 정해졌기 때문에 *28)

 

for i in terms:
        a,b = i.split()
        term[a] = int(b) * 28
        
# {'A': 168, 'B': 336, 'C': 84}

 

2. today를 list로 재구성

today = (list(map(int,today.split("."))))

#[2020, 1, 1]

 

3. privacies의 값을 개인정보 수집 일자 / 약관 종류로 구분해서 다른 list에 삽입

 

    for j in privacies:
        a,b = j.split()
        pr1.append(list(map(int,a.split("."))))
        pr2.append(b)
        
#[[2021, 5, 2], [2021, 7, 1], [2022, 2, 19], [2022, 2, 20]]
#['A', 'B', 'C', 'C']

 

4. 

 

딱봐도 어지러워서 설명할 힘도 안난다리,, 미래의 나야 잘 해석해봐

 

    for k in range(len(pr1)): #유효기간        
        if (pr1[k][2] + term[pr2[k]]-1)% 28 != 0:
            result = pr1[k][2] + term[pr2[k]] -1
            result1 = ((result // 28) + pr1[k][1])
            pr1[k][2] = (pr1[k][2] + term[pr2[k]] -1) % 28 #DD
            
            if (result1 % 12) == 0:
                pr1[k][1] = 12
                pr1[k][0] += (result // 28) // 12
                
            else:       
                pr1[k][1] = ((result // 28) + pr1[k][1]) % 12 #MM
                pr1[k][0] += (result1 // 12) #YY
            
        else:
            result2 = ((term[pr2[k]] // 28) + pr1[k][1] - 1)
            pr1[k][2] = 28

            if ((term[pr2[k]] // 28) % 12) == 0:
                pr1[k][1] = 12
                pr1[k][0] += (term[pr2[k]]// 28) // 12
                
            else:       
                 pr1[k][1] = ((term[pr2[k]] // 28) + pr1[k][1] - 1) % 12
                 pr1[k][0] += (result2 // 12)

 

5. TODAY보다 '개인정보수집일자 + 약관 기간'이 빠르면 그 인덱스를 append해줌

 

이걸 어케 줄일 수 있을까.. 미래의 나야 고민해봐..

 for i in range(len(pr1)):
        if pr1[i][0] < today[0]:
            answer.append(i+1)
        elif pr1[i][0] == today[0] and pr1[i][1] < today[1]:
            answer.append(i+1)
        elif pr1[i][0] == today[0] and pr1[i][1] == today[1] and pr1[i][2] < today[2]:
            answer.append(i+1)

댓글