티스토리 뷰

팀/GODSOL

1_10_100/옥상

알 수 없는 사용자 2016. 5. 23. 20:50
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
#include< iostream >
 
#include< string >
 
#include< math.h >
 
using namespace std;
 
 
 
//수열에 포함되어있는지 체크하는 함수.
 
char check(double num);
 
int main() {
 
    int test, num;
 
    //결과가 한줄에 출력됨으로 string에 결과 저장하기
 
    string result="";
 
 
 
    cin >> test;
 
 
 
    while (test--) {
 
        cin >> num;
 
        result += check(num);
 
        result += " ";
 
    }
 
    cout << result;
 
    return 0;
 
}
 
char check(double num) {
 
    //문제의 수열에 1이 포함되어 있는 자리수가 계차수열을 이룸.
 
    //a(n항) = 1 + n(n-1)/2 로 나타남. 함수로 넘어오는 num 값이 a(n항)의 결과값이 될 수 있으면 계차수열에 포함되는것이다.
 
    --num *= 2;
 
    //num = a(n항)이라 가정할 때 n 구하기. 제곱근을 써서 n(n-1)을 충족할 수 있는 n을 구한다.
 
    int temp = sqrt(num);
 
    if (num/temp - temp == 1) {
 
        return '1';
 
    }
 
    else {
 
        return '0';
 
 
 
    }
 
}


풀이 :

자리수가 계차수열을 이룸으로 자리수를 구하는 수열을 계산한다.

그리고 검사할 자리수가 an이라고 가정하면 만족하는 n을 찾아 검사해야하는데, 여기서 한번에 검사할 수 있게 제곱근을 이용해서 n-1을 구한다. (왜냐면 (자리수-1)*2를 제곱근하면 소수점이 나오는데 n-1과 n 사이의 수가 나온다 int로 저장하면 n-1의 값이 저장됨..)

코드에서 유의할 점은 num을 n-1로 나눠주는 값을 double로 해줘야 한다는 점. int로 넘길 시 오차범위가 너무 커져 계산 오류가 난다. 

22222가 그랬음. ㅎㅎ...


참고자료 : 계차수열


«   2025/12   »
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
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크