[백준] 1181번. 단어 정렬

leeeha·2021년 9월 22일
0

백준

목록 보기
4/185

https://www.acmicpc.net/problem/1181

이미 문자열이 정렬된 상태에서는 '바로 이전 인덱스'에 대해서만 중복 여부를 검사하면 되는데, 이것을 깨닫지 못하고 나는 for문을 중첩해서 내부 루프의 인덱스 범위를 j = 0~(i-1) 이렇게 잡고, i 이전의 모든 원소들에 대해 중복 검사를 하려고 했다.
차근차근 조건이 주어진 순서대로 풀어야겠다. 괜히 마지막 조건을 먼저 생각하다가 머리만 더 복잡해졌다. 일단 정렬을 다 하고 나서는! 바로 이전 인덱스랑만 문자열 중복 여부를 따지면 된다!

참고한 풀이: https://cryptosalamander.tistory.com/51

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

bool compare(string a, string b) {
	// 문자열의 길이가 같으면 사전 순으로 정렬
	if (a.length() == b.length())
		return a < b; // a가 b보다 사전 순으로 앞에 오면 true

	// 기본적으로는 문자열 길이 순으로 정렬
	return a.length() < b.length(); // a가 b보다 짧으면 true
}

int main()
{
	// 문자열 개수 입력 받기
	int n; 
	cin >> n;

	// n개의 문자열로 이루어진 배열
	string* arr = new string[n];

	for (int i = 0; i < n; i++)
		cin >> arr[i];

	// 사용자 정의 함수로 정렬하기
	sort(arr, arr + n, compare);

	cout << arr[0] << "\n";
	for (int i = 1; i < n; i++) {
		// 이전 문자열과 같으면 다음 인덱스로 넘어가기
		if (arr[i - 1] == arr[i])
			continue;
		else // 이전 문자열과 다르다면 출력하기
			cout << arr[i] << "\n";
	}

	return 0;
}
profile
Keep Going!

0개의 댓글