[프로그래머스] 2016년-JAVA

말하는 감자·2022년 6월 29일
0

Programmers Level 1

목록 보기
43/66
post-thumbnail

프로그래머스 Level 1

🔒 2016년

📚 문제 설명

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일같은 날짜는 주어지지 않습니다)


📖 입출력 예

abresult
524"TUE"

🗝️ 작성 코드

class Solution {
    public String solution(int a, int b) {
        String[] days = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
        int[] months = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30};
        int total = 0; // 총 일수
        
        for(int i=0; i<a; i++) {
            total += months[i];
        }
        total += b;

        return days[(total + 4) % 7];
    }
}

2016년은 윤년이기 때문에 2월은 29일이다.

코드 내용은 단순하다.
2016년 a월 b일까지의 총 일수를 구하고
1월 1일이 금요일부터 시작이므로 4를 더한 후 7로 나눈 나머지를 요일 배열 days의 인덱스로 하면 되었다.

감자는 크게 두가지로 고민을 했는데

❓ 첫번째는 월의 일수를 저장한 배열 months{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}로 1월부터 12월까지의 일수를 넣었는데 for문을 예쁘게 만들 방법이 없었다.
심지어 12월의 일수는 쓸 일도 없었다.

1월일 때는 for문을 안돌리고 싶었는데 그럼 if문으로 1월 체크도 하고 for문에서 조건을 i<(a-1)도 해서 코드가 안예뻤다...

❗️ 그래서 1월일 때도 for문을 돌리지만 total에 더해지면 안되므로 0번째 인덱스를 0으로 하는 방법을 썼다.

❓ 두번째 고민은 1월 1일이 금요일이므로 단순히 7로 나눈다고 금요일이 나오지 않는다는 점이였다.

FRI가 5번째 인덱스이니 5를 뺐다가 테스트 케이스에서 TUE대신 SUN이 나오는 걸보고 -3으로도 했는데 잘 작동되었다.

근데 왜 -3을 해야하는지 몰라서 곰곰히 생각했다.

❗️1월 1일을 감자가 짠 코드로 실행해본다면 total은 1이다. 7로 나눈 나머지도 1이므로 days의 인덱스로 1을 넣는다면 MON이 나와야 한다.
하지만 1월 1일은 금요일이므로 5번째 인덱스인 FRI가 나와야한다. 이 차이에 4만큼 차이가 나는 것이다.
요일은 7일을 주기로 되돌아오므로 4만큼 더하든 3만큼 빼든 같은 값이 나오는 것이다.

그럼 4를 더해도 되겠네? 하고 4를 더한 게 최종 코드가 되었다. 최초 코드는 days[(total - 3) % 7]이였다.


🔓 다른 사람의 코드

import java.time.*;
class Solution {
  public String solution(int a, int b) {
      return LocalDate.of(2016, a, b).getDayOfWeek().toString().substring(0,3);
  }
}

LocalDate를 쓰는 방법도 있었다.
이걸 써도 된다는 생각을 안했는데 안될 것도 없었다. 😅


🙂 느낀 점

처음에는 진짜 막막했다.

switch/case문이나 if문으로 모든 월을 확인할까 고민도 했다.
(다른사람 풀이를 보니 실제로 해낸 사람도 있었다.)

근데 요일도 배열로 썼는데 월을 조건문으로? 싶으서 월도 배열로 넣어 총일수를 구했다.

한번 틀이 잡히니 해볼만 했다.
역시 설계가 제일 어려운 것 같다.

profile
나는 말하는 감자다

0개의 댓글