본문 바로가기
Algorithm/프로그래머스 코딩테스트 문제풀이전략

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

by 미네구스 2024. 5. 2.

https://school.programmers.co.kr/learn/courses/30/lessons/12915

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

비교하는 문자를 기존 문자열 앞에 붙여서 정렬하는 방식
import java.util.*;
class Solution {
    public String[] solution(String[] strings, int n) {
        String[] answer = new String[strings.length];
        List<String> list = new ArrayList<>();
        
        for (int i = 0; i < strings.length; i++){
            list.add(strings[i].charAt(n) + strings[i]);
        }
        
        Collections.sort(list);
        for(int i = 0; i < answer.length; i++){
            answer[i] = list.get(i).substring(1);
        }
        
        return answer;
    }
}

 

1. n에 해당하는 인덱스의 문자를 문자열 앞에 붙여준다.

2. 문자열을 정렬한다.

3. 앞에 붙여준 문자를 제외하여 리턴한다.

 

Comparator를 사용하여 정렬
import java.util.*;
class Solution {
    public String[] solution(String[] strings, int n) {
        Arrays.sort(strings, (s1, s2) -> {
            if (s1.charAt(n) != s2.charAt(n)) {
                return s1.charAt(n) - s2.charAt(n);
            }
            return s1.compareTo(s2);
        });
        return strings;
    }
}

 

 

책에서 나온 코드인데, 시간복잡도나 코드길이나 전부 뛰어났다. 

Arrays.sort(strings, (s1, s2) -> s1.charAt(n) - s2.charAt(n));

단순히 이런식으로 비교를 하게 되면, 인덱스의 문자가 동일한 경우를 걸러내지 못한다.

 

그렇기 때문에, 만약 문자가 동일하다면 compareTo()를 사용하여 비교해주면 된다.

 

CompareTo

String s1 = "abfk"
String s2 = "abmz";
int diff = s1.compareTo(s2);

 

compareTo() 메서드는 문자열 간의 차이를 계산한다. 비교대상의 문자열의 첫번째 문자부터 하나씩 비교를 하는데, 위 예제와 같은 경우는 "a", "b"가 동일하므로 "f", "m"을 비교하게 되는데 f의 ASCII 값은 102, m은 107이므로 결과값은 -7이 된다.

 

프로그래머스 문제에서도 "abce", "abcd"를 비교해보자.

String s1 = "abce";
String s2 = "abcd";
System.out.println(s1.compareTo(s2)); // 1

 

e가 d보다 ASCII코드가 1더 크기 때문에, 결과값이 1이 출력된다.

 

따라서, 문제에서 s1.compareTo(s2)를 할 때 ASCII 코드가 더 작은 값이 앞으로 정렬되기 때문에 성공적으로 사전순으로 정렬할 수 있다!