[프로그래머스 - LV2] [3차] 파일명 정렬

2025. 10. 9. 16:49·알고리즘

 

문제 링크

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

문제 설명

1. `HEAD` : 문자로만 이뤄진 부분

2. `NUMBER` : 숫자로만 이뤄진 부분

3. `TAIL` : 그 나머지

 

파일명을 위의 세 부분으로 나눠서 파일들을 정렬해야한다.

 

정렬 방법

1. HEAD를 사전순으로 정렬(대소문자 구분 X)

2. NUMBER를 오른차순으로 정렬

3. 1, 2번이 모두 같으면, 기존에 주어진 순서를 유지

 

 

문제 풀이

 

1. file들을 `head`, `number`, `tail`로 구분해 문자일 때, 숫자일 때 그 나머지를 각각 넣어준다.

- 여기서 char을 쓰면 숫자/문자 구분이 편한 것 같아 자주 쓰고 있다.

2. 위의 정렬대로 정렬한다.

- 대소문자 구분해 주지 않기 위해, `head`를 모두 소문자로 바꿔준다.

- 숫자 구분은 `Integer.compare(숫자1, 숫자2)`와 문자 구분은 `문자1.compareTo(문자2)` 부분이 조금 헷갈렸음!

- primitive 타입인 int형들을 구분하기 위해서는 `Comparator` 인터페이스를 사용하고, 객체를 구분하기 위해서는 `Comparable` 인터페이스를 사용

 

import java.util.*;
class Solution {
    
    static class File {
        String origin, head, number, tail;
        
        File(String origin, String head, String number, String tail) {
            this.origin = origin;
            this.head = head;
            this.number = number;
            this.tail = tail;
        }
        
    }
    
    public String[] solution(String[] files) {

        List<File> fileList = new ArrayList<>();

        for(String file : files) {
            StringBuilder head = new StringBuilder();
            StringBuilder number = new StringBuilder();
            StringBuilder tail = new StringBuilder();
            
            int idx = 0;
            
            // HEAD
            while(idx < file.length() && !(file.charAt(idx) >= '0' && file.charAt(idx) <= '9')) {
                head.append(file.charAt(idx++));
            }
            
            // NUMBER
            while(idx < file.length() && file.charAt(idx) >= '0' && file.charAt(idx) <= '9') {
                number.append(file.charAt(idx++));
            }
            
            while(idx < file.length()) {
                tail.append(file.charAt(idx++));
            }
            
            fileList.add(new File(file, head.toString(), number.toString(), tail.toString()));
        }
        
        // 정렬 1. head 순 2. number 순 3. arr순
        fileList.sort((f1, f2) -> {
            int headCom = f1.head.toLowerCase().compareTo(f2.head.toLowerCase());
            int num1 = Integer.parseInt(f1.number);
            int num2 = Integer.parseInt(f2.number);
            
            if (headCom == 0) {
                return Integer.compare(num1, num2);
            }
            return headCom;
        });
        
        String[] answer = new String[files.length];
        for(int i = 0; i < fileList.size(); i++) {
            answer[i] = fileList.get(i).origin;
        }
        
        return answer;
    }
}

 

저작자표시 비영리 변경금지 (새창열림)

'알고리즘' 카테고리의 다른 글

[알고리즘] 선택정렬(Selection Sort)  (4) 2026.01.09
[Java-투포인터] 두 배열 합쳐서 정렬하기  (0) 2025.12.30
[프로그래머스 - LV2] [1차] 프렌즈4블록  (2) 2025.10.08
[프로그래머스 - LV2] 이모티콘 할인행사  (1) 2025.10.07
[프로그래머스 - LV2] [1차]뉴스 클러스터링  (0) 2025.10.06
'알고리즘' 카테고리의 다른 글
  • [알고리즘] 선택정렬(Selection Sort)
  • [Java-투포인터] 두 배열 합쳐서 정렬하기
  • [프로그래머스 - LV2] [1차] 프렌즈4블록
  • [프로그래머스 - LV2] 이모티콘 할인행사
수웅
수웅
  • 수웅
    야금야금 공부
    수웅
  • 전체
    오늘
    어제
    • 분류 전체보기 (90) N
      • 코딩 (3)
      • 알고리즘 (48)
      • CS (15) N
      • 취준 (1)
      • 안드로이드 (17)
        • 코틀린 (6)
        • 정리 (10)
        • 프로젝트 (0)
      • Error (1)
      • Git (2)
      • 기타 (2)
  • 블로그 메뉴

    • 홈
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
수웅
[프로그래머스 - LV2] [3차] 파일명 정렬
상단으로

티스토리툴바