[프로그래머스]2016년

비얌·2022년 4월 17일
0

알고리즘

목록 보기
7/17
post-custom-banner

프로그래머스 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부터 넣었다.

내 풀이 python ver.1

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]

하지만 문제를 풀고 난 후 다른 풀이들을 보니, 이 풀이보다 좋은 풀이들이 훨씬 많았다. 그래서 다른 풀이들을 참고하여 이렇게 코드를 바꿔보았다.

내 풀이 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]

일단 now라는 변수에 4를 대입하여 day 리스트가 "MON"부터 시작할 수 있도록 했다. 그리고 now에 b를 더하고 %7을 하는 과정을 나누지 않고 합쳐서 한줄로 작성했다.


다른 풀이

아래의 풀이를 보고 내 풀이 python ver.2를 작성한 것이었다. 여기서는 "SUN"을 days 리스트에서 가장 앞에 두고, now 변수에는 5를 넣었다.

다른 풀이 python ver.1

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]

다른 풀이 python ver.2

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];

}
profile
🐹강화하고 싶은 기억을 기록하고 공유하자🐹
post-custom-banner

0개의 댓글