코딩 테스트 연습 - 2016(프로그래머스 레벨1)

versatile309·2020년 3월 20일
0

CodingTest

목록 보기
11/19

01. 이해

a 와 b를 받아 2016년 a월 b월의 요일을 반환

02. 계획

2016년 1월 1일은 금요일이다.
윤년이므로 2월은 29일까지 있다.
a 와 b를 통해서 1월 1일부터 몇일이 지났는지를 계산하고 나누기 7한 나머지로 요일을 계산할 수 있을 것 같다.

03. 실행

fun solution(a: Int, b: Int): String = arrayOf("FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU")[
            (arrayOf(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
                .filterIndexed { index, _ -> index <= a-1 }
                .foldIndexed(-1, { index, acc, i ->
                    if (index < a-1) acc + i
                    else acc + b
                }))%7
    ]

04. 회고

중간에 삽질을 한번 했는데 1월의 첫날은 '1'일이고 요일 배열의 첫 인덱스는 '0'이다.
그래서 하루씩 계속 어긋났다.
fold의 시작을 -1로 선언해서
'1월 1일은 1월 1일로 부터 0일 지났으므로 인덱스 0인 금요일이다'
라고 구현하니까 해결 되었다.

java를 하던 버릇으로 변수 할당은 사이드 이펙트가 생길 것 같아 자제했는데 어차피 kotlin에서는 val로 선언된 immutable array는 변경이 불가능 하니까 요일과 달 별 날짜 수 배열은 따로 선언해서 빼는게 코드가 더 깔끔할 것 같다는 생각이 뒤늦게 들었다.

0개의 댓글