ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [algospot/알고리즘] 알고스팟 '초보' 난이도 URI 풀기
    IT 2015. 7. 5. 00:00

    그 동안 알고스팟의 '왕초보'문제를 풀어보았습니다.

    퇴근하고 집에 와서 졸린 눈 부비며 풀기에는 '왕초보'도 벅찬 경우가 많았습니다.

    코딩은 정말 정신이 또렷한 상태에서 해야지,

    졸음코딩이나 음주코딩을 하면 효율을 내기가 힘든 작업이란걸 다시 깨달았습니다.


    오늘부터는 '초보' 문제들을 하나씩 풀어보도록 하겠습니다.

    튜토리얼에 '초보' 난이도로 총 26문제가 명시되어 있습니다.

    하루에 한 문제씩 풀다보면 한달이 훌쩍 지나가 있겠네요.



    - 제목 : URI

    - 난도 : ☆☆☆☆☆ (0점/5점)

    - 문제

       (간단히 의역해보겠습니다) URI(Uniform Resource Identifier)는 인터넷 공간에서 리소스를 확정할 때 사용하는 간단한 스트링입니다.

        http://storycompiler.com

        mailto:storycompiler@storycompiler.com

        ftp://127.0.0.1/main.php

        README.txt

        위의 URI를 인터넷으로 보낼때 몇몇 특수문자는 %인코딩으로 변환해야 합니다.

        %인코딩은 %와 두자리의 16진수로 구성됩니다.

        예를 들자면, " "(빈칸)은 %20, "!"은 %21, "$"은 %24 등으로 정의됩니다.

        %인코딩된 문자열을 본래 문자열로 변환하는 프로그램을 작성하세요.

    - 답안

    #include <stdio.h>

    int main(int argc, char **argv)
    {
        int total_count = 0;
        int count = 0;

        scanf("%d", &total_count);

        for (; count < total_count; count++) {
            char string[81] = {0, };
            char tostring[81] = {0, };
            register int i = 0;
            register int j = 0;

            scanf("%s", string);

            while (string[i]) {
                if (string[i] == '%') {
                    char special = '0';
                    if (string[i + 1] != '2') {
                        i += 3;
                        continue;
                    }

                    switch (string[i + 2]) {
                    case '0':
                        special = ' ';
                        break;
                    case '1':
                        special = '!';
                        break;
                    case '4':
                        special = '$';
                        break;
                    case '5':
                        special = '%';
                        break;
                    case '8':
                        special = '(';
                        break;
                    case '9':
                        special = ')';
                        break;
                    case 'a':
                        special = '*';
                        break;
                    default:
                        break;
                    }
                    tostring[j] = special;
                    i += 3;
                    j++;
                } else {
                    tostring[j] = string[i];
                    i++;
                    j++;
                }
            }
            printf("%s\n", tostring);
        }

        return 0;
    }


    - 문제에 특화하여 코딩하였습니다.

       %인코딩에 첫번째 숫자가 '2'외에도 많겠지만,

       문제에서 제한한 숫자는 '2'이기에 if 문을 하나 두어 '2'인 경우에만 처리하도록 하였습니다.


    - while (string[i]), 오랜만에 while문을 사용하였습니다.

       경우에 따라 i++ 혹은 i += 3처럼 사용해야해서 for문 대신 while문으로 i값을 직접 컨트롤하였습니다.


    - switch - case문은 커널 코딩스타일에 따라 같은 열에 배치되도록 하였습니다.

       case문은 switch보다 한 탭 아래에 두는 경우도 많긴 한데요,

       커널에서는 탭을 매우 제한적으로 사용하도록 하고 있기 때문에 switch - case에서는 탭을 아끼는 정책을 택했습니다.

       탭을 제한적으로 사용했던 이유는 예전 터미널이 80열까지만 지원했기 때문이지요.


    이상으로 알고스팟에서 총 10문제를 풀었습니다.

    순위는 1284위로 상승하였습니다.

    머지않아 1000위 내로도 올라가겠군요.


    그럼 좋은 하루 보내세요~

    끝_

Designed by Tistory.