본문 바로가기

Algorithm/Programmers

Level 1: 문자열 내 마음대로 정렬하기, Arrays.sort()와 Stream의 sorted()

더보기

입력된 문자열 String[]을 정렬합니다.

규칙 1 : 정렬 기준은 입력된 정수 n에 해당하는 인덱스의 알파벳으로 오름차순입니다.

규칙 2 : 만약 규칙 1에서 동일한 알파벳이 검사되면 문자열에 대한 사전적 오름차순을 적용합니다.

문제 풀이: Arrays.sort()와 Stream의 sorted() 사용하여 정렬하기

문자열 String[]을 정렬하기 위해 Arrays.sort()를 사용합니다.

import java.util.*;

public class Solution {
	public String[] solution(String[] strings, int n) {
		Arrays.sort(strings, (lp, rp) -> { });
		
		return strings;
	}
}
코드 비고
Line 5 Arrays.sort lprp는 비교 대상이되는 두 String입니다.
lp가 먼저 정렬되면 -1을 리턴합니다.
rp가 먼저 정렬되면 1을 리턴합니다.

Arrays.sort에서 규칙 1규칙 2에 대한 로직을 구현합니다.

import java.util.*;
import java.util.stream.Stream;

public class Solution {
	public String[] solution(String[] strings, int n) {
		Arrays.sort(strings, (lp, rp) -> {
			if (lp.charAt(n) == rp.charAt(n)) {
				return Stream.of(lp, rp).sorted().toArray()[0] == lp ? -1 : 1;
			} else {
				return lp.charAt(n) < rp.charAt(n) ? -1 : 1;
			}
		});
		
		return strings;
	}
}
코드 비고
Line 7:8 규칙 2에 대한 정렬 로직 규칙 1에서 동일한 알파벳이 검사됩니다.
두 문자열을 Stream으로 sorted하면 오름차순으로 정렬됩니다.
Line 9:10 규칙 1에 대한 정렬 로직 정수 n에 해당하는 인덱스를 기준으로 두 문자열을 정렬합니다.

Stream의 sorted()compareTo()로 대체 할 수 있습니다.

import java.util.*;

public class Solution {
	public String[] solution(String[] strings, int n) {
		Arrays.sort(strings, (lp, rp) -> {
			if (lp.charAt(n) == rp.charAt(n)) {
				return lp.compareTo(rp);
			} else {
				return lp.charAt(n) < rp.charAt(n) ? -1 : 1;
			}
		});
		
		return strings;
	}
}
코드 비고
Line 7 compareTo 문자열에 대한 비교 함수이지만 서로 다른 문자열일 때 정렬 결과를 리턴합니다.
두 문자열을 사전적 의미로 오름차순 정렬합니다.