날짜 데이터와 지수 데이터의 차이 Get 하기.
인풋 값을 잘 확인하자.
사실 그냥 수학문제다. 어렵게 생각하지 말자.
- 요점은 날짜 개념과 지수 개념의 차이를 구분할 수 있느냐의 문제
- 날짜 → 2012년 12월 31일 은 2012년이다. 2012.12.31 에 추가로 +1일을 해야
2013년 1월 1일이 된다. 즉, 해당 연도나 월을 다 채운 상태로 유지가 가능하다.- 지수 → 9 + 1 = 10이다. 즉 ‘일의 자리수’에 10이 못들어간다.
해당 지수만큼 다 차면 다음 자리수로 넘어가서 0으로 대기한다.- 그렇다면 풀이는 두가지 방법이 있을 수 있는데,
그냥 지수형으로 풀자! : 인풋 받는 값을 % 으로 한번 걸러서 지수형 처럼 동작하게 함.
- 간과하기 쉬운게, % 연산자 쓰는 순간 지수형으로 풀겠다는 선언이다.
날짜형으로 쓰려면 % 쓰면 안된다.- N이 24일 때, N % 24 = 0 이니까… 만약 (N+(N//25)) % 25 으로 적으면 인정.
이왕이면 날짜형으로 풀자!: E의 경우를 예시로 들면,
# 만약 24일 짜리 달력을 생성한다고 하고, 날짜 X를 표시하려고 한다면, while X >= 25: X -= 24 # 24일 때 까지는 X에 그대로 저장되고, 25를 찍으면 1로 변환되도록 설정
# 7532. 세영이의 SEM력 연도
# 설계: K = 365 * n + S 로 이루어져 있으니, 그냥 K1 값을 S로 주고 +365씩 하자
# ver1 풀이: 그냥 지수형으로 풀자!
T = int(input())
for case_num in range(1,T+1):
S, E, M = input().split()
K = int(S)%365 # 365도 받을 수 있으므로 꼭 % 연산 해주자.
E = int(E)%24 # 24도 받을 수 있으므로 꼭 % 연산!
M = int(M)%29 # 29도 받을 수 있으므로 꼭 % 연산!
while True:
if ((K % 24) == E) and ((K % 29) == M)
print(f'#{case_num} {K}')
break
K += 365 # <반복> K 값에 +365씩 해주자.
# K를 따로 빼기 싫다면, 아래와 같이 구성할 수 있다.
# (((num * 365) + S ) % 24 == E) and (((num * 365) + S ) % 29 == M):
# 7532. 세영이의 SEM력 연도
# ver2. 이왕이면 날짜형으로 풀자!:
def check24(num_24): # 24가 Full 값인 날짜 데이터 형식
while num_24 >= 25: # 25 이상의 값일 경우
num_24 -= 24 # -24 해서 다음 단위로 넘기기
return num_24
def check29(num_29): # 29가 Full인 날짜 데이터 형식
while num_29 >= 30: # 30 이상의 값일 경우
num_29 -= 29 # -29 해서 다음 단위로 넘기기
return num_29
T = int(input())
for case_num in range(1,T+1):
S, E, M = map(int,input().split())
K = S # K가 우리가 구하는 값,
while True: # 첫값의 의미는 K = 365*0 + S
K_E = check24(K) # K를 24가 MAX인 날짜 데이터로 변환
K_M = check29(K) # K를 29가 MAX인 날짜 데이터로 변환
if (K_E == E) and (K_M == M):# 변환한 값이 각각 E, M과 일치하면
print(f'#{case_num} {K}')
break # 출력 후 반복문 종료
K += 365 # <반복> K는 365*n + S 이므로 += 365