d

'algospot'에 해당되는 글 2건

문제

특정 메시지를 암호화 하는 방법은 오랫 동안 다양하게 연구되었다.

그러한 방법들 중에서 가장 간단한 방법을 생각해보자.

특정 문자열을 입력받는다. 편의상 문자열에 공백은 없으며, 영문 대소문자가 입력으로 들어온다. 그러한 다음 문자열의 각 문자에 맨 왼쪽부터 하나씩 0, 1, 2, 3, ... 과 같이 번호를 매긴다.

만약 암호화 하려고 하는 문자열이 `HelloWorld' 가 들어왔을 경우, 다음과 같이 번호가 붙게 된다.

0 1 2 3 4 5 6 7 8 9
H e l l o W o r l d

그 다음 짝수 번호(2로 나눠 떨어지는 숫자, 0도 짝수에 포함한다.) 가 붙은 문자들을 번호가 빠른 순으로 다음과 같이 붙이고, 그 다음 홀수 번호가 가 붙은 문자들을 번호가 빠른 순으로 그 뒤에붙인다. 위의 `HelloWorld'에 적용할 경우 결과는 다음과 같다.

HloolelWrd

문자열을 입력받은 다음, 위에 소개한 암호화를 수행하는 프로그램을 작성하라.

 

입력

입력의 첫번째 줄에는 테스트 케이스의 개수 T(1<=T<= 10)이 입력된다.

그 다음 줄 부터 T개의 줄에는 암호화를 하고자 하는 문자열이 입력된다. 문자열에는 공백이 포함되지 않으며, 문자열의 길이는 100자를 넘지 않는다.

 

출력

각 테스트 케이스의 순서대로 문자열을 암호화 한 결과를 한줄에 하나씩 출력한다.

 

예제 입력

2
A
HelloWorld

예제 출력

A
HloolelWrd

어렵지 않게 풀어낼 수 있는 문제입니다. 문제에 나와 있는 대로 생각하여 풀 수도 있으나 좀 더 간소화 할 수 있는 방법으로 풀어봤습니다.

 

문자열을 받아서 짝수 인덱스를 출력하고, 홀수 인덱스를 출력하면 올바른 출력이 나옵니다.

 

문자열은 문자열 마지막에 '\0'이 입력됨으로 써 문자열의 끝을 알 수 있습니다. 따라서 주의해야 할 점은 문자열의 최대 길이가 100인 경우 101 자리에 '\0' 을 가져야 하므로 명시된 최대 길이 + 1 이상으로 잡아 두셔야 올바른 코딩이 가능합니다.

 

 

대체적으로 비슷한 형태 였으나 독특한 소스가 있어 한번 살펴보았습니다.

 

256 크기의 배열을 하나 만든 다음 포인터 char 형 변수 e, o 를 만들어 짝수와 홀수의 문자를 출력하기 위한 위치를 잡아뒀네요.

 

짝수의 이진수는 첫 자리가 0 이고 홀수는 1 인 것에 감안해서 i & 1 로 짝수와 홀수를 구분하였습니다. 그렇게 해서 짝수와 홀수를 구분하여 문자열을 집어 넣고 최종적으로 출력을 하였습니다.

'알고리즘 > Algospot' 카테고리의 다른 글

튜토리얼 [LECTURE]  (0) 2016.07.08
블로그 이미지

_Able

,

문제

Professor Lew teaches Algorithm course in Sonyusi University (소녀시대학교).
It is his first year as a professor, so he spends a lot of time making lecture notes.
He'll teach recursion and sorting algorithms in the next class,
and he wants to make some examples which will be included in his lecture note.

While making some examples for his lecture note, he noticed that one of his work was quite difficult.
The example was for sorting a string, and the exact process was as follows:
First, the original string of length 2n is divided into n substrings, each of length 2.
Then sort the n strings in lexicographic order, and then concatenate them to obtain the result string.
Note that the sorting process will be performed on n strings, but not each of the n strings.
The following example illustrates the process:


abbaaccb → ab ba ac cb → ab < ac < ba < cb → abacbacb

Since the process was quite confusing,

 

professor Lew decides to use a computer program for verification.
Given an alphabetic string of even length, write a program that prints the result of the sorting process.

 

입력

The first line of the input contains one integer T, the number of test cases.

The first line of each test case contains a string. The length of the string will not exceed 1000, and will only contain lowercase alphabet letters.

 

출력

For each test case, print the result in one line.

 

예제 입력

4
abbaaccb
dddcccbbbaaa
geegeegeegeebabybabybaby
oh

예제 출력

abacbacb
aababbccdcdd
babababybybyeeeeegeggege
oh


2n 의 길이를 갖는 문자열을 입력 받아 정렬하는 문제 입니다. 문제에 나와 있는 예제대로

 

abbaaccb → ab ba ac cb → ab < ac < ba < cb → abacbacb

 

2자리 씩 나눠서 앞자리 순으로 정렬 후 같은 알파벳 끼리 뒷자리를 기준으로 정렬합니다. 저는 가장 간단하고 많은 분들이 생각 해보셨을 것 같은 버블정렬을 이용하여 문제를 풀었습니다. 먼저 앞자리 알파벳으로 버블정렬 수행 후, 같은 자리 끼리 뒷자리 알파벳을 비교하여 정렬을 수행 했습니다.

 

 

가장 빠른 처리속도 분들의 소스를 봐보니 기수정렬을 이용해서 풀었더군요. 버블정렬보다 훨씬 간단하고 빨라 보입니다. 

 

혹시 기수정렬에 대해 모르시는 분들을 위해 간단하게 말씀드리고 자세한 내용은 따로 올리도록 할게요.

 

 

 

다른 분들의 소스 중 하나를 살펴볼게요.

 

 

먼저 첫 포문에서 cnt 배열을 초기화 하는데 이는 알파벳을 체크하기 위한 배열로 보입니다. 배열의 크기가 32인 이유는 잘 모르겠네요...

 

while문에서 해당하는 알파벳의 카운트를 해줍니다. 인덱스 값으로 -97을 해주는데 이는 ASCII 코드에 나오는 알파벳들의 값을 인덱스로 하여 집어넣어 주기 위합입니다.

 

예를 들어 소문자 a 는 10진수로 97이라는 값을 갖습니다. -97 을 모든 알파벳에 적용한다면 인덱스 0 의 자리 부터 a b c . . . 순으로 인덱스 값을 갖게 되겟죠.

 

다음으로 나오는 for문에서는 알파벳의 정렬 순서와 알파벳 위치를 설정하는 구문입니다.

 

전체적인 포문이 d = 1 , 0 순으로 실행됩니다. 이는 2자리 씩 끈은 알파벳 자리에서 뒷 자리 부터 비교하겠다는 의미가 됩니다.

 

dcba 라는 문자열을 입력 했을 경우 cnt배열은

 

첫번째로 c 와 a 를 비교하여

01122222... 라는 숫자 열을 갖게 됩니다.

 

여기서 0 1 2 라는 숫자는 각 알파벳이 표시되어야 하는 순서와 표시될 위치를 의미하죠.

0 1 1 2 2 2 2..

   a    c

순으로 표시 정보를 의미합니다.

 

두번째로 d b 를 비교하여

00112222... 라는 열이 나오고

위와 마찬가지의 정보를 가집니다.

 

각 cnt 배열 정보값을 이용하여 마지막 구문에서 표시를 해주면 정렬된 문자열이 표시됩니다.

'알고리즘 > Algospot' 카테고리의 다른 글

튜토리얼 [ENCRYPT]  (0) 2016.07.11
블로그 이미지

_Able

,