Light Blue Pointer
본문 바로가기
Coding Test

[프로그래머스]2016년

by Greedy 2023. 11. 29.

문제 주소

https://school.programmers.co.kr/learn/courses/30/lessons/12901

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

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 result

5 24 "TUE"

 

풀이 과정

달 일수 세서 더해주고 날짜 더해주고 7로 나누면 무슨요일인지 나오겠지

import java.util.HashMap;

class Solution {
    public String solution(int a, int b) {
        
        int [] end = {31,29,31,30,31,30,31,31,30,31,30,31};
        String [] dayName = {"SUN","MON","TUE","WED","THU","FRI","SAT"};

        int days = b; //from Jan 1st
        for(int i = 0; i<a; i++){
            days += end[i];
        }
        return dayName[days%7+1];
    }
}

런타임 에러 나길래 %7하나 추가함

import java.util.HashMap;

class Solution {
    public String solution(int a, int b) {
        
        int [] end = {31,29,31,30,31,30,31,31,30,31,30,31};
        String [] dayName = {"SUN","MON","TUE","WED","THU","FRI","SAT"};

        int days = b; //from Jan 1st
        for(int i = 0; i<a; i++){
            days += end[i];
        }
        return dayName[(days%7+1)%7];
    }
}

테스트 1 〉 통과 (0.02ms, 76.4MB)

테스트 2 〉 통과 (0.03ms, 74MB)
테스트 3 〉 통과 (0.03ms, 73.1MB)
테스트 4 〉 실패 (0.02ms, 74.9MB)
테스트 5 〉 통과 (0.02ms, 75MB)
테스트 6 〉 통과 (0.02ms, 76MB)
테스트 7 〉 실패 (0.03ms, 65.3MB)
테스트 8 〉 실패 (0.03ms, 73.5MB)
테스트 9 〉 통과 (0.04ms, 75.6MB)
테스트 10 〉 통과 (0.02ms, 71.6MB)
테스트 11 〉 실패 (0.02ms, 76.4MB)
테스트 12 〉 통과 (0.02ms, 74.5MB)
테스트 13 〉 실패 (0.02ms, 73MB)
테스트 14 〉 통과 (0.02ms, 80.1MB)

테스트케이스 추가해봄

Saturday December 31, 2016

Friday January 1, 2016

Monday August 1, 2016

테스트 1입력값 〉5, 24
기댓값 〉"TUE"
실행 결과 〉테스트를 통과하였습니다.
테스트 2입력값 〉8, 1
기댓값 〉"MON"
실행 결과 〉테스트를 통과하였습니다.
테스트 3
입력값 〉12, 31
기댓값 〉"SAT"
실행 결과 〉테스트를 통과하였습니다.
테스트 4
입력값 〉1, 1
기댓값 〉"FRI"
실행 결과 〉테스트를 통과하였습니다.

아니,, 뭐죠

왜 틀리는지 이해도 안 됨 다시 봐도 틀릴데가 없는데요

1월이면 틀릴거같음

Sunday January 31, 2016

Friday January 8, 2016

아 근데 지금 이상하게 하고있는게 1월 1일이 FRI인데 왜 SUN 부터 출발하고 있지?

String [] dayName = {"FRI","SAT","SUN","MON","TUE","WED","THU"};

1월 1일부터 days 세니까 이렇게 바꿈

1 1이 들어오면

class Solution {
    public String solution(int a, int b) {
        
        int [] end = {31,29,31,30,31,30,31,31,30,31,30,31};
        String [] dayName = {"FRI","SAT","SUN","MON","TUE","WED","THU"};

        int days = b; //from Jan 1st
        for(int i = 0; i<a-1; i++){
            days += end[i];
        }
        return dayName[((days%7)-1)%7];
    }
}

테스트 1 〉 통과 (0.03ms, 76MB)

테스트 2 〉 통과 (0.03ms, 66.2MB)
테스트 3 〉 통과 (0.02ms, 70.9MB)
테스트 4 〉 통과 (0.03ms, 72.4MB)
테스트 5 〉 통과 (0.04ms, 73.9MB)
테스트 6 〉 통과 (0.02ms, 74.6MB)
테스트 7 〉 통과 (0.03ms, 78.7MB)
테스트 8 〉 통과 (0.03ms, 73.5MB)
테스트 9 〉 실패 (런타임 에러)
테스트 10 〉 통과 (0.02ms, 78.4MB)
테스트 11 〉 통과 (0.02ms, 78.4MB)
테스트 12 〉 통과 (0.03ms, 70.9MB)
테스트 13 〉 실패 (런타임 에러)
테스트 14 〉 통과 (0.03ms, 73.5MB)

런타임 에러는 배열 잘못읽었을때밖에 날 게 없는데 모듈로 7을 해줬으면 0-6까지가 떠서 맞아야되는거 아닌가?

return dayName[((days%7)-1)%7];

int days = b-1

return dayName[days%7]

이렇게 고치니까 됐다

 

왜일까?

A. -1을 %하면 6이 나오지 않고 -1이 나온다

⚠️-1을 %하면 -1이 나오니까 주의하자

System.out.println(-1%7);
-1

 

제출 코드

class Solution {
    public String solution(int a, int b) {
        
        int [] end = {31,29,31,30,31,30,31,31,30,31,30,31};
        String [] dayName = {"FRI","SAT","SUN","MON","TUE","WED","THU"};

        int days = b-1; //from Jan 1st
        for(int i = 0; i<a-1; i++){
            days += end[i];
        }
        return dayName[days%7];
    }
}

 

다른 사람의 풀이

나랑 똑같이 푼 풀이가 많았다 

class TryHelloWorld
{
    public String getDayName(int a, int b) {
        String answer = "";
        String[] day = { "FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU" };
        int[] date = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
        int allDate = 0;
        for (int i = 0; i < a - 1; i++) {
            allDate += date[i];
        }
        allDate += (b - 1);
        answer = day[allDate % 7];

        return answer;
    }
    public static void main(String[] args)
    {
        TryHelloWorld test = new TryHelloWorld();
        int a=5, b=24;
        System.out.println(test.getDayName(a,b));
    }
}

 

class Solution {
  public String solution(int a, int b) {
      String answer = "";

      int[] c = {31,29,31,30,31,30,31,31,30,31,30,31};
      String[] MM ={"FRI","SAT","SUN","MON","TUE","WED","THU"};
      int Adate = 0;
      for(int i = 0 ; i< a-1; i++){
          Adate += c[i];
      }
      Adate += b-1;
      answer = MM[Adate %7];

      return answer;
  }
}

 

좀 신기했던 것들

import java.util.*;

class TryHelloWorld
{
    public String getDayName(int month, int day)
    {
        Calendar cal = new Calendar.Builder().setCalendarType("iso8601")
                        .setDate(2016, month - 1, day).build();
        return cal.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, new Locale("ko-KR")).toUpperCase();
    }
    public static void main(String[] args)
    {
        TryHelloWorld test = new TryHelloWorld();
        int a=5, b=24;
        System.out.println(test.getDayName(a,b));
    }
}

Calendar나 저런거 있는거 처음 알아서 신기하다

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