본문 바로가기

알고리즘

[알고리즘] 백준 1181번 문제_단어 정렬

================================== 풀이 ====================================

C++ 함수 사용

string a[20000];
int n;

bool compare(string a, string b) {

	if (a.length() < b.length()) {
		return 1;
	}
	else if ( a.length() > b.length()){
		return 0;
	}
// 길이가 같은 경우
	else {
		return a < b;  // 사전순으로 비교가 가능
	}
}

int main(void) {   // 1181번 문제

	cin >> n;  // n 입력
	for (int i = 0; i < n; i++) {
		cin >> a[i];      // 단어 입력
	}

	sort(a, a + n, compare);  // a에서 시작, a+n까지 진행
	for (int i = 0; i < n; i++) {
		if (i > 0 && a[i] == a[i - 1]) {
			continue;
		}
		else {
			cout << a[i] << '\n';
		}
		
	}
}
​

힙 정렬

import java.util.Scanner;

public class Main {
	
	static String[] array = new String[20001];
	static String tmp;
	
	public static void main(String[] args) {
		
		int n;
		Scanner sc = new Scanner(System.in);
		
		n = sc.nextInt();
		
		for(int i = 0; i < n; i++) {
			
			array[i] = sc.next();
			for(int j = 0; j < i; j++) {                  //  중복 문자열일 경우 입력 제외
				if(array[i].equals(array[j])) {
					i--;
					n--;
				}
			}
		}
		for(int i = 1; i < n; i++) {     // 최초 힙 정렬 수행
			
			int root;
			int c = i;
			do {
				root = (c -1) /2;
				
				if(array[c].length() > array[root].length() || (array[c].length() == array[root].length() && compare(c, root))) {
					
					tmp = array[c];
					array[c] = array[root];
					array[root] = tmp;
				}
				c = root;
			}
			while (c != 0);
		}
		
		for(int i = n-1;i >= 0; i--) {    // 힙 정렬 수행
			tmp = array[i];
			array[i] = array[0];
			array[0] = tmp;
			
			int c;
			int root = 0;
			do {
				
				c = root * 2 +1;

				if(c < i-1 && (array[c].length() < array[c+1].length()|| (array[c].length() == array[c+1].length() && compare(c+1, c)))) {
					c++;
				}
				if(c < i && (array[c].length() > array[root].length() || (array[c].length() == array[root].length() && compare(c, root)))) {
					
					tmp = array[c];
					array[c] = array[root];
					array[root] = tmp;
				}
				
				root = c;
			
			}while (c < i);
		}
		
		for(int i = 0; i < n; i++) {
			System.out.println(array[i]);
		}
	}
	
	static boolean compare(int c, int root) {  // 길이가 같을경우 비교
		
		int i = 0;
		
		do {

			if(array[c].charAt(i) > array[root].charAt(i)) {

				return true;
			}	
			else if(array[c].charAt(i) < array[root].charAt(i)) {

				return false;	
			}
			else {
				i++;
			}
		}
		while (i < array[c].length() && array[c].length() == array[root].length());	
		return false;
	}
}

코드가 많이 더럽습니다... 하지만 제가 스스로 실패해가며 코딩했습니다..... 제 진심만은 알아주세요.....

반응형