본문 바로가기

코테 공부/python

[프로그래머스] Python 코테 스터디 개인정보 수집 유효기간

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

 

내 코드

열심히 분화 분화 분화ㅎㅎㅎㅎ

def solution(today, terms, privacies):
    answer = []
    
    #dic으로 약관 종류, 기간 나누기
    termsdic = {}
    for c in terms:
        key, val = c.split()
        termsdic[key] = int(val)
        
    #오늘 날짜 년 월 일 split('.')
    todayY, todayM, todayD = [int(i) for i in today.split('.')]
    
    #for range로(회원번호때문에) privacies if 약관 해서 날짜 구하는 로직
    for i in range(len(privacies)):
        #날짜 구하는 로직 split() 해서 약관 떼고 
        due, priv = privacies[i].split()
        #다시 split('.')해서 년 월 일 구하고
        
        dueY, dueM, dueD = [int(i) for i in due.split('.')]
        
        #일-1 해서 if == 0하면 28 할당 월 -= 1
        if dueD - 1 == 0:
            dueD = 28
            dueM -= 1
        else: dueD -= 1
        
        #월+(약관에 해당하는 기간) 해서 12로 나눠떨어지지 않으면 하면 -12 * n 해주고 년 += n
        #여기서 (dueM + termsdic[priv] - 1) 에다가 12 나눈 몫을 구하는 이유는
		#-1 해야 12월 이럴때 연도 +1 안되고 13월부터 연도 +1 되니까
        
        if (dueM + termsdic[priv]) % 12 != 0:
        	# dueY += (dueM + termsdic[priv]) // 12 이렇게 해서 자꾸 통과 안되는 문항이 있었다
            dueY += (dueM + termsdic[priv] - 1) // 12
            # 심지어 이거 위아래 줄 바꿔서 dueM이 먼저 바뀌는 바람에 dueY가 잘못 바뀌는 에러도 있었다
            dueM = (dueM + termsdic[priv]) % 12
        else:
            dueY += (dueM + termsdic[priv] - 1) // 12
            dueM = 12
            
        print(dueY, dueM, dueD)
        

        if todayY < dueY:
            continue
        elif todayY > dueY:
            answer.append(i+1)
        else:
            if todayM < dueM:
                continue
            elif todayM > dueM:
                answer.append(i+1)
            else:
                if todayD > dueD:
                    answer.append(i+1)
                else:
                    continue
            
        
    return answer

 

스터디원의 기똥찬 아이디어

일수로 다 변환하여 비교하기

if 문에 = 부등호까지 들어가는 이유는 원래 유효기간 날짜를 셀때 당일부터 카운팅을 해야하는데 카운팅 안하고 일수 냅다 더해버리니 유효날짜(p_days)가 항상 +1 크게 나왔기 때문에

if 문에 의미상 if p_days < today_days 이어야 하나  if p_days <= today_days 이렇게 해야 맞는 답이 나온다

def solution(today, terms, privacies):
    d = {}
    answer = []    
    for term in terms:
        t, m = term.split(' ')
        d[t] = int(m) * 28
    
    today_days = into_days(today)
    for idx, p in enumerate(privacies):
        date, term = p.split(' ')
        p_days = into_days(date) + d.get(term)
        
        if p_days <= today_days:
            answer.append(idx + 1)
        
    return answer


def into_days(date):
    year, month, day = map(int, date.split('.'))
    return year * 12 * 28 + month * 28 + day

이렇게 하니 고려해야할 사항들도 훨씬 적어지고..

문제를 풀때 생각부터 하고 풀어야하는데 문제 그대로 수학문제 풀듯이 코드로 옮길 생각부터 해서 문제다!!!!!