[프로그래머스] 파일 정렬 하기

9969 단어 TILTIL

1. 풀이 코드

package programmers.src.level2.file_name_sort;

import java.util.*;

class Solution {
    public String[] solution(String[] files) {
        Arrays.sort(files, (o1, o2) -> {
            //1. 숫자를 기준으로 split을 한다.
            String prevString = o1.split("[0-9]")[0];
            String nextString = o2.split("[0-9]")[0];

            //2. 대소문자에 관계없이 값을 비교한다.
            int result = prevString.toLowerCase(Locale.ROOT)
                    .compareTo(nextString.toLowerCase(Locale.ROOT));

            //3. 같은 경우 숫자를 비교해서 대소 비교의 결과를 반환한다.
            if(result == 0) {
                result = extractNumber(o1, prevString) - extractNumber(o2, nextString);
            }

            return result;
        });

        return files;
    }

    private int extractNumber(String s, String h ) {
        s = s.replace(h, "");

        StringBuilder sb = new StringBuilder();

        for( char c : s.toCharArray()) {
            if( Character.isDigit(c) && sb.length() < 5 ) {
                sb.append(c);
            }else
                break;
        }
        return Integer.valueOf(sb.toString());
    }
}

2.문제에서 고민한 점

  1. 문자열에서 숫자와 문자를 어떻게 구분할지에 대해 고민이 많았다. 문자열을 탐색하며 숫자와 문자를 구별하는 메서드를 고민해보았지만 가장 간단히 풀 수 있는 방법에 대해 고민했다. 그래서 숫자를 입력할 수 있는 정규식을 적용해보기로 했다.
            String prevString = o1.split("[0-9]")[0];

해당 문자열을 처리할 경우, 아래와 같이 문자열이 구분된다.
	foo9.txt -> [foo] [.txt]	
	foo010bar020.zip -> [foo] [bar] [.zip]

해당 문자열을 구분 후, 숫자만 구하는 정규식을 이용해서 문제를 해결하려고 했지만 for문을 사용하는 것이 문자의 길이를 파악하는 것이 더욱 유용하다고 생각했다. if문에 조건을 추가하면 원하는 숫자와 길이조건을 추가해 로직을 구현할 수 있다..


3. 문제 해결법

  1. 숫자를 delimeter로 하여 문자열을 구분(split)해서 첫번째는 구한다.
  2. 대소문자를 구분하지 않고 알파벳으로만 구분할 수 있도록 문자를 소문자로 변환한다.
  3. 같은 알파벳으로 구성되어 있을 경우, 숫자 부분을 탐색해 반환하고 이를 비교한다.


4. 문제 풀고나서

이번 문제는 문자열을 전처리하여 선택적 정렬을 구현하는 문제였다. 문자열을 많이 풀어보지 않아 감이 잘 안잡혔던 문제였지만 다행히 문자열을 전처리해서 단순 정렬을 나타내고 문제에 주어진 조건을 그대로 따라하면 구현할 수 있는 문제였기 때문에 무리없이 해결할 수 있었다.

좋은 웹페이지 즐겨찾기