안녕하세요

여행벌입니다.

오늘은 GoLatin 문제에 대해서 스터디를 진행할 때,

알고리즘 고수... 갓웅님의 코드를 보면서 배운 점에 대해서 정리해보겠습니다.

(기존 여행벌의 코드)

https://travelbeeee.tistory.com/6 

 

[BOJ] 16360 - Go Latin 문제풀이

안녕하세요. 여행벌입니다. 오늘은 백준 16360번 Go Latin 문제풀이를 해보려고 합니다. ACM-ICPC 2018 예선 문제로 ACM-ICPC 문제 치고는 되게 쉬웠던 것 같습니다. https://www.acmicpc.net/problem/16360 문..

travelbeeee.tistory.com


[배운점]

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인지 아닌지 체크만 하고 치환할 문자들을 간단하게 출력해줌으로써 훨씬 가독성 좋고 깔끔한 코드를 구현했다.


공부하자..

+ Recent posts