아침-10시-코테-스터디-1주차

정 승 연·2023년 2월 5일
0

k0ding ㅌest

목록 보기
10/15

아침10시코테스터디

1주차

개인정보 수집 유효기간

terms 입력값을 파싱하여 딕셔너리에 저장하였습니다.
privacies 값을 파싱하여 terms 딕셔너리 (dict) 에서 해당 값을 가져오도록 했습니다.
딕셔너리에서 가져온 유효기간 값을 이용하여 날짜 계산을 해주었습니다.
날짜 파싱할 때 리스트 list(map(int,input.split(".")))를 사용하였습니다.
날짜 계산이 매우 복잡하고 어려웠습니다... 28일 곱하는 날짜계산으로 할걸 그랬습니다 ..

def main():
     terms =  ["Z 3", "D 5"]
     privacies = ["2019.01.01 D", "2019.11.15 Z", "2019.08.02 D", "2019.07.01 D", "2018.12.28 Z"]
     today = "2020.01.01"
     print(solution(today,terms,privacies))

 def solution(today, terms, privacies):
     answer = []
     dict = return_dict(terms)
     today = today

     for i in range(len(privacies)):
         privacies_split = privacies[i].split(" ")
         if date(today,dict,privacies_split[0],privacies_split[1]) == False:
             answer.append(i+1)
     return answer

 def return_dict(terms):
     dict={}
     for i in range(len(terms)):
         dict[terms[i].split(" ")[0]] = terms[i].split(" ")[1]
     return dict

 # today[0] : year
 # today[1] : month
 # today[2] : day
 def date(today,dict,due,term):
     validateMonth = int(dict[term])
     today = list(map(int,today.split(".")))
     due = list(map(int,due.split(".")))
     m = due[1] + validateMonth
     if m > 12:
         due[0] += m // 12
         due[1] = m % 12
     else:
         due[1] = m 
     if due[2] == 1:
         due[2] = 28
         if due[1] > 1:
             due[1] -= 1
         else:
             due[1] = 12
             due[0] -= 1
     else : due[2] -= 1  

     # 날짜 비교
     if today[0] > due[0]:
         return False
     elif today[0] == due[0] :
         if today[1] > due[1] :
             return False
         elif today[1] == due[1]:
             if today[2] > due[2]:
                 return False
     return True

 if __name__ == "__main__":
     main()

이렇게 날짜 계산 함수를 사용하면 비교 구문이 아주 깔끔해진다! 도하오빠 감사함니다

for privacy in privacies: # 날짜 비교 구문
         d, t = privacy.split()
         if day_cal(d) + term_dict[t] <= today_sum:

def day_cal(s): # 날짜 계산 함수
     year, month, day = s.split('.')
     sum = int(day) + int(month) * 28 + int(year) * 12 * 28

뒤에있는 큰 수 찾기

다른 자료구조 안만들고 입력받은 number를 pop 해서 일련의 과정을 거친 후 answer.append 하는게 목표였지만 이루지 못했습니다..

  • 여기서 생각한 일련의 과정
    • numbers를 하나하나 읽을 때마다 가장 큰 값 찾아서 append

그래서 우선순위 큐로 numbers 정렬하고 비교하면서 할까 했는데 그건 너무 비효율적인거같아요 그럴거면 굳이?

def solution(numbers):
     len_num = len(numbers) # numbers 길이
     answer = [-1] * len_num # 조건에 해당 안되는 경우를 위해 -1로 미리 초기화
     idx_stack = [] # index값 저장용 스택

     for i in range(len_num-1): # 어짜피 맨 마지막은 무조건 -1이라 한번 덜 반복
         idx_stack.append(i) # stack 배열에 index 넣기

				# statck에 index 넣을 때마다 numbers 배열값과 비교하여 가장 큰 값 갱신해줌
         while idx_stack and numbers[idx_stack[-1]] < numbers[i+1]:  
             answer[idx_stack.pop()] = numbers[i+1]

     return answer

마법의 엘리베이터

최소한의 수 를 구하라는 말에 DFS에 꽃혀서 이리저리 해보다가 성공했답니다.

answer = 1000000 # 전역변수

 def main():
     global answer # 이 메소드 내에서 전역변수 사용한다면 global로 선언해주어야함

     dfs(16,0)
     print(answer)

# 한자리씩 비교하는 것과 똑같음
# 해당 num이 0에 가까운지, 10에 가까운지 비교 : min(num,11-num) 
# 현재 나온 stone 값과 기존 값과 비교 min(answer,stone)
 def dfs(num,stone):
     global answer

     if(num < 10):
         stone += min(num,11-num) # 그냥 1*n || +10짜리 1개까지 합치고도 
         answer = min(answer,stone)
         return 

     res = num % 10 # 1##### ####에 해당하는 아이들. 나머지.
     num //= 10

     dfs(num,stone+res)  
     dfs(num+1,stone+(10-res))
     return 

 if __name__ == "__main__":
     main()

올바른 괄호

일단 “(”를 넣고 생각해보았습니다.
일단 “(”를 넣고, “(”이 아닌 “)”일 때 stack이 null 이면 False, stack에 “(”가 있으면 true

def solution(s):
     stack=[]
     for i in s:
         if(i == "("):
             stack.append(i)
         else:
             if(stack == []):
                 return False
             else:
                 stack.pop()
     return len(stack) == 0

가장 큰 수

quote

N으로 표현

0개의 댓글