본문 바로가기

IT

[algospot/알고리즘] 알고스팟 '초보' 난이도 URI 풀기

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

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

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

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


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

튜토리얼에 '초보' 난이도로 총 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위 내로도 올라가겠군요.


그럼 좋은 하루 보내세요~

끝_