[프로그래머스] 파일명 정렬 (JAVA)

유존돌돌이·2021년 10월 22일
0

Programmers

목록 보기
82/167
post-thumbnail

문제설명

파일명은 크게 HEAD, NUMBER, TAIL의 세 부분으로 구성된다.

HEAD는 숫자가 아닌 문자로 이루어져 있으며, 최소한 한 글자 이상이다.
NUMBER는 한 글자에서 최대 다섯 글자 사이의 연속된 숫자로 이루어져 있으며, 앞쪽에 0이 올 수 있다. 0부터 99999 사이의 숫자로, 00000이나 0101 등도 가능하다.
TAIL은 그 나머지 부분으로, 여기에는 숫자가 다시 나타날 수도 있으며, 아무 글자도 없을 수 있다.
파일명 HEAD NUMBER TAIL
foo9.txt foo 9 .txt
foo010bar020.zip foo 010 bar020.zip
F-15 F- 15 (빈 문자열)
파일명을 세 부분으로 나눈 후, 다음 기준에 따라 파일명을 정렬한다.

파일명은 우선 HEAD 부분을 기준으로 사전 순으로 정렬한다. 이때, 문자열 비교 시 대소문자 구분을 하지 않는다. MUZI와 muzi, MuZi는 정렬 시에 같은 순서로 취급된다.
파일명의 HEAD 부분이 대소문자 차이 외에는 같을 경우, NUMBER의 숫자 순으로 정렬한다. 9 < 10 < 0011 < 012 < 13 < 014 순으로 정렬된다. 숫자 앞의 0은 무시되며, 012와 12는 정렬 시에 같은 같은 값으로 처리된다.
두 파일의 HEAD 부분과, NUMBER의 숫자도 같을 경우, 원래 입력에 주어진 순서를 유지한다. MUZI01.zip과 muzi1.png가 입력으로 들어오면, 정렬 후에도 입력 시 주어진 두 파일의 순서가 바뀌어서는 안 된다.
무지를 도와 파일명 정렬 프로그램을 구현하라.

Code

import java.util.*;
class Solution {
    public String[] solution(String[] files) {
        Arrays.sort(files, (s1,s2)->{
            String head1 = s1.split("[0-9]")[0].toLowerCase();
            String head2 = s2.split("[0-9]")[0].toLowerCase();
            if(!head1.equals(head2)) {
                return head1.compareTo(head2);
            }
            return getNum5(s1, head1.length())-getNum5(s2, head2.length());
        });
        return files;
    }

    public int getNum5(String s, int idx) {
        StringBuilder sb = new StringBuilder();
        while(idx<s.length() && sb.length()<5 && Character.isDigit(s.charAt(idx))) {
            sb.append(s.charAt(idx++));
        }
        return Integer.valueOf(sb.toString());
    }
}

Comment

1트때는 PriorityQueue로 풀어봤는데, 4,14,15에서만 오답처리가 되었다. 아.. 아무리봐도 왜 그런지 몰라서 files 자체를 sort하는 방법으로 변경해서 풀어봤다.
기억해야할것 : 숫자기준 split 정규식

String[] tmp = stringVar.split("[0-9]");

1트 Code

public String[] Solution(String[] files) {
        String[][] data = new String[files.length][2];
        
        PriorityQueue<Integer> pq = new PriorityQueue<>((a,b)->{
            if(data[a][0].compareTo(data[b][0])!=0) {
                return data[a][0].compareTo(data[b][0]);
            } else if(Integer.valueOf(data[a][1])!= Integer.valueOf(data[b][1])) {
                return Integer.valueOf(data[a][1]) - Integer.valueOf(data[b][1]);
            } else {
                return a-b;
            }
        });

        for(int idx=0 ; idx<files.length ; idx++) {
            String file = files[idx];
            int i = 0;
            while(i<file.length() && !Character.isDigit(file.charAt(i))) {
                i++;
            }
            data[idx][0] = file.substring(0, i).toLowerCase();
            int s = i;
            while(i<file.length() && i-s<5 && Character.isDigit(file.charAt(i))) {
                i++;
            }
            data[idx][1] = file.substring(s, i);

            pq.offer(idx);
        }

        String[] ret = new String[files.length];
        
        for(int i=0 ; i<ret.length ; i++) {
            ret[i] = files[pq.poll()];
        }

        return ret;
        
    }

0개의 댓글