본문 바로가기

코딩 테스트/프로그래머스

파일명 정렬

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

 

프로그래머스

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

programmers.co.kr

 

Level 2 사실 상 3 에 가까운

 

자바 내장 함수형 인터페이스 Comparator 를 사용해 푸는 문제였다...

나는 이걸 장장 2시간에 걸쳐 직접 정렬 로직을 구현했는데 다른 사람들 풀이를 보고 새로운 영역에 발을 디뎠다.

 

Comparator 는 Java 에서 제공하는 특정 기능을 가진 인터페이스 객체 중 하나로 이런 인터페이스를 함수형 인터페이스 라고 한다. (쉽게 말해 그냥 자바에 들어있는 도구 중 하나라고 생각하면 된다)

 

다만 평소에 내장 인터페이스를 사용해본적이 없어서 생각도 못했고 이번 문제를 계기로 앞으로 여러 구현 문제를 구현하는데 큰 도움이 될 것 같다. 

 

Comparator 객체 인터페이스를 생성하면 객체 정렬 간 정렬 비교 로직을 직접 구현할 수 있는데, 이번 풀이의 핵심은 이 정렬 비교 부분을 최초에 사전 식 문자열로 HEAD 로 처리하고 만약 HEAD 가 같다면 NUMBER 의 정수형으로 구분하는 것이다. 

 

Compator 내부 구현은 상당히 단순하니 오히려 문자열에서 HEAD/NUMBER/TAIL 을 추출할 떄 주의가 필요하다.

 

import java.util.*;

public class Solution {
    public String[] solution(String[] files) { //파일명 정렬
        Comparator<String> comparator = new Comparator<String>() { //자바 Comparator 인터페이스
            @Override
            public int compare(String o1, String o2) {
                String head1 = getHead(o1).toLowerCase();
                String head2 = getHead(o2).toLowerCase();
                if(head1.compareTo(head2) == 0){ //사전순 문자열 비교 시에도 같을 경우
                    return getNumber(o1)-getNumber(o2); //정수형 숫자 비교
                }else{
                    return head1.compareTo(head2);
                }
            }
        };
        Arrays.sort(files, comparator);
        return files;
    }
    public String getHead(String file){ //Head 추출 '0'~'9' 이전까지
        StringBuilder answer = new StringBuilder();
        for(int idx = 0; idx < file.length(); idx++){
           char character = file.charAt(idx);
           if(character >= '0' && character <= '9'){
               break;
           }else{
               answer.append(character);
           }
        }
        return answer.toString();
    }
    public int getNumber(String file){ //숫자 추출 정수형
        int numStartIdx = 0;
        StringBuilder number = new StringBuilder();
        for(int idx = 0; idx < file.length(); idx++){
            if(file.charAt(idx) >= '0' && file.charAt(idx) <= '9'){
                numStartIdx = idx;
                break;
            }
        }
        for(; numStartIdx < numStartIdx+5; numStartIdx++){
            if(numStartIdx == file.length()) break;
            if(file.charAt(numStartIdx) < '0' || file.charAt(numStartIdx) > '9') break;
            number.append(file.charAt(numStartIdx));
        }
        return Integer.parseInt(number.toString());
    }
}

'코딩 테스트 > 프로그래머스' 카테고리의 다른 글

전화번호 목록  (0) 2023.01.16
n진수 게임  (0) 2023.01.16
압축  (0) 2023.01.11
방금그곡  (0) 2023.01.11
프렌즈4블록  (0) 2023.01.10