초보 개발자의 이야기, 릿허브

[C++] 프로그래머스 2016년 본문

코딩테스트/📘 프로그래머스 (programmers)

[C++] 프로그래머스 2016년

릿99 2021. 8. 16. 13:56
728x90
반응형
1. 문제이해

코딩테스트 연습 - 2016년 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 2016년

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

programmers.co.kr

 

2016년 a월 b일을 입력받아, 해당 날짜의 요일이 몇일인지를 리턴하는 알고리즘을 구현하는 것이 목표이다.

(2016년 1월 1일은 금요일로 설정하며, 2016년은 윤년이다.)

 

 

 

2. 문제풀이

 

2016년 중 하루를 입력받아 해당 날짜의 요일을 반환하면 된다.

2016년 1월 1일이 금요일이기 때문에, 1월 1일부터 일주일 단위로 금요일이 반복된다.

또한, 2016년이 윤년이므로, 2016년 2월은 총 29일이 된다.

즉, 5월 24일은 1월 1일로부터 31일(1월), 29일(2월), 31일(3월), 30일(4월)이 지나고, 23일(5월)이 지난 후이므로,

(24일은 5월 1일로부터 23일 지난 후이므로, 1을 빼주어야한다.

예를 들어 1월 2일의 경우, 2일이 지난것이아니라, 1일이 지난것이므로 1로 쳐주어야한다.)

 

(31+29+31+30)+23  = 144

144 / 7 = 20 ... 4

 

7로 나눈 나머지가 4이므로, 금요일(나머지 = 0) 부터 시작해, 해당 날짜는 화요일이다.

이런식으로 해당 날짜가 몇월 몇일인지를 통해 지난 날짜를 계산하고,

이를 7로 나누어 해당 날짜의 요일을 계산하는 방식으로 구현하기로 했다.

주어진 틀은 아래와 같았다.

 

 

 

 

3. 소스코드
#include <string>
#include <vector>

using namespace std;

string solution(int a, int b) {
    string answer = "";
    int sum = 0;
    
    string day[7] = {"FRI","SAT","SUN","MON","TUE","WED","THU"};
    int month[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
    // 해당 날짜까지 몇 개월이 지났는지를 계산
    for(int i = 0; i < a - 1; i++) {
        sum += month[i];
    }
    // 해당 월에서 몇일이 지났는지를 계산
    sum += b-1;
    
    answer = day[sum%7];
    
    return answer;
}

string형 배열과 int형 배열을 통해 요일, 해당 월의 날수(1월은 31일, 2월은 29일...)을 표현해줬다.

이후 for문을 통해 해당 날짜까지 몇 개월이 지났는지를 계산해주었으며, (5월 24일의 경우 5월까지 몇일이 지났는지 계산)

나머지 지난 날짜를 계산해주어 (23일이 추가로 지남), 이를 7로 나누어 해당 요일을 구했다.

 

 


원래 일어나서 백준문제를 풀었는데.. 잘 풀리지 않아 일단 프로그래머스 문제부터 풀었다.

다 맞는것같은데 시간초과 뜨고.. 다른 방법썼더니 틀렸다고 하고... 아주 미치겠다..

벡터 연산을 연습해서 써봐야 하나 생각중이다..😱

 

728x90
반응형