Last active
January 12, 2019 06:46
-
-
Save Yimyujin/3a5ea68a2378bd88b8f7c0bf28d380c8 to your computer and use it in GitHub Desktop.
[Baekjoon]1181번 단어정렬
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 메모리:2268KB 시간:36ms */ | |
#pragma warning (disable:4996) | |
#include <stdio.h> | |
char str[20000][51]; | |
int tmp[40000]; | |
int n; | |
int strcomp(char *a, char *b) { | |
int i; | |
for (i = 0; a[i] == b[i] && a[i] && b[i]; ++i); | |
return a[i] - b[i]; | |
} | |
int comp(char *a, char *b) { | |
int i; | |
for (i = 0; a[i] && b[i]; ++i); | |
// 길이가 다른 경우 | |
if (a[i] != b[i]) return a[i] > b[i]; | |
// 길이가 같은 경우 | |
for (i = 0; a[i] == b[i] && a[i] && b[i]; ++i); | |
return a[i] > b[i]; | |
} | |
void merge_sort(int s, int e) { | |
int m, idx1, idx2, idx; | |
if (s >= e) return; | |
m = (s + e) / 2; | |
merge_sort(s, m); | |
merge_sort(m + 1, e); | |
idx = s+20000; | |
idx1 = s; | |
idx2 = m + 1; | |
while (idx1 <= m && idx2 <= e) { | |
if (comp(str[tmp[idx1]], str[tmp[idx2]])) tmp[idx++] = tmp[idx2++]; | |
else tmp[idx++]= tmp[idx1++]; | |
} | |
while (idx1 <= m) tmp[idx++] = tmp[idx1++]; | |
while (idx2 <= e) tmp[idx++] = tmp[idx2++]; | |
for (int i = s; i <= e; ++i) tmp[i] = tmp[i + 20000]; | |
} | |
void input() { | |
scanf("%d", &n); | |
for (int i = 0; i < n; ++i) { | |
scanf("%s",str[i]); | |
tmp[i] = i; | |
} | |
} | |
void print() { | |
for (int i = 0; i < n-1; ++i) { | |
if(strcomp(str[tmp[i]],str[tmp[i+1]])) printf("%s\n", str[tmp[i]]); | |
} | |
printf("%s\n", str[tmp[n-1]]); | |
} | |
int main() { | |
input(); | |
merge_sort(0, n - 1); | |
print(); | |
return 0; | |
} |
- comp 함수 15 ~ 19 번째 줄에 대해서 궁금한게 있습니다.
제 생각에 15번째 줄에 for (i = 0; a[i] && b[i]; ++i); 은 길이를 구하기 위해 사용하는 것 같은데 a[i] && b[i] 가 a[i], b[i] 둘 다 문자가 있으면 이라는 뜻인가요?
->네 맞습니다
- 그리고 17번째 줄에 a[i] != b[i] 가 어떻게 길이가 ㄷㅏ른 경우의 판단 조건이 될 수 있나요?
->우선 for (i = 0; a[i] && b[i]; ++i);에서 빠져나오는 조건이 a아니면 b가 문자열의 끝을 나타내서 빠져나오게 될텐데, 이때 a[i]==b[i]라면 둘다 문자열 길이가 같은걸 의미하죠.
strcomp 함수가 a, b 가 같은 문자인지 아닌지 판단하는 함수인 것 같은데 맞나용?
맞다면 return a[i] - b[i]; 가 왜 판단조건이 되는지 궁금합니다. a[i], b[i] 모두 '\n' 이 들어있으면 true 반환하는 종료 조건으로 하는건 어떤가요?
->strcomp는 두 문자열이 같은지 아닌지 판단하는 식으로 사용한 함수를 말씀하시는거라면 맞습니당.
줄바꿈문자가 아니라 '\0'를 말씀하시는건가요?? a[i]와 b[i]가 둘다 '\0'인 경우 true 리턴하면 확실히 빨라지긴하겠네요. 의견 감사합니다.
(귀찮아서..한줄로 썼나봅니당ㅎㅎ)
- 문자열 비교 함수가 comp, strcomp 2개가 있는데 함수명이 좀 모호한 것 같습니다.
알고리즘 부분에 들어가는 함수명은 간결하게 지어도 되긴 하지만 strcomp는 isSame 이런식으로 짓는건 어떨까요?
너무 java 식인가요..? c언어 함수명도 비슷한 네이밍 체계를 가지는지는 잘 모르겠네요.ㅎㅎㅎ
-> strcomp는 실제 api처럼(헷갈리지 않도록 이름이 다르구요) 동작하도록 짰습니다. like strcmp yo~ 위에같이 짠다면 그런 이름으로 짓는게 좋겠습니다. 좋은 의견감사합니다. 저는 예쁜 함수이름이라면 다 좋네요
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@Yimyujin
comp 함수 15 ~ 19 번째 줄에 대해서 궁금한게 있습니다.
제 생각에 15번째 줄에
for (i = 0; a[i] && b[i]; ++i);
은 길이를 구하기 위해 사용하는 것 같은데a[i] && b[i]
가 a[i], b[i] 둘 다 문자가 있으면 이라는 뜻인가요?그리고 17번째 줄에
a[i] != b[i]
가 어떻게 길이가 ㄷㅏ른 경우의 판단 조건이 될 수 있나요?strcomp 함수가 a, b 가 같은 문자인지 아닌지 판단하는 함수인 것 같은데 맞나용?
맞다면
return a[i] - b[i];
가 왜 판단조건이 되는지 궁금합니다. a[i], b[i] 모두 '\n' 이 들어있으면 true 반환하는 종료 조건으로 하는건 어떤가요?문자열 비교 함수가 comp, strcomp 2개가 있는데 함수명이 좀 모호한 것 같습니다.
알고리즘 부분에 들어가는 함수명은 간결하게 지어도 되긴 하지만 strcomp는 isSame 이런식으로 짓는건 어떨까요?
너무 java 식인가요..? c언어 함수명도 비슷한 네이밍 체계를 가지는지는 잘 모르겠네요.ㅎㅎㅎ