[Java] 알고리즘, "2016년 a월 b일을 맞춰라"
- 알고리즘 문제/[Java] 알고리즘
- 2019. 2. 1. 20:12
문제 설명
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
12 31 SAT
나의 풀이
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class Solution { public static String solution(int a, int b) { String answer = ""; //목0 금1 토2 일3 월4 화5 수6 -> 요일/나머지구조 //1 . 1 금(1 번째 일이라했을때) -> 1.2 토 (2 번째) 이런식으로 구하자 int _31 = 31; int _30 = 30; int _28 = 28; int yoon = 29; int day = 0; //이걸 7로 나눈다. int month[] = {_31,yoon,_31,_30,_31,_30,_31,_31,_30,_31,_30,_31}; String[] yoEil = {"THU","FRI","SAT","SUN","MON","TUE","WED"}; for(int i =0; i<a-1; i++) { day+=month[i]; } day+=b; answer = yoEil[(day%7)]; return answer; } } | cs |
일단, 월/일 과 요일과의 상관관계는 없습니다. 올해 1월 1일은 목요일이 되고 내년은 금요일이 될수 있습니다.
하지만 일주일이 매번 반복되므로 날짜가 하루 증가할때마다 요일이 하나씩 바뀌고 이 요일은 7가지가 있다는 것을 캐치하셔야 합니다.
기준날짜인 1월 1일을 첫번째(1) 날짜로 삼고 1월 2일을 두번째(2) 날짜로 삼으면 물론, 그 전날짜는 목요일(0)이 되겠지요?
총 날짜는 1일이 증가하고 요일도 1개 증가합니다. 이러한 규칙을 이용해 전체 변화한 날짜에서 7을 나눈 나머지가 요일의 배열의 index로 작용하여
해당 요일을 반환하게 되는 것입니다.
다른사람의 풀이
엄청 노력파이신 분을 소개합니다...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 | class TryHelloWorld { public String getDayName(int a, int b) { String answer = ""; switch(a) { case 1: if(b % 7 == 1) answer = "FRI"; else if(b % 7 == 2) answer = "SAT"; else if(b % 7 == 3) answer = "SUN"; else if(b % 7 == 4) answer = "MON"; else if(b % 7 == 5) answer = "TUE"; else if(b % 7 == 6) answer = "WED"; else answer = "THU"; break; case 2: if(b % 7 == 1) answer = "MON"; else if(b % 7 == 2) answer = "TUE"; else if(b % 7 == 3) answer = "WED"; else if(b % 7 == 4) answer = "THU"; else if(b % 7 == 5) answer = "FRI"; else if(b % 7 == 6) answer = "SAT"; else answer = "SUN"; break; case 3: if(b % 7 == 1) answer = "TUE"; else if(b % 7 == 2) answer = "WED"; else if(b % 7 == 3) answer = "THU"; else if(b % 7 == 4) answer = "FRI"; else if(b % 7 == 5) answer = "SAT"; else if(b % 7 == 6) answer = "SUN"; else answer = "MON"; break; case 4: if(b % 7 == 1) answer = "THU"; else if(b % 7 == 2) answer = "FRI"; else if(b % 7 == 3) answer = "SAT"; else if(b % 7 == 4) answer = "SUN"; else if(b % 7 == 5) answer = "MON"; else if(b % 7 == 6) answer = "TUE"; else answer = "WED"; break; case 5: if(b % 7 == 1) answer = "SUN"; else if(b % 7 == 2) answer = "MON"; else if(b % 7 == 3) answer = "TUE"; else if(b % 7 == 4) answer = "WED"; else if(b % 7 == 5) answer = "THU"; else if(b % 7 == 6) answer = "FRI"; else answer = "SAT"; break; case 6: if(b % 7 == 1) answer = "WED"; else if(b % 7 == 2) answer = "THU"; else if(b % 7 == 3) answer = "FRI"; else if(b % 7 == 4) answer = "SAT"; else if(b % 7 == 5) answer = "SUN"; else if(b % 7 == 6) answer = "MON"; else answer = "TUE"; break; case 7: if(b % 7 == 1) answer = "FRI"; else if(b % 7 == 2) answer = "SAT"; else if(b % 7 == 3) answer = "SUN"; else if(b % 7 == 4) answer = "MON"; else if(b % 7 == 5) answer = "TUE"; else if(b % 7 == 6) answer = "WED"; else answer = "THU"; break; case 8: if(b % 7 == 1) answer = "MON"; else if(b % 7 == 2) answer = "TUE"; else if(b % 7 == 3) answer = "WED"; else if(b % 7 == 4) answer = "THU"; else if(b % 7 == 5) answer = "FRI"; else if(b % 7 == 6) answer = "SAT"; else answer = "SUN"; break; case 9: if(b % 7 == 1) answer = "THU"; else if(b % 7 == 2) answer = "FRI"; else if(b % 7 == 3) answer = "SAT"; else if(b % 7 == 4) answer = "SUN"; else if(b % 7 == 5) answer = "MON"; else if(b % 7 == 6) answer = "TUE"; else answer = "WED"; break; case 10: if(b % 7 == 1) answer = "SAT"; else if(b % 7 == 2) answer = "SUN"; else if(b % 7 == 3) answer = "MON"; else if(b % 7 == 4) answer = "TUE"; else if(b % 7 == 5) answer = "WED"; else if(b % 7 == 6) answer = "THU"; else answer = "FRI"; break; case 11: if(b % 7 == 1) answer = "TUE"; else if(b % 7 == 2) answer = "WED"; else if(b % 7 == 3) answer = "THU"; else if(b % 7 == 4) answer = "FRI"; else if(b % 7 == 5) answer = "SAT"; else if(b % 7 == 6) answer = "SUN"; else answer = "MON"; break; case 12: if(b % 7 == 1) answer = "THU"; else if(b % 7 == 2) answer = "FRI"; else if(b % 7 == 3) answer = "SAT"; else if(b % 7 == 4) answer = "SUN"; else if(b % 7 == 5) answer = "MON"; else if(b % 7 == 6) answer = "TUE"; else answer = "WED"; break; } return answer; } public static void main(String[] args) { TryHelloWorld test = new TryHelloWorld(); int a=5, b=24; System.out.println(test.getDayName(a,b)); } } | cs |
자바의 라이브러리는 이런식으로 탄생합니다... 여러분....
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | class TryHelloWorld { public String getDayName(int a, int b) { String answer = " "; int[] monthDay={31,29,31,30,31,30,31,31,30,31,30,31}; for (int i = 1; i < a; i++) { b+=monthDay[i-1]; } switch(b%7){ case 3:answer="SUN";break; case 4:answer="MON";break; case 5:answer="TUE";break; case 6:answer="WED";break; case 0:answer="THU";break; case 1:answer="FRI";break; case 2:answer="SAT";break; } return answer; } } | cs |
윤년이 나와서 반가워서 제가 아는 한 설명해보자면
윤년은 4년에 한번 돌아오는 2월의 날짜수가 29일인 해입니다. 월드컵처럼 4년만에 무조건 돌아오는 것이 아닌 특별한 규칙이 있다고합니다.
- 4로 나누어 떨어지는 해는 윤년, 그 밖의 해는 평년으로 한다.
- 4로 나누어 떨어지지만 100으로 나누어 떨어지는 해는 평년으로 한다.
- 단, 400으로 나누어 떨어지는 해는 윤년으로 한다
년 월 일을 입력하면 요일을 구하는 등과 같은 알고리즘을 해결할 때, 가장 골치아프게하는 녀석이 바로 윤년입니다.
위의 세가지 조건을 if문으로 만들어 윤년에 해당하는 해이면 하루를 더해 29일이 되게 만들어야 합니다.
학원을 다녔을 때, 자바수업중 윤년을 해결했던 기억이 나서 정리해보았습니다.
'알고리즘 문제 > [Java] 알고리즘' 카테고리의 다른 글
[Java] 알고리즘, "같은 숫자는 싫어" (1) | 2019.02.02 |
---|---|
[Java] 알고리즘, "가운데 글자 가져오기" (0) | 2019.02.02 |
[Java] 알고리즘, "체육복" (1) | 2019.01.31 |
[Java] 알고리즘, "K번째 수" (0) | 2019.01.30 |
[Java] 알고리즘, "완주하지 못한 선수" (0) | 2019.01.28 |