SWEA (SW Expert Academy)/D1

[SWEA/D1] 2056 연월일 달력 / dict()

hellosonic 2023. 3. 17. 00:58

문제 바로가기

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

나의 코드 및 설명

  • 여러 개의 if문 분기를 통해 문제를 해결하였다.. 맞긴 맞았지만 다른 방법을 찾아야할 듯..
T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
    date = list(map(int, input())) #0123 / 45 / 67
    year = date[:4]
    month = date[4:6]
    day = date[6:]
    month_ans = 0
    day_ans = 0
    year_ans = year[0] * 1000 + year[1] * 100 + year[2] * 10 + year[3]
    if 1 <= month[0] * 10 + month[1] <= 12:
        month_ans = month[0] * 10 + month[1]
        if month_ans == 1 or month_ans == 3 or month_ans == 5 or month_ans == 7 or month_ans == 8 or month_ans == 10 or month_ans == 12 :
            if 1 <= day[0] * 10 + day[1] <= 31:
                day_ans = day[0] * 10 + day[1]
            else:
                print("#{} {}".format(test_case, -1))
                continue
        elif month_ans == 4 or month_ans == 6 or month_ans == 9 or month_ans == 11:
            if 1<= day[0] * 10 + day[1] <= 30:
                day_ans = day[0] * 10 + day[1]
            else:
                print("#{} {}".format(test_case, -1))
                continue
        else:
            if 1<= day[0] * 10 + day[1] <= 28:
                day_ans = day[0] * 10 + day[1]
            else:
                print("#{} {}".format(test_case, -1))
                continue
        if month_ans < 10:
            if day_ans < 10:
                print("#{0} {1}{2}{3}{4}{5}{6}{7}{8}{9}{10}".format(test_case, year[0],year[1], year[2], year[3], "/", 0, month_ans, "/", 0, day_ans))
            else:
                print("#{0} {1}{2}{3}{4}{5}{6}{7}{8}{9}".format(test_case, year[0],year[1], year[2], year[3], "/", 0, month_ans, "/", day_ans))
        else:
            if day_ans < 10:
                print("#{0} {1}{2}{3}{4}{5}{6}{7}{8}{9}".format(test_case, year[0],year[1], year[2], year[3], "/", month_ans, "/", 0, day_ans))
            else:
                print("#{0} {1}{2}{3}{4}{5}{6}{7}{8}".format(test_case, year[0],year[1], year[2], year[3], "/", month_ans, "/", day_ans))
            
    else:
        print("#{} {}".format(test_case, -1))
        continue

다른 코드 및 설명 01

  • 아.. 한참 헤맸다. 왜 헤맸냐, SWEA 에 vscode에서 작성한 코드를 복붙했는데, 자꾸 에러가 나는 것이다. 왜 에러가 나지? 분명히 맞는데 왜 에러가 나지? 아, 설마 복붙을 막아두었나..? 싶어서 SWEA에 손수 코드를 작성했더니 그제서야 정상적으로 실행되었다.
    SWEA ... 철두철미하구나.
  • 이 문제를 풀면서 제일 어려웠던 점은, 첫 번째로 입력받은 리스트를 4/2/2로 쪼개고 나서 어떻게 다시 이어붙이는가? 였다.
    생각보다 간단했다. 문자열끼리의 덧셈을 이용하면 된다. 예를 들면, "111" + "1" = "1111" 인 것이다.
  • 두 번째로 어려웠던 점은, 하나의 if문에서 비교 연산자 좌측 항의 변수는 고정되어 있고, 여러 개의 값과 비교할 때, 중복해서 코드를 작성하는 바람에 코드가 지저분해보였다는 점이다. 예를 들면, if month == 1 or month == 3 or .... or month == 12..
    이것은 리스트 안에 비교 대상 값들을 저장하여 간단하게 표현할 수 있었다. 다음과 같다.
    >> if (int(month) in [1, 3, 5, 7, 8, 10, 12]):
t = int(input())
for test_case in range(1, t+1):
    date = list(input())
    #빈 문자열 초기화
    year = "" 
    month = ""
    day = ""
    #for문을 돌면서 date 값을 더해준다. 
    #이렇게 하면 1+1+1+1 = 1111 이 된다. (문자열의 더하기)
    for i in range(4):
        year += date[i]
    for j in range(4,6):
        month += date[j]
    for k in range(6,8):
        day += date[k]

    #리스트를 만들어주고 <in> 을 통해 리스트 중 일치하는 값이 있는지 체크한다.
    if (int(month) in [1,3,5,7,8,10,12]) and (0 < int(day) < 32):
        ans = str(year) + "/" + str(month) + "/" + str(day)
    elif (int(month) in [4,6,9,11]) and (0 < int(day) < 31):
        ans = str(year) + "/" + str(month) + "/" + str(day)
    elif int(month) == 2 and (0 < int(day) < 29):
        ans = str(year) + "/" + str(month) + "/" + str(day)
    else:
        ans = "-1"
    print("#{} {}".format(test_case, ans))

문자열끼리 더하는 코드 작성
출력 값

  • 참고로, 입력 값을 리스트에 저장하지 않고 이런 식으로도 작성이 가능하다.
for test_case in range(1, t+1):
    date = input()
    year = date[:4]
    month = date[4:6]
    day = date[6:8]
    
>> 입력 값 : 22220228

>> 출력 값
>> year : 2222
>> month : 02
>> day : 28

다른 코드 및 설명 02 (딕셔너리 사용)

  • 딕셔너리 days의 key에 month, value에 day를 저장하여 days[int(month)]를 통해 입력받은 month에 해당하는 day를 간단하게 찾아서 해결할 수 있다.
t = int(input())

for test_case in range(1, t+1):
    date = input()
    year = date[:4]
    month = date[4:6]
    day = date[6:]
    days = {1:31, 2:28, 3:31, 4:30, 5:31, 6:30, 7:31, \
            8:31, 9:30, 10:31, 11:30, 12:31}
    
    if 0 < int(month) < 13 and int(day) <= days[int(month)]:
        print("#{} {}/{}/{}".format(test_case, year, month, day))
    else:
        print("#{} {}".format(test_case, -1))

피드백

백준에서도 연간달력 비슷한 문제를 풀었던 것 같다. 당시에도 맞았던 기억이 나지만, 이번에 비슷한 문제를 다시 풀어보려니 막막했다. 특히 월에 따라 최대 일 수가 다르고, 일 수의 십의 자리와 일의 자리를 묶어서 계산하려니 머릿 속이 복잡해졌던 것 같다. 
입력받은 연월일리스트 슬라이싱을 통해 잘라내고, 연월일을 각각 따로따로 고려하여 문제를 해결하는 것이 키포인트.

딕셔너리 활용법에 대해서도 좀 더 숙달이 되어야겠다.