프로그래머스 Lv1 - 문자열 내 마음대로 정렬하기 문제
프로그래머스 레벨 1 문자열 내 마음대로 정렬하기 문제를 풀이했다.
지난 포스팅에서 깊게 공부해봤던 익명 클래스를 활용한 Comparator를 구현 및 compare 메소드 재정의를 통해서 원하는 조건대로 정렬 기준을 잡아 문제를 풀이했다.
풀이 후 다른 사람의 풀이를 보니 나와 같이 Comparator를 구현한 풀이를 몇 개 찾아볼 수 있었는데, 나처럼 굳이 Str 클래스를 정의하지 않고 인자로 주어진 strings를 통해서 풀이한 방법들도 있었다!
또 현재 Str 클래스에서 코딩테스트이기 때문에 빠르게 하려고 getter도 없고 필드들이 public으로 선언되어 있어 직접 접근이 가능한데 이 부분도 앞으로 코딩테스트 때는 필드 접근자, getter, setter 등을 작성하는 습관을 들여야겠따.
UserDefineStrSort.java
package com.example.Programmers.Lv1;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* 프로그래머스 Lv1 - 문자열 내 마음대로 정렬하기
*/
public class UserDefineStrSort {
public String[] solution(String[] strings, int n) {
List<Str> strList = new ArrayList<>();
// 리스트 초기화
for (int i = 0; i < strings.length; i++) {
String ele = strings[i];
strList.add(new Str(ele, String.valueOf(ele.charAt(n))));
}
// Comparator 재정의를 통한 Str 객체 비교
// 같은 인덱스 문자를 가지고 있으면 해당 단어끼리 오름차순 정렬, 그렇지 않다면 idx끼리 오름차순 정렬
Collections.sort(strList, new Comparator<Str>() {
@Override
public int compare(Str o1, Str o2) {
if (o1.idx.equals(o2.idx)) {
return o1.word.compareTo(o2.word);
} else {
return o1.idx.compareTo(o2.idx);
}
}
});
return strList.stream().map(x -> x.word).toArray(String[]::new);
}
}
class Str {
public String word;
public String idx;
Str(String word, String idx) {
this.word = word;
this.idx = idx;
}
}
UserDefineStrSortTest.java
package com.example.Programmers.Lv1;
import static org.junit.Assert.assertArrayEquals;
import org.junit.Test;
public class UserDefineStrSortTest {
@Test
public void testUserDefineStrSort() {
UserDefineStrSort u = new UserDefineStrSort();
String[] result1 = u.solution(new String[] { "sun", "bed", "car" }, 1);
String[] result2 = u.solution(new String[] { "abce", "abcd", "cdx" }, 2);
assertArrayEquals(new String[] { "car", "bed", "sun" }, result1);
assertArrayEquals(new String[] { "abcd", "abce", "cdx" }, result2);
}
}