[프로그래머스] 파일명 정렬 (JAVA/자바) - 2018 카카오 기출

문제

프로그래머스>코딩테스트 연습>2018 KAKAO BLIND RECRUITMENT>[3차] 파일명 정렬 - https://programmers.co.kr/learn/courses/30/lessons/17686


풀이

파일명을 세 부분으로 나누어 정렬하는 문제이다. 세 부분으로 나누지만 실제 정렬 시에는 HEADNUMBER 부분만 고려하면 된다.


  1. 우선 filename을 세 부분으로 분리하고, File[]을 만들어 객체로 저장한다.

    • HEAD의 경우 대소문자 구분이 없으므로 전부 소문자로 변경한다. (or 대문자도 가능)
    • NUMBER의 경우 문자열을 숫자로 바꾸어 저장한다.
  2. 소팅한다. Arrays.sort()를 사용했고, Comparator을 정의해서 넣어주었다. 정렬하는 방법은 자꾸 잊어버려서 여기에 정리해두었다.

    • HEAD 부분이 같은지 확인해서 같다면 NUMBER 오름차순으로 정렬한다.
    • HEAD 부분이 다르다면 HEAD부분을 기준으로 사전 순 정렬한다.
  3. 정렬 된 File[] 배열의 원래 파일명을 리턴한다.


코드

import java.util.Arrays;
import java.util.Comparator;

class Solution {

    static class File{
        String file_name;
        String head;
        int number;

        public File(String file_name, String head, int number) {
            this.file_name = file_name;
            this.head = head;
            this.number = number;
        }
    }
    
    public static String[] solution(String[] files) {
        

        File[] file_info = new File[files.length];

        for (int i = 0; i < files.length; i++) {
            String[] split = splitFileName(files[i]);
            file_info[i] = new File(files[i], split[0], Integer.parseInt(split[1]));
        }

        Arrays.sort(file_info, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                if ((o1.head).equals(o2.head)) { 	// HEAD 부분이 같다면 
                    return o1.number-o2.number; 	// NUMBER 오름차순 정렬
                }else{
                    return (o1.head).compareTo(o2.head); // HEAD 부분을 기준으로 사전 순 정렬
                }
            }
        });

        String[] answer = new String[files.length];
        for (int i = 0; i < files.length; i++) {
            answer[i] = file_info[i].file_name;
        }
        
        return answer;
    }

    // file name을 head, number, tail로 나누는 함수
    public static String[] splitFileName(String file){ 
        String str[] = new String[3];
        str[0] = ""; // HEAD
        str[1] = ""; // NUMBER
        str[2] = ""; // TAIL

        int idx = 0;
        for (int i = 0; i < file.length(); i++) {
            char c = file.charAt(i);

            if(idx==0 && !Character.isDigit(c)){
                str[idx] += c;
                continue;
            }

            if(idx==0 && Character.isDigit(c)){
                idx ++;
            }

            if(idx==1 && Character.isDigit(c)){
                str[idx] += c;
                continue;
            }

            if(idx==1 && !Character.isDigit(c)){
                idx ++;
            }
            str[idx] += c;
        }

        str[0] = str[0].toLowerCase(); // 대소문자 구분 X, 소문자로 변환
        
        return str;
    }
}

정리

난이도 : LEVEL 2

🤦‍♀️ 메모

  • File[] 배열도 배열인데, 잘못 생각해서 자꾸 Collections.sort()를 사용하다가 삽질을 했다. 배열은 Arrays.sort()를 사용해야 한다! List 같은 것들이 Collections.sort()를 사용하는 것! 기억해 둘 것.

참고 사이트

딱히 없음

좋은 웹페이지 즐겨찾기