문제 설명
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를 반환하세요.
제한 조건
1. 2016년은 윤년입니다.
2. 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)
기초 문제인데 이 게시판에 쓴 글이 없어서 급하게 풀었다.
달과 날에 있어서는 규칙이 없기 때문에 몇 월에 며칠까지 있는지 하나하나 정의를 해줘야할 것이다.
정의하는 방법에 있어서는 배열을 만드는 방법도 있고 {31,29,31,30,31,30,31,31,30,31,30,31}
조건문으로 일일히 따지는 방법도 있을 것이다.
조건문의 경우 코드가 복잡해지지만 배열에 비해 메모리를 효율적으로 사용할 수 있다.
반대로 배열은 코드를 단순하게 짤 수 있다.
그래서 연습해보는 겸 그 달에 며칠이 있는지는 switch문을 쓰고, 최종적으로 무슨 요일인지 반환할 때는 배열을 사용했다.
프로그래머스 특성상 메인 함수가 주어지지 않고, answer를 반환하는 solution함수를 짜야하므로
복잡한 코드의 경우는 Visual Studio로 옮겨서 메인 함수를 만들어 코드가 어떻게 동작하는지 보면서 짜지만,
간단한 문제기 때문에 즉석으로 풀어냈다.
#include <string>
#include <vector>
using namespace std;
string solution(int a, int b) {
string answer = "";
string DoW[7] = {"THU","FRI","SAT","SUN","MON","TUE","WED"}; //Day of Week
int m,d = 0;
for(m=1;m<a;m++)
{
switch(m)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
d+=31;
break;
case 2:
d+=29;
break;
case 4:
case 6:
case 9:
case 11:
d+=30;
break;
}
}
d+=b;
d = d%7;
answer = DoW[d];
return answer;
}
덧붙여 설명하자면, 날짜가 6월 18일이 주어졌다면 1월 1일부터 6월 전까지(5월 31일까지) 총 며칠인지 switch문 안에서 계산해주고 남은 18일을 더한 후, 7로 나눈 나머지로 요일을 구분하게 하였다.
1월 1일이 금요일이라고 했으므로 1월 1일이 입력으로 주어진다면 코드에 따라 d=1이고 1일 때 금요일이 되게 해야하므로 DoW[0]은 목요일부터 시작해야한다.
Coding Space by MIR :
Programmers 2016년 C++
프로그래머스 2016년 C++
'Programmers > C++' 카테고리의 다른 글
[Programmers] 전화번호 목록(C++) (0) | 2020.12.28 |
---|---|
[Programmers] 체육복(C++) (0) | 2020.12.23 |
[Programmers] 괄호 변환(C++) (0) | 2020.12.14 |
[Programmers] 완주하지 못한 선수(C++) (0) | 2020.12.11 |
[Programmers] 크레인 인형뽑기 게임(C++) (0) | 2020.12.09 |