안녕하세요
여행벌입니다.
오늘은 GoLatin 문제에 대해서 스터디를 진행할 때,
알고리즘 고수... 갓웅님의 코드를 보면서 배운 점에 대해서 정리해보겠습니다.
(기존 여행벌의 코드)
https://travelbeeee.tistory.com/6
[배운점]
1. 테이블을 활용해 문자들을 치환하면 훨씬 더 간편하게 코드를 구현할 수 있다.
-갓웅코드
#include <iostream>
#include <cstring>
using namespace std;
const char eng[12][3] = {"a", "i", "y", "l", "n", "ne", "o", "r", "t", "u", "v", "w"};
const char latin[12][5] = {"as", "ios", "ios", "les", "anes", "anes", "os", "res", "tas", "us", "ves", "was"};
int main()
{
int n;
cin >> n;
for(int i=0; i<n; i++) {
char str[40];
cin >> str;
int len = strlen(str);
int j;
for(j=0; j<12; j++) {
// if same
if(strcmp(str+(len-strlen(eng[j])), eng[j]) == 0) {
str[len-strlen(eng[j])] = 0;
cout << str << latin[j] << endl;
break;
}
}
if(j == 12) {
cout << str << "us" << endl;
}
}
return 0;
}
-내코드
char list1[31];
scanf("%s", list1);
switch (list1[strlen(list1) - 1]) {
case 'a':
printf("%ss\n", list1); break;
case 'i':
printf("%sos\n", list1); break;
case 'y':
list1[strlen(list1) - 1] = '\0';
printf("%sios\n", list1); break;
case 'l':
printf("%ses\n", list1); break;
case 'n':
list1[strlen(list1) - 1] = '\0';
printf("%sanes\n", list1); break;
case 'e':
if (list1[strlen(list1) - 2] == 'n') {
list1[strlen(list1) - 1] = '\0';
list1[strlen(list1) - 1] = '\0';
//조심! 위에서 마지막 글자를 이미 날려서, strlen이 하나 줄었음!
printf("%sanes\n", list1);
}
else
printf("%sus\n", list1);
break;
case 'o':
printf("%ss\n", list1); break;
case 'r':
printf("%ses\n", list1); break;
case 't':
printf("%sas\n", list1); break;
case 'u':
printf("%ss\n", list1); break;
case 'v':
printf("%ses\n", list1); break;
case 'w':
printf("%sas\n", list1); break;
default:
printf("%sus\n", list1); break;
}
하나하나 switch문을 통해서 모든 case를 다루다 보니 코드가 길어지고 가동성이 떨어지고 당연히 코딩하면서 실수가 되게 많이 발생할 수 밖에 없었다. 하지만 갓웅은 테이블에 미리 치환할 문자들을 담아두고, pseudo-latin인지 아닌지 체크만 하고 치환할 문자들을 간단하게 출력해줌으로써 훨씬 가독성 좋고 깔끔한 코드를 구현했다.
공부하자..
'Problem Solving > ICPC' 카테고리의 다른 글
[ACM-ICPC][BOJ] 13567 - ROBOT 문제풀이 (0) | 2019.07.21 |
---|---|
[ACM-ICPC][BOJ] 13565 - Percolation 문제풀이 (0) | 2019.07.21 |
[ACM-ICPC][BOJ] 14954 - HAPPY NUMBER 코드반성 (0) | 2019.07.19 |
[ACM-ICPC][BOJ] 16360 - Go Latin 문제풀이 (0) | 2019.07.18 |
[ACM-ICPC][BOJ] 14954 - HAPPY NUMBER 문제풀이 (0) | 2019.07.18 |