[프로그래머스] PS/Java

[lv2] 파일명 정렬

SH3542 2024. 12. 19. 17:17

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

 

구현(문자열 처리) or 정규 표현식 문제다.

 

정규 표현식 문법을 몰라서 전자로 풀이했다.

일반적인 구현 외에, 비교는 A'으로 하고 출력은 A로 해야하는 점이 좀 까다로웠다.

 

 

 

안해도 되는 것

같은 정렬 기준을 가진 원소는 정렬 이후에도 순서가 유지된다. list에 file을 순차적으로 넣었으면 고려할 필요가 없다.

 

 

시간 소요 요인 (docs 뒤져서 찾았다.)

1. isDigit를 isNumeric으로 잘못 알고있었다. (해당 메서드는 Character 클래스에 없다.)

 

2. isLetter에 숫자 또한 포함인걸 몰랐다. (head 판별식에 숫자가 아닌 부분을 찾는 용도로 사용했었다.)

 

때문에 number 부분에 포함되어야 할 숫자들이 head에 들어가면서 number가 빈 문자열이 되었고, 널포인터가 떴다.

애꿏은 parseInt만 디버깅하다가, 문제 조건상 number가 빈 문자열일 수가 없기에 재검토하다 찾았다.

import java.util.*;

class Solution {
    public String[] solution(String[] files) {

        List<Content> list = new ArrayList<>();

        for(String file : files)
            list.add(split(file));

        return list.stream()
            .sorted()
            .map(c -> c.head + c.number + c.tail)
            .toArray(String[]::new);
    }

    static Content split(String file) {
        StringBuilder head = new StringBuilder();
        StringBuilder number = new StringBuilder();
        String tail = "";

        int S = file.length();
        int i = 0;

        // head
        while(i < S) {
            char c = file.charAt(i);

            if(!Character.isDigit(c)) {
                head.append(c);
                i++;
            }
            else break;
        }

        // number
        while(i < S) {
            char c = file.charAt(i);

            if(Character.isDigit(c)) {
                number.append(c);
                int now = Integer.parseInt(number.toString());

                if(now < 100000)
                    i++;
                else {
                    number.setLength(number.length()-1);
                    break;
                }
            }
            else break;
        }

        // tail
        if(i < S)
            tail = file.substring(i);

        return new Content(head.toString(), number.toString(), tail.toString());
    }
}


class Content implements Comparable<Content>{

    String head;
    String compHead;
    String number;
    int compNumber;
    String tail;

    Content(String head, String number, String tail) {
        this.head = head;
        this.compHead = head.toLowerCase();
        this.number = number;
        // NUBER는 0이상 99999이하이다. => Null포인터 발생 안함 보장
        this.compNumber = Integer.parseInt(number);
        this.tail = tail;
    }

    @Override
    public int compareTo(Content c) {

        // HEAD는 최소한 한 글자 이상이다. => Null포인터 발생 안함 보장
        if(this.compHead.equals(c.compHead))
            return this.compNumber - c.compNumber;

        return this.compHead.compareTo(c.compHead);
    }
}

'[프로그래머스] PS > Java' 카테고리의 다른 글

[lv2] 디펜스 게임  (2) 2024.12.22
[lv3] 카운트 다운  (1) 2024.12.19
[lv3] 외벽 점검  (0) 2024.12.16
[lv2] 리코쳇 로봇  (1) 2024.12.15
[lv2] 방금그곡  (0) 2024.12.15