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

이찬혁·2024년 5월 24일

알고리즘

목록 보기
62/72

프로그래머스 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);
    }
}
profile
나의 개발로그

0개의 댓글