프로그래머스-2018 KAKAO BLIND RECRUITMENT ( 파일명 정렬 by Java )

Flash·2022년 2월 7일
0

Programmers-Algorithm

목록 보기
18/52
post-thumbnail

정렬

프로그래머스 2018 KAKAO BLIND RECRUITMENT Level 2 문제 파일명 정렬Java를 이용해 풀어보았다.
Comparator를 이용한 간단한 정렬 문제였다.

문제 링크 첨부한다.
https://programmers.co.kr/learn/courses/30/lessons/17686


파일 하나 표현하는 클래스 선언하기

파일명 원본이 주어지면 그에 따라 Head, Number, Tail 세 부분으로 나눌 수 있다. 먼저 Head를 대소문자 무관한 사전순으로 정렬하고 -> Number에 따라 오름차순으로 정렬한 순서를 반환하면 된다.

하지만 결국 반환해주는 건 파일명 원본이기 때문에 원래 파일명도 계속 가지고 있어야 한다. 이를 위해 다음과 같은 Info 클래스를 선언했다.

static class Info{
        String fileName;
        String lowerCaseHead;
        int number;

        Info(String fileName, String lowerCaseHead, int number){
            this.fileName = fileName;
            this.lowerCaseHead = lowerCaseHead;
            this.number = number;
        }

        String getLowerCaseHead()    { return lowerCaseHead; } // 요 두 getter 메소드는 나중에 Comparator에 이용하기 위함
        Integer getNumber() { return number; }
    }

그런데 우리가 원하는 건 결국 파일명 하나가 주어졌을 때 그에 따른 Info 객체 하나를 생성하기 원하는 것이다. 따라서 다음과 같은 생성자를 추가해줬다.

Info(String s){
            StringBuilder sb = new StringBuilder();
            String lowerCaseHead = "";
            int number;

            int i;
            for(i=0; i<s.length(); i++){
                if(!Character.isDigit(s.charAt(i))) sb.append(Character.toLowerCase(s.charAt(i)));
                else    break;
            }
            lowerCaseHead = sb.toString();
            sb = new StringBuilder();

            for(i=i; i<s.length(); i++){
                if(Character.isDigit(s.charAt(i)))  sb.append(s.charAt(i));
                else    break;
            }
            number = Integer.parseInt(sb.toString());

            this.fileName = s;
            this.lowerCaseHead = lowerCaseHead;
            this.number = number;
        }

이 생성자를 사용하면 주어진 String[] files 에 대해 다음과 같은 작업이 가능하다.

static ArrayList<Info> list = new ArrayList<>();

static String[] solution(String[] files) {
        for(String s: files)    list.add(new Info(s)); // 그냥 생성자만 이용해서 쉽게 추가 가능함
        list.sort(Comparator.comparing(Info::getLowerCaseHead).thenComparing(Info::getNumber));

        String[] answer = new String[files.length];
        int i = 0;
        for(Info info: list){
            answer[i] = info.fileName;
            i++;
        }
        return answer;
    }

정렬Comparator.comparing() 메소드를 이용해 쉽게 할 수 있다. 이 방법은 이전에 올렸던 포스트인 실패율을 풀 때 처음으로 배운 방법이었다.

아래는 내가 제출한 전체 코드다.

import java.io.*;
import java.util.ArrayList;
import java.util.Comparator;

public class FileNameSorting {
    static ArrayList<Info> list = new ArrayList<>();

    static String[] solution(String[] files) {
        for(String s: files)    list.add(new Info(s));
        list.sort(Comparator.comparing(Info::getLowerCaseHead).thenComparing(Info::getNumber));

        String[] answer = new String[files.length];
        int i = 0;
        for(Info info: list){
            answer[i] = info.fileName;
            i++;
        }
        return answer;
    }

    static class Info{
        String fileName;
        String lowerCaseHead;
        int number;

        Info(String s){
            StringBuilder sb = new StringBuilder();
            String lowerCaseHead = "";
            int number;

            int i;
            for(i=0; i<s.length(); i++){
                if(!Character.isDigit(s.charAt(i))) sb.append(Character.toLowerCase(s.charAt(i)));
                else    break;
            }
            lowerCaseHead = sb.toString();
            sb = new StringBuilder();

            for(i=i; i<s.length(); i++){
                if(Character.isDigit(s.charAt(i)))  sb.append(s.charAt(i));
                else    break;
            }
            number = Integer.parseInt(sb.toString());

            this.fileName = s;
            this.lowerCaseHead = lowerCaseHead;
            this.number = number;
        }

        String getLowerCaseHead()    { return lowerCaseHead; }
        Integer getNumber() { return number; }
    }

    public static void main(String[] args) throws IOException {
        BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
        String[] files = {"img12.png", "img10.png", "img02.png", "img1.png", "IMG01.GIF", "img2.JPG"};
        String[] result = solution(files);
        for(String res: result) bfw.write(res + "\n");
        bfw.close();
    }
}
profile
개발 빼고 다 하는 개발자

0개의 댓글