SWEA 7532. 세영이의 SEM력 연도 python(파이썬)

Kang HwanSeok·2022년 8월 10일
0

SWEA

목록 보기
1/8
post-thumbnail

문제 간략 설명

날짜 데이터와 지수 데이터의 차이 Get 하기.

문제 포인트

인풋 값을 잘 확인하자.

알아갈 개념 요약

사실 그냥 수학문제다. 어렵게 생각하지 말자.

  • 요점은 날짜 개념과 지수 개념의 차이를 구분할 수 있느냐의 문제
    • 날짜 → 2012년 12월 31일 은 2012년이다. 2012.12.31 에 추가로 +1일을 해야
      2013년 1월 1일이 된다. 즉, 해당 연도나 월을 다 채운 상태로 유지가 가능하다.
    • 지수 → 9 + 1 = 10이다. 즉 ‘일의 자리수’에 10이 못들어간다.
      해당 지수만큼 다 차면 다음 자리수로 넘어가서 0으로 대기한다.
  • 그렇다면 풀이는 두가지 방법이 있을 수 있는데,
    1. 그냥 지수형으로 풀자! : 인풋 받는 값% 으로 한번 걸러서 지수형 처럼 동작하게 함.

      • 간과하기 쉬운게, % 연산자 쓰는 순간 지수형으로 풀겠다는 선언이다.
        날짜형으로 쓰려면 % 쓰면 안된다.
      • N이 24일 때, N % 24 = 0 이니까… 만약 (N+(N//25)) % 25 으로 적으면 인정.
    2. 이왕이면 날짜형으로 풀자!: E의 경우를 예시로 들면,

      # 만약 24일 짜리 달력을 생성한다고 하고, 날짜 X를 표시하려고 한다면,
      while X >= 25:
      	X -= 24
      # 24일 때 까지는 X에 그대로 저장되고, 25를 찍으면 1로 변환되도록 설정

풀이

  • ver.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):
  • ver.2 날짜형 데이터로 풀기
    # 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
profile
알고리즘을 좋아하는 개발자

0개의 댓글