Skip to content

Instantly share code, notes, and snippets.

@Yimyujin
Last active January 12, 2019 06:46
Show Gist options
  • Save Yimyujin/3a5ea68a2378bd88b8f7c0bf28d380c8 to your computer and use it in GitHub Desktop.
Save Yimyujin/3a5ea68a2378bd88b8f7c0bf28d380c8 to your computer and use it in GitHub Desktop.
[Baekjoon]1181번 단어정렬
/* 메모리: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;
}
@fpdjsns
Copy link

fpdjsns commented Jan 12, 2019

@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언어 함수명도 비슷한 네이밍 체계를 가지는지는 잘 모르겠네요.ㅎㅎㅎ

@Yimyujin
Copy link
Author

Yimyujin commented Jan 12, 2019

@fpdjsns

  1. comp 함수 15 ~ 19 번째 줄에 대해서 궁금한게 있습니다.
    제 생각에 15번째 줄에 for (i = 0; a[i] && b[i]; ++i); 은 길이를 구하기 위해 사용하는 것 같은데 a[i] && b[i] 가 a[i], b[i] 둘 다 문자가 있으면 이라는 뜻인가요?

->네 맞습니다

  1. 그리고 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 리턴하면 확실히 빨라지긴하겠네요. 의견 감사합니다.
(귀찮아서..한줄로 썼나봅니당ㅎㅎ)

  1. 문자열 비교 함수가 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