[프로그래머스(Programmers)] [3차] 파일명 정렬 (java) /2018 KAKAO BLIND RECRUITMENT

2
post-thumbnail

안녕하세요. 오늘은 프로그래머스의 파일명 정렬 문제를 풀어보겠습니다. 이 문제는 2018년 KAKAO BLIND RECRUITMENT에서 출제되었습니다.


문제 링크

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

문제 풀이

✔ files에 주어진 string을 head, number, tail로 나누기 : detach 함수

먼저 files배열에 주어진 string을 head, number, tail로 나누어줍니다. 숫자를 기준으로 잡고, 숫자 앞쪽에 있는 String은 head, 숫자들은 number, 숫자 이후에 나오는 String은 tail로 구분해서 나누어줍니다.

✔ comparator를 이용해 정렬하기

Arrays.sort와 comparator를 이용해 files배열을 정렬해줍니다. 우선 file1과 file2의 head부분을 비교해주고, head부분이 같다면 number부분까지 비교해줍니다.

전체 코드

import java.util.*;

class Solution {
    public String[] solution(String[] files) {
        Arrays.sort(files, (s1, s2) -> {
            FileName file1 = detach(s1);
            FileName file2 = detach(s2);

            int headValue = file1.getHead().toLowerCase().compareTo(file2.getHead().toLowerCase());

            if (headValue == 0) {
                int num1 = Integer.parseInt(file1.getNumber());
                int num2 = Integer.parseInt(file2.getNumber());

                return num1 - num2;
            } else {
                return headValue;
            }
        });

        return files;
    }

    private FileName detach(String str) {
        StringBuilder sb = new StringBuilder();
        FileName file = new FileName();

        int idx = 0;
        int size = str.length();

        for (; idx < size; idx++) {
            char ch = str.charAt(idx);
            if (ch >= '0' && ch <= '9') {
                break;
            }
            sb.append(ch);
        }
        file.setHead(sb.toString());
        sb.delete(0, sb.length());

        for (; idx < size; idx++) {
            char ch = str.charAt(idx);
            if (!(ch >= '0' && ch <= '9')) {
                break;
            }
            sb.append(ch);
        }
        file.setNumber(sb.toString());
        sb.delete(0, sb.length());

        for (; idx < size; idx++) {
            char ch = str.charAt(idx);
            sb.append(ch);
        }
        file.setTail(sb.toString());

        return file;
    }
}

class FileName {
    private String head = "";
    private String number = "";
    private String tail = "";

    FileName() {

    }

    public String getHead() {
        return head;
    }

    public void setHead(String head) {
        this.head = head;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getTail() {
        return tail;
    }

    public void setTail(String tail) {
        this.tail = tail;
    }
}

느낀점/못 푼 이유

✔ comparator 미사용/ 사용 미숙

인터넷에서 다른분들이 comparator를 사용해서 푸신 것을 보고 무릎을 탁 쳤다. comparator를 사용할 생각을 아예 못했었다. (사용할 생각을 했다고 하더라도, 저만큼 잘 사용은 못했을 것 같다...) 알고리즘 문제 풀 때 comparator를 사용하는 풀이가 꽤 많이 나오는데, 이참에 더 능숙하게 사용하도록 노력해야겠다.

✔ 여러 개의 for문에서 하나의 index를 돌려서 사용하기

detach 함수에서 여러 개의 for문에 하나의 index를 돌려서 사용하는 점이 매우 인상깊었다. 여태까지 for문 하나마다 index를 새로 선언해서 사용했었는데, 저런 방법은 처음이라 신기했다.

✔ 맥락있게 코드짜기

항상 내 코드에는 맥락이 없어서 코드를 짠 나조차도 이해하기가 어려운데, 참고한 코드는 깔끔하고 이해하기가 쉽다.

잘한점

✔ FileName 객체 생성

객체를 따로 생성하고, 이용하는 방법은 잘 생각한 듯 하다. 알고리즘 문제를 풀 때 객체지향적으로 풀 수 있도록 더 노력해봐야겠다.


[참고한 곳]
https://velog.io/@hyeon930/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%8C%8C%EC%9D%BC%EB%AA%85-%EC%A0%95%EB%A0%AC-Java

0개의 댓글