본문 바로가기
ps/boj

1924번 Python

by choi-dev 2024. 4. 6.

https://www.acmicpc.net/problem/1924

 

1924번: 2007년

첫째 줄에 빈 칸을 사이에 두고 x(1 ≤ x ≤ 12)와 y(1 ≤ y ≤ 31)이 주어진다. 참고로 2007년에는 1, 3, 5, 7, 8, 10, 12월은 31일까지, 4, 6, 9, 11월은 30일까지, 2월은 28일까지 있다.

www.acmicpc.net

문제에 대해서는 크게 어렵지 않다. 1월 1일이 월요일이라는 정보를 기준으로 입력받은 날짜의 요일을 출력해주면 된다.

 

month, date = map(int, input().split())
day_list = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]
mon_list = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

print(day_list[(sum(mon_list[:month]) + (date - 1)) % 7])

각 월별 날짜를 알려주었다는 것은 계산이 되는 것이라 생각했다. 그래서 분기문을 사용하지 않는 방향으로써 생각을 했다. 문제에서 3월 14일은 수요일이라고 테스트케이스의 결과를 알려줬고 3월 12일이 월요일임을 확인해 1월 1일부터 3월 12일까지의 일수를 먼저 구해봤다.

 

1, 2월의 합은 31 + 28로 59일이고 12일까지의 일수를 마저 더해주기 위해 59 + 11(12 - 1)을 했다. 70이 나왔고 이는 7로 나누었을 때 나머지가 0임을 알 수 있었고 해당 일수에 7을 나눈 나머지 값을 가지고 요일을 표시해줄 수 있다 생각했다.

 

day_list라는 리스트를 생성하고 월요일부터 시작해 일요일까지 표시했다. 내 코드는 나누었을 때 0이면 월요일, 1이면 화요일, ... 이런 식으로 진행하기 위함이다.

 

mon_list는 앞에 0을 추가해 인덱스보다 1 높게 설정해서 보다 편히 생각하기 위해 집어 넣었다. 위의 설명이 조금 누락됐는데 1월 1일부터 3월 12일까지 구했을 때 월의 합은 1, 2월로 했다, 즉, 입력받은 월에 대해 1을 뺀 부분까지만 일수를 구한건데 내 리스트의 경우에는 0이 추가되었기에 입력받은 month까지 슬라이싱했다. 그게 아니라면 month - 1까지 슬라이싱하면 될 것이다.

 

의도한대로 day_list의 나눈 나머지 값을 인덱스 삼아 출력해 정답이 되었다.

 

weekdays = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]
months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]


def weekday(month, day):
    days = sum(months[:month-1]) + day-1
    return weekdays[days % 7]


print(weekday(*(int(a) for a in input().split())))

24년 4월 6일 기준 백준 랭킹에 등재되어 있는 thenitromefan 이라는 분이 파이썬으로 풀었던 풀이를 찾아 이 분은 어떻게 풀었는지 보았다. 풀이에 대한 생각은 똑같이 할 수 있었는데 코드가 조금 달랐다.

 

print(weekday(*(int(a) for a in input().split())))

이 부분에 대한 부분만 짚고 넘어가면 될 것 같다. for a in input().split()을 통해 받은 인자를 weekday라고 하는 함수에 전달하려고 하는 부분임을 알 수 있었다. 다만 *(int(a))라고 하는 부분을 몰랐는데 가변 인자로 1 2를 입력하면 ['1', '2'] 리스트가 되고 int(a) 형변환을 통해 [1, 2] 정수로 변환이 되고 결과는 튜플로 (1, 2)를 값을 weekday 함수의 매개변수로 전달해주게 되는 것이라고 한다.

 

설명에 틀린 부분이 있어서 해당 부분을 지웠다. 위의 코드를 좀 더 순차적으로 정리하려고 한다.

 

int(a) for a in input.split()

input.split()을 통해 받은 값을 정수형으로 처리한 제너레이터다.

 

*(int(a) for a in input().split())

함수에 이와 같은 형태로 인자에 넣는다면 가변 인자로써 동작하게 된다.

 

def test(a, b, c):
    return [a, b, c]

print(test(*(int(a) for a in input().split())))

이렇게 했을 때, 입력값에 1 2 3 4를 넣으면 에러가 발생하고 1 2 3을 넣으면 [1, 2, 3]이라는 리스트가 출력될 것이다, 즉, 일반적으로 함수에 대해 파라미터를 지정해줄 때는 해당 함수가 요구하는대로 파라미터를 넣어주었다면 *를 통해 가변 인자를 함수로 전달할 수 있게 해주는 것이라고 생각하면 된다.

'ps > boj' 카테고리의 다른 글

2446번 Python  (0) 2024.04.22
8393번 Python  (0) 2024.04.06
11721번 Python  (0) 2024.04.06
11720번 Python  (0) 2024.04.04
10951번 Python  (0) 2024.04.04