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