카테고리 없음

[Rankk.org]Level3/42: Weak algorithm

ab0utcom 2026. 7. 10. 17:42
#include <stdio.h>

int floor_div2(int x)
{
    return (x >= 0) ? x / 2 : (x - 1) / 2;
}

int d2e(int c)
{
    return 102 - (c - 99) + 4 * floor_div2(c - 99);
}

int e2d(int x)
{
    for (int c = 0; c < 256; c++)
    {
        if (d2e(c) == x)
            return c;
    }

    return -1;
}


char str[] =
"739B9D9895939EA45447A1969B43868C843F89913F3B718B7B7E8D8A347E87318477752D816E6F7B6F6B267E7575662F";


int main()
{
    int len = sizeof(str) - 1;
    int count = len / 2;

    for (int i = 0; i < len; i += 2)
    {
        unsigned int num;
        sscanf(&str[i], "%2X", &num);

        int distance = count - 1 - i / 2;

        num -= distance;

        printf("%c", e2d(num));
    }

    return 0;
}

 

규칙만 약간의 노가다로 구했고, 일일이 쓰는건 진짜 하기 싫어서 자동화 프로그램을 작성했다.

 

a->64

b->63

c->66

d->65

e->68

f->67

g->6A

h->69

이런식으로 16진수 상에서 -1과 +3을 반복하면서 커진다. 이를 잘 다듬어서 d2e를 만들었고, 역으로 e2d를 만든다.

 

추가로

ab->6563

ac->6566

bc->6466

로 암호화 되는데, 마지막 문자까지 거리를 암호화문에서 빼고 복호화하면 된다.

 

이런 사고를 코드로 구현한거다. Level3에 복잡한 게 많은 것 같은데, 이건 그나마 쉬운 편인 것 같다.