프로그래머스 1단계 문제인 '2016' 문제를 풀어보았다.
https://programmers.co.kr/learn/courses/30/lessons/12901
2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까지 각각 SUN,MON,TUE,WED,THU,FRI,SAT입니다.
예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 "TUE"를 반환하세요.
2016년은 윤년입니다.
2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)
처음에는 아래와 같이 풀었다. a달 b일이라고 하면 a달에 해당하는 만큼의 일수를 for문으로 가져오고, 여기에 b일을 더했다. 1월 1일이 금요일이었기 때문에 day 리스트에는 FRI부터 넣었다.
def solution(a, b):
day = ['FRI','SAT', 'SUN','MON','TUE','WED','THU']
day_ends = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
res = 0 # res 초기화
# a에 해당하는 부분을 계산하는 식
# 예를 들면 3월 b일 일 때 (3-1)월까지만 더하고 b를 더한다.
for i in range(a-1):
res += day_ends[i]
# b에 해당하는 부분을 계산하는 식
res += b
# res에 a월 b일까지 며칠인지를 모두 더한 다음, 7로 나눈 나머지의 인덱스로 요일을 구한다
res %= 7
return day[res-1]
하지만 문제를 풀고 난 후 다른 풀이들을 보니, 이 풀이보다 좋은 풀이들이 훨씬 많았다. 그래서 다른 풀이들을 참고하여 이렇게 코드를 바꿔보았다.
def solution(a, b):
day = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]
day_end = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
now = 4
for i in range(a-1):
now += day_end[i]
res = ((now + b) % 7) - 1
return day[res]
일단 now라는 변수에 4를 대입하여 day 리스트가 "MON"부터 시작할 수 있도록 했다. 그리고 now에 b를 더하고 %7을 하는 과정을 나누지 않고 합쳐서 한줄로 작성했다.
아래의 풀이를 보고 내 풀이 python ver.2를 작성한 것이었다. 여기서는 "SUN"을 days 리스트에서 가장 앞에 두고, now 변수에는 5를 넣었다.
def solution(a, b):
days = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]
dayLen = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
now = 5
for i in range(0, a - 1) :
now += dayLen[i]
answer = (now + b - 1) % 7
return days[answer]
def getDayName(a,b):
week=['FRI','SAT','SUN','MON','TUE','WED','THU']
month=[31,29,31,30,31,30,31,31,30,31,30,31]
return week[(sum(month[:a-1])+(b-1))%7]
이렇게 짧게 작성할 수도 있었다. sum(month[:a-1])
이라고 하면 month 리스트에서 0부터 a-2인덱스까지의 모든 값을 더하게 된다. 이렇게 하면 for문을 쓰지 않고도 1월 1일부터 a달 b일까지 며칠이 흘렀는지를 구할 수 있었다.
내 풀이 python ver.2를 자바스크립트 버전으로 바꾸어보았다.
# 내 풀이 python ver.2
def solution(a, b):
day = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]
day_end = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
now = 4
for i in range(a-1):
now += day_end[i]
res = ((now + b) % 7) - 1
return day[res]
# 자바스크립트로 바꾼 버전
function solution(a, b) {
var days = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"];
var dayLen = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
var now = 4;
for (var i=0; i<(a-1);i++) {
now += dayLen[i];
}
res = ((now + b) % 7) - 1;
return days[res];
}