그 동안 알고스팟의 '왕초보'문제를 풀어보았습니다.
퇴근하고 집에 와서 졸린 눈 부비며 풀기에는 '왕초보'도 벅찬 경우가 많았습니다.
코딩은 정말 정신이 또렷한 상태에서 해야지,
졸음코딩이나 음주코딩을 하면 효율을 내기가 힘든 작업이란걸 다시 깨달았습니다.
오늘부터는 '초보' 문제들을 하나씩 풀어보도록 하겠습니다.
튜토리얼에 '초보' 난이도로 총 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위 내로도 올라가겠군요.
그럼 좋은 하루 보내세요~
끝_
'IT' 카테고리의 다른 글
[Ubuntu/Linux] 쉘스크립트 test 명령문의 모든 것 (0) | 2015.07.11 |
---|---|
[Ubuntu/Linux] 쉘스크립트 Flow control - for, case 문법의 모든 것 (0) | 2015.07.10 |
[Ubuntu/Linux] 쉘스크립트 Flow control - while, until 문법의 모든 것 (0) | 2015.07.09 |
[Ubuntu/Linux] 쉘스크립트 Flow control - if 문법의 모든 것 (0) | 2015.07.08 |
[Ubuntu/Linux] 본쉘(Bourne shell)에 없는 것과 있는 것 (0) | 2015.07.06 |
[Ubuntu/Linux] #!/bin/sh에 대한 간단한 이야기 (2) | 2015.07.04 |
[Ubuntu/Linux] 우분투 15.04 삼바설정툴(system-config-samba) 크래쉬 (3) | 2015.07.03 |
[algospot/알고리즘] 알고스팟 '왕초보' 난이도 CONVERT 풀기(C99 Default argument promotion) (1) | 2015.06.30 |
[algospot/알고리즘] 알고스팟 알고리즘 풀어보기 (0) | 2015.06.29 |
[algospot/알고리즘] 알고스팟, '왕초보' 난이도 MISPELL 풀기 (0) | 2015.06.28 |