티스토리 뷰

프로그래머스 17686번 - [3차] 파일명 정렬

프로그래머스 17686번 - https://programmers.co.kr/learn/courses/30/lessons/17686
프로그래머스 17686번 - https://programmers.co.kr/learn/courses/30/lessons/17686

 

요구사항

1. 파일명을 HEAD, NUMBER, TAIL로 구분하여 각 기준을 통하여 정렬한 결과를 반환하라.

2. HEAD는 대소문자 구분을 하지 않고 사전 순으로 정렬하며 대소문자 차이 외에는 같을 경우 NUMBER의 정렬 기준을 따른다.

3. NUMBER는 오름차순으로 정렬되며, 숫자의 앞의 0은 무시된다. NUMBER 또한 같을 경우 원래의 입력 순서를 유지한다.

 

요구사항 분석 및  풀이과정

1. 주어진 파일명의 NUMBER의 부분만 구하면 파일명을 HEAD, NUMBER, TAIL로 구분하는 것은 쉽다.

2. 숫자가 처음 등장하는 부분과 숫자가 마지막으로 등장하는 부분을 구한다.

3. 그 위치를 기준으로 파일명을 HEAD, NUMBER, TAIL로 구분한다.

4. 주어진 조건대로 정렬한다.

 

소스코드 작성

import java.util.Arrays;

class Solution {
    
    private static boolean isLetter(char c) {
        return !isDigit(c);
    }
    
    private static boolean isDigit(char c) {
        return Character.isDigit(c);
    }
    
    private static class Tuple {
        private final int first;
        private final int second;
        
        public Tuple(int first, int second) {
            this.first = first;
            this.second = second;
        }
        
        public int first() {
            return first;
        }
        
        public int second() {
            return second;
        }
    }
    
    private static class File implements Comparable<File> {
        private final String fileName;
        private final String head;
        private final int number;
        private final String tail;
        
        private Tuple parse(String fileName) {
            char[] chars = fileName.toCharArray();
            
            int start = -1;
            int end = -1;
            
            for(int i = 1; i < chars.length; i++) {
                if (isLetter(chars[i-1]) && isDigit(chars[i])) {
                    start = i;
                } else if (isDigit(chars[i-1]) && isLetter(chars[i])) {
                    end = i;
                    break;
                }
            }
            
            return new Tuple(start, end == -1 ? fileName.length() : end);
        }
        
        public File(String fileName) {
            Tuple result = parse(fileName);
            this.head = fileName.substring(0, result.first());
            this.number = Integer.parseInt(fileName.substring(result.first(), result.second()));
            this.tail = fileName.substring(result.second());
            this.fileName = fileName;
        }
        
        public int compareTo(File other) {
            if (this.head.equalsIgnoreCase(other.head)) {
                return this.number - other.number;
            }
            
            return this.head.toLowerCase().compareTo(other.head.toLowerCase());
        }
        
        @Override
        public String toString() {
            return fileName;
        }
    }
    
    public String[] solution(String[] files) {   
        return Arrays.stream(files)
            .map(File::new)
            .sorted()
            .map(File::toString)
            .toArray(String[]::new);
    }
}

 

결과

 

소스코드 깃허브 주소

링크

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함