본문 바로가기

Algorithm/Implementation

(C) - 백준(BOJ) 10889번 : Acient Symbol 답

반응형

https://www.acmicpc.net/problem/10889

 

10889번: Ancient symbol

/*                                                          thisisCsource @V)W>a4SlGOk>Q57% >1);/*G*/  /*                                                          s[ v,8U1],>CTxWt>.]2uRs1=^rJfhwx@TkpV&LZ$DJWdDjM*/  /*                                      

www.acmicpc.net

재미있는 구데기 문제였습니다.

 

문제풀이 :

 진짜 무슨 말이지 이건 또 무슨일인가 혼란스러웠으나 유물의 첫줄을 보면 thisisCsource라는 문구를 볼 수 있습니다. 아 C언어로 되어있겠구나 싶어서 바로 복붙하다보니 풀렸습니다.

 

이 문제엔 2개의 수수께끼가 있습니다.

 1. 문제에 나와있는 유물이 뭔지 알기

  문제에 보이는 유물을 그대로 가져와 박습니다. 그러면 visual studio 같은 IDE 툴이 에러를 띄워주는데 헤더를 넣어주시고 변수와 함수들의 자료형을 손봐주면 바로 컴파일 할 수 있습니다. 노가다를 통해 주석을 제거하여 코드를 정리해 보았습니다.

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
/*thisisCsource*/
#include <stdio.h>
 
float sr(float y) {
    int i = 0x5f3759df - ((*(int*)&y) >> 1);
    float x2 = y * 0.5F; y = *(float*)&i;
    y = y * (1.5F - (x2*y*y)); return y * (1.5F - (x2*y*y));
}
char p[1 << 16], *= p;
 
#define v(b) *a++=(b)
int tt = 0, vv = 2, ww = 5;
int rd() {
    tt = (tt * 2 + tt * tt * 7 + vv * 13 + vv * vv * 17 + ww * 5 + ww * ww * 6) % 84;
    vv = (tt * 3 + tt * tt * 4 + vv * 2 + vv * vv * 11 + ww * 2 + ww * ww * 10) % 1241;
    ww = (tt * 4 + tt * tt * 3 + vv * 7 + vv * vv * 13 + ww + ww * ww * 12) % 5883;
    return tt;
}
const char *func = "2a#05H6bu07G21h42U26n3bU37>e9H41!eb}35i34p3a(3a"
"*"                                                     "e6K44ve5N56<ca%9e]c7Xa1hc4>64]c5wb6Mb3gbbkb9x67]04M39Gf7<44Wd"
"cx"                                                   "94mde^4ai26#4c!23H3f<edj39k32jf7i44rdc a1<8e&9c%";
const char *= "!@#$%^&*()1234567890QWERTYUIOPqwertyuiopASD"
"FG"                                                 "HJKLasdfghjklZXCVBNMzxcvbnm,./<>?{}[]+=";
const char *def = "2ai05i1eS46s1fy47#22v4c&1"
"9u"                                               "07o5f^10u65Q09R5b%c5%a3!c2I6dzbdZ";
void pr(const char *t, int *k) {
    unsigned int w = 0, c;
    while (*t) {
        sscanf(t, "%x"&c); c = (c + w) % 256;
        w = (c - w + 256) % 0x100; v(c); t += 3; (*k)++;
    }
    (*k)--;
}
const char *pr1 = "2aK05I5eQ0aZ57o1bs05U25]4bI27Z48g1a)06j37i"
"e9w39Xfev"                             "32V37Hf9g39m07Z2f[08p40qf0v47*09W2dG37s1aI48hebX55ge2h83R9fx90&9ag";
 
const char *pr2 = "2au05!1dp35v2d>06P52He5k80xcfy97wca[8fna7g8dSc7}9cLc9(7esb7Uad{cct98X9cOd6*5fH05j6d}c4(9eOaek"
"83Sadkb1I81gb0h98q8a<b1$7e@acn";
void half() {
    int i, j, k, l;
    for (i = 60; i >= 0; i--) {
        j = 1. / sr(3600 - i * i);
        l = 1. / sr(900 - i * i);
        for (k = 0; k < 60 - j; k++)v(' '); v('/'); v('*');
        for (k++; k < 60 + j; k++) {
            if (0 <= i && i < 30) {
                if (i == 10 && k == 90)pr(def, &k);
                else if (i == 8 && k == 70)pr(pr1, &k);
                else if (i == 6 && k == 70)pr(pr2, &k);
                else if (i == 2 && k == 63)pr(func, &k);
                else v((90 - l <= k && k <= 90 + l) ? u[rd()] : ' ');
            }
            else v(' ');
        }v('*'); v('/'); v('\n');
    }
}
 
int main() {
    #ifdef found
        hehe();
    #else
        half();
    #endif
        return puts(p);
}
 
cs

다음은 컴파일 결과입니다.

대충 이런식의 태극무늬 반쪽이 나옵니다.

 2. 이 유물을 토대로 태극무늬의 나머지 반쪽을 찾기

  태극무늬 반쪽이 나왔으니 이걸 다시 가져와 완전한 유물을 만들기 위해 기존에 있는 코드와 합쳐봅니다. 불필요한 주석들을 제거하고 c언어 문법에 맞는줄만 잘 추합하면 간단한 코드가 나옵니다. 선언문의 내용이라 헤더 바로 밑에 해당 소스를 넣었습니다.

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
/*thisisCsource*/
 
#include <stdio.h>
 
//나머지 반쪽 소스
#define found he
const char *prob = "70i02@67H07P6dQb3@7e"
"Rb3X7eOfaY64TceG5dyd4r5dr1bL10^21H";
void pr(const char *int *);
void hehe() { int k = 0; pr(prob, &k); }
//나머지 반쪽 소스 끝
 
float sr(float y) {
    int i = 0x5f3759df - ((*(int*)&y) >> 1);
    float x2 = y * 0.5F; y = *(float*)&i;
    y = y * (1.5F - (x2*y*y)); return y * (1.5F - (x2*y*y));
}
char p[1 << 16], *= p;
 
#define v(b) *a++=(b)
int tt = 0, vv = 2, ww = 5;
int rd() {
    tt = (tt * 2 + tt * tt * 7 + vv * 13 + vv * vv * 17 + ww * 5 + ww * ww * 6) % 84;
    vv = (tt * 3 + tt * tt * 4 + vv * 2 + vv * vv * 11 + ww * 2 + ww * ww * 10) % 1241;
    ww = (tt * 4 + tt * tt * 3 + vv * 7 + vv * vv * 13 + ww + ww * ww * 12) % 5883;
    return tt;
}
const char *func = "2a#05H6bu07G21h42U26n3bU37>e9H41!eb}35i34p3a(3a"
"*"                                                     "e6K44ve5N56<ca%9e]c7Xa1hc4>64]c5wb6Mb3gbbkb9x67]04M39Gf7<44Wd"
"cx"                                                   "94mde^4ai26#4c!23H3f<edj39k32jf7i44rdc a1<8e&9c%";
const char *= "!@#$%^&*()1234567890QWERTYUIOPqwertyuiopASD"
"FG"                                                 "HJKLasdfghjklZXCVBNMzxcvbnm,./<>?{}[]+=";
const char *def = "2ai05i1eS46s1fy47#22v4c&1"
"9u"                                               "07o5f^10u65Q09R5b%c5%a3!c2I6dzbdZ";
void pr(const char *t, int *k) {
    unsigned int w = 0, c;
    while (*t) {
        sscanf(t, "%x"&c); c = (c + w) % 256;
        w = (c - w + 256) % 0x100; v(c); t += 3; (*k)++;
    }
    (*k)--;
}
const char *pr1 = "2aK05I5eQ0aZ57o1bs05U25]4bI27Z48g1a)06j37i"
"e9w39Xfev"                             "32V37Hf9g39m07Z2f[08p40qf0v47*09W2dG37s1aI48hebX55ge2h83R9fx90&9ag";
 
const char *pr2 = "2au05!1dp35v2d>06P52He5k80xcfy97wca[8fna7g8dSc7}9cLc9(7esb7Uad{cct98X9cOd6*5fH05j6d}c4(9eOaek"
"83Sadkb1I81gb0h98q8a<b1$7e@acn";
void half() {
    int i, j, k, l;
    for (i = 60; i >= 0; i--) {
        j = 1. / sr(3600 - i * i);
        l = 1. / sr(900 - i * i);
        for (k = 0; k < 60 - j; k++)v(' '); v('/'); v('*');
        for (k++; k < 60 + j; k++) {
            if (0 <= i && i < 30) {
                if (i == 10 && k == 90)pr(def, &k);
                else if (i == 8 && k == 70)pr(pr1, &k);
                else if (i == 6 && k == 70)pr(pr2, &k);
                else if (i == 2 && k == 63)pr(func, &k);
                else v((90 - l <= k && k <= 90 + l) ? u[rd()] : ' ');
            }
            else v(' ');
        }v('*'); v('/'); v('\n');
    }
}
 
int main() {
    #ifdef found
        hehe();
    #else
        half();
    #endif
        return puts(p);
}
 
cs

컴파일하게 되면 다음과 같이 나옵니다.

이제 해당 이차 방정식을 이용하면 되겠다

이제 다왔습니다. 저식을 이용해 x값을 입력받아 c언어에 맞게 잘 출력하면 됩니다.

1
2
3
4
5
6
7
#include <stdio.h>
int main() {
    //조합 이후 코드
    int x;
    scanf("%d"&x);
    printf("%d\n"111*x*+ 11*+ 1);
}
cs