programmers.co.kr/learn/courses/30/lessons/12901
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을 해줬다. 그러면 배열을 범위를 잘못 넘나드는 경우가 사라진다. 내가 전혀 생각하지 못한 케이스라서 고치긴 했지만 아직 좀 얼떨떨하다.
'Algorithm' 카테고리의 다른 글
[C++] 프로그래머스 가운데 글자 가져오기 (0) | 2020.11.09 |
---|---|
[C++] 프로그래머스 3진법 뒤집기 (0) | 2020.11.08 |
[C++] 프로그래머스 K번째수 (0) | 2020.10.31 |
[C++] 프로그래머스 체육복 (0) | 2020.10.29 |
[C++] 프로그래머스 모의고사 (0) | 2020.10.26 |