[C++] 프로그래머스 2016년
2020. 11. 7.
반응형

programmers.co.kr/learn/courses/30/lessons/12901

 

코딩테스트 연습 - 2016년

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까

programmers.co.kr

1. 서론

 

level 1짜리 간단한 문제이다. 처음엔 자바로 날짜 함수를 이용해서 풀어야 되나 하고 막연하게 어렵게 생각했는데 그냥 숫자 놀이하는 간단한 문제다. 학부 1학년 때 자주 만나는 그런 문제.

 

2. 문제 풀이

 

2016년 1월 1일은 금요일이다. 2016년 a월 b일은 무슨 요일인지 출력하는 문제이다.

2016년은 윤년이라 2월이 29일까지 있다. 그 점을 고려해서 문제를 풀어야 한다.

입출력 예시로 문제를 풀어보자.

2016년 5월 24일은 화요일이다. 2016년 1월 1일이 금요일인 것만을 가지고 어떻게 문제를 풀 수 있을까?

1, 2, 3, 4월의 일수를 모두 더한다. 그리고 24일도 더한다. 그리고 일주일은 7일이니까 7로 나눈 나머지 값을 구한다.

그리고 1월 1일은 금요일이니까 금요일을 기준으로 얼마나 지났는지를 세어본다. 

 

31 + 29 + 31 + 30 + 24 = 145

 

145 % 7 = 5

 

금 토 일 월 화

 

=>화요일

 

3. 코드 설명

 

1) 이론대로만 생각해서 푼 경우

 

#include <string>
#include <vector>

using namespace std;

string solution(int a, int b) {
    string answer = "";
    char d[7][5] = {"FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"};
    int m[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int i, x = b;
    
    for (i = 0; i < a - 1; i++)
        x += m[i];
    x %= 7;
    
    answer = d[x - 1];
    
    return answer;
}

 

처음엔 그냥 이렇게 풀었다. d배열에 금요일을 기준으로 일주일을 입력하고 m배열에는 12월의 일 수를 넣어줬다.

x에 b일 값을 미리 넣어준다. 그리고 a - 1월의 모든 일 수를 더하고 7의 나머지를 x에 넣는다.

그리고 배열은 0부터 시작이니까 x - 1을 해서 배열을 맞춰준다.

 

틀릴 수가 없는 코드라고 생각했는데 테스트 케이스 9, 13번 두 개를 틀렸다.

그래서 질문하기에 들어가서 보니까 배열이기 때문에 -1을 하면 범위를 넘어가는 경우가 생길 수 있단다.

그래서 코드를 이렇게 바꿨다.

 

2) 배열을 고려해준 경우

 

#include <string>
#include <vector>

using namespace std;

string solution(int a, int b) {
    string answer = "";
    char d[7][5] = {"FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"};
    int m[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int i, x = b - 1;
    
    for (i = 0; i < a - 1; i++)
        x += m[i];
  
    answer = d[x % 7];
    
    return answer;
}

 

바뀐 건 거의 없다. 논리는 똑같고 -1을 그냥 미리 해주고 배열 안에서 바로 % 7을 해줬다. 그러면 배열을 범위를 잘못 넘나드는 경우가 사라진다. 내가 전혀 생각하지 못한 케이스라서 고치긴 했지만 아직 좀 얼떨떨하다. 

 

 

 

 

 

 

 

 

 

반응형
myoskin