본문 바로가기

ALGORITHM

[프로그래머스 Java] 문자열 내 마음대로 정렬하기

 

 

코딩테스트 연습 - 문자열 내 마음대로 정렬하기

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 [sun, bed, car]이고 n이 1이면 각 단어의 인덱스 1

programmers.co.kr

 

Comparator / Comparable 인터페이스

Comparator / Comparable 인터페이스란? 컬렉션을 정렬하는데 필요한 메서드를 정의한다. 그렇다면 둘의 차이는? Comparable - comparaTo(Object o1) - 기본 정렬 기준 Comparator - compare(Object o1, Object o2..

dblee.tistory.com

 

⏱소요 시간 - 2시간 동안 삽질 (실패)

 

🔑해결 방법

 

다른 사람들의 풀이를 찾아보니 Comparator / Comparable을 사용하는 문제였다.

인강 들을 때, 이해가 잘 안가서 나중에 쓸때 다시 봐야지 했었는데 바로 나와버려서 다시 정리했다.

다음에 또 이런 문제가 나오면 적용해보자.

 

Comparator 인터페이스를 구현하여 정렬 메서드를 정의하는 방법은 아래와 같다.

 

Arrays.sort(정렬할 배열, new Comparator<배열 타입>(){

	@Override
	public int compare(Object o1, Object o2) { // 배열 요소를 하나씩 돌면서 비교하자
				
		// 정렬 로직 자유롭게 구현

		// 리턴 형태도 자유롭게 구현
		return o1.compareTo(o2); // 기본 오름차순 정렬할 때
		return o1.compareTo(o2) * -1; // 내림차순 정렬할 때
		return o2.compareTo(o1); // 내림차순 정렬할 때
			
	}

}

 

 

🔎소스 코드

같으면 0, 비교하는 값이 크면 1, 비교하는 값이 더 작으면 -1을 반환하면서

return 값의 결과에 따라 compare() 메서드가 자동으로 정렬을 해준다.

 

package step1;

import java.util.Arrays;
import java.util.Comparator;

// 문자열 내 마음대로 정렬하기
public class Ex13 {

	public static void main(String[] args) {
		
		System.out.println(solution(new String[]{"sun", "bed", "car"} , 1));
		System.out.println(solution(new String[]{"abce", "abcd", "cdx"} , 2));
		
	}
	
	public static String[] solution(String[] strings, int n) {
		
		String[] answer = new String[strings.length];
	
		// 조건 중 같은 문자열이 여럿 일 경우 사전순으로 나열하기 위해
		// 미리 strings 배열을 사전순으로 정렬한 상태에서 비교를 시작
		Arrays.sort(strings);
		
		System.out.println(Arrays.toString(strings)); // [bed, car, sun]
		
		
		// 입력받은 n번 인덱스의 문자들 비교
		// Comparator를 익명 클래스로 구현
		Arrays.sort(strings, new Comparator<String>() { // strings[]를 돌면서 

			@Override
			public int compare(String o1, String o2) { // 문자들을 서로 비교하자
				
				String s1 = o1.substring(n, n + 1); // n번째 문자를 저장
				String s2 = o2.substring(n, n + 1);
				
				// 비교 결과에 따라 int 반환
				// s1 == s2: 0, s1 > s2: 1, s1 < s2: -1
				
				return s1.compareTo(s2); // s1,s2만 비교해서 다시 기본 정렬 = 오름차순 정렬
				
			}
			
		});
		
		System.out.println(Arrays.toString(strings)); // [car, bed, sun]
		
		for(int i = 0; i < strings.length; i++) {
			answer[i] = strings[i];
		}
		
		System.out.println(Arrays.toString(answer)); // [car, bed, sun]
		
		return answer;
		
	}

}