https://www.acmicpc.net/problem/1864
해류가 매우 느리고 바닥을 기어다니는 생물이 적은 바다 밑바닥에서만 발견되는 잔물결 무늬의 정체는 오랫동안 해양학자들에게 수수께끼였다. 하지만 최근의 연구 성과는 동물 언어학 분야에 일대 혁명을 불러왔다. 이 무늬의 정체는 바로 문어가 숫자를 적는 방법이라는 것이 해양 생물학자들에 의해 밝혀진 것이다. 학자들은 문어가 무엇을 세는 것인지는 아직 알 수 없지만, 수 표기법을 해독하는 데에는 성공했다.
뭍 위에 사는 이들에게는 문어가 쓰는 숫자와 그를 표현하는 잔물결 무늬가 매우 낯설 수밖에 없다. 따라서 연구자들은 다음과 같은 기호로 잔물결 무늬를 적기로 합의했다. 각 기호와 대응하는 숫자는 다음과 같다.
당연히 문어의 수 체계는 8진법에 기반한다. 예를 들면 다음과 같다.
(@&는 2 × 82 + 3 × 8 + 6 = 158이다.
?/--는 4 × 83 + −1 × 82 + 0 × 8 + 0 = 1984이다.
/(\는 −1 × 82 + 2 × 8 + 1 = −47이다.
당신에게 주어진 문제는 문어 숫자를 입력 받아 십진수로 나타내는 것이다.
한 줄에 하나씩 문어 숫자가 입력으로 주어진다. 각 숫자는 최소 한 개, 최대 여덟 개의 문어 숫자 기호로 이루어져있다. 입력으로 '#'이 들어오면 입력을 종료한다.
입력 받은 문어 숫자에 대응하는 십진수를 한 줄에 하나씩 출력한다.
거듭제곱 및 문자열의 길이를 계산 해야하기 때문에 math.h 헤더파일과 string.h 파일을 추가하였다.
문자열을 입력받고 입력 받은 문자열의 길이를 length에 저장한다.
length만큼 while문을 돌려서 각 문자가 어떤 값을 가지는지 switch-case문으로 판별한다.
어떤 값을 가지는지 파악되었으면 pow(거듭제곱함수)를 이용해서 expo변수와 곱한다 여기서 8진법이라고 하였기 때문에 pow(8,length - 1)을 해준다.
다음 문자열로 넘어가기 위해서 length를 1씩 감소시키고 i는 1씩 증가시킨다.
결과를 출력한다!
#include <stdio.h>
#include <string.h>
#include <math.h>
#define size 9
char arr[size];
int main(){
while(scanf("%s",arr) != '#'){
if(arr[0] == '#'){
break;
}
int length = strlen(arr);
int i = 0,result = 0,expo;
while(length != 0){
char str = arr[i];
switch(str){
case '-':
expo = 0;
break;
case '\\':
expo = 1;
break;
case '(':
expo = 2;
break;
case '@':
expo = 3;
break;
case '?':
expo = 4;
break;
case '>':
expo = 5;
break;
case '&':
expo = 6;
break;
case '%':
expo = 7;
break;
case '/':
expo = -1;
break;
}
result += expo*pow(8,length -1);
length--;
i++;
}
printf("%d\n",result);
}
return 0;
}
처음에 문자를 봤을 때 너무 길어서 뭐지...? 싶었는데 문제를 푸는 것은 생각보다 그렇게 어렵진 않았다.
처음 구현을 했을 때 잘 되지 않아서 계속 print를 찍어보면서 디버깅을 하였다...