반응형
문제 출처 :
https://www.acmicpc.net/problem/14710
알고리즘 분석 :
문제 해결에 필요한 사항
1. 구현
개인적으로 신기한 문제였다.
문제 해결은 아래와 같이 하면 된다.
분침이 1도 지날 때 마다 시침은 1/12도 지난다. (시계를 보고 계산을 해보면 알 수 있다. 예를들어 12분이 지나야 시침이 1분 다음칸으로 갈 수 있다.)
이 문제를 double형으로 해결하려 했으나 어떤 이유인지는 몰라도 해결이 되지 않았다. 아마 부동 소수점 문제인듯 하다.
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 | #include <iostream> #include <cstdio> #include <cmath> using namespace std; bool chk[500][500]; int main() { int a, b; scanf("%d %d", &a, &b); double h = 0, m = 0; while (1) { double tmp = floor(h); if((int)h == (int)tmp) chk[(int)h][(int)m] = true; m += 1.0; h += (double)1 / 12; if (m >= 360.0) m = 0.0; if (h >= 360.0) break; } if (chk[a][b]) printf("O"); else printf("X"); return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
위의 코드와 정답 코드를 보면 단순히 double에서 int로 변환시키는 작업밖에 없지만, floor함수와 double자료형에서 뭔가 차이가 나는 듯 하다.
이 외에 수학적으로 푸는 다른 방법도 존재하는 것 같았다.(맞은 사람 코드를 본 결과로..)
소스 코드 :
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 | #include <iostream> #include <cstdio> using namespace std; bool chk[5000][5000]; int main() { int a, b; scanf("%d %d", &a, &b); int h = 0, m = 0; while (1) { if(h % 12 == 0) chk[h][m] = true; m += 12; h += 1; if (m >= 360*12) m = 0; if (h >= 360*12) break; } if (chk[a*12][b*12]) printf("O"); else printf("X"); return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
카카오 모의 테스트 풀이(주소 수록) (0) | 2017.09.15 |
---|---|
[14699번] 관악산 등산 (0) | 2017.09.15 |
[14709번] 여우 사인 (0) | 2017.09.15 |
[1981번] 배열에서 이동 (0) | 2017.09.12 |
[2417번] 정수 제곱근 (0) | 2017.09.11 |