프로그래머스/자바 Lv2

[프로그래머스] Java Lv2. 코딩테스트 연습 > 2018 KAKAO BLIND RECRUITMENT > [3차] 파일명 정렬 17686

행수쌤 2024. 11. 4. 16:02
728x90
반응형

문제설명

  • 파일명이 HEAD, NUMBER, TAIL 세 부분으로 구성되어 있다.
  • 파일명은 우선 대,소문자 구분 없이 HEAD 부분을 기준으로 사전 순으로 정렬한다.
  • 파일명의 HEAD 부분이 대소문자 차이 외에는 같을 경우, NUMBER의 숫자 순으로 정렬한다.
  • 두 파일의 HEAD 부분과 NUMBER의 숫자도 같을 경우, 원래 입력에 주어진 순서를 유지한다.

접근방법

  1. 파일명에서 처음 나오는 숫자를 기준으로 HEAD, NUMBER, TAIL을 구분.
  2. 정렬 기준에 따라 sort 진행

핵심로직

  1. 파일명의 형태가 정해져 있으므로 숫자, 문자를 기준으로 split 하여 HEAD와 NUMBER를 찾아낸다.
  2. 찾아낸 HEAD와 NUMBER를 토대로 문제에서 요구하는 기준에 따라 정렬 값 return

입출력 예

  • 입력: ["img12.png", "img10.png", "img02.png", "img1.png", "IMG01.GIF", "img2.JPG"]
  • 출력: ["img1.png", "IMG01.GIF", "img02.png", "img2.JPG", "img10.png", "img12.png"]

코드 작성(1차)

import java.util.*;

class Solution {
    public String[] solution(String[] files) {
        Arrays.sort(files, (a, b) -> {
            String[] partsA = new String[2];
            partsA[0] = a.split("\\d")[0];
            partsA[1] = a.split("\\D+")[1];
            
            String[] partsB = new String[2];
            partsB[0] = b.split("\\d")[0];
            partsB[1] = b.split("\\D+")[1];
            
            if(!partsA[0].toLowerCase().equals(partsB[0].toLowerCase())) {
                return partsA[0].toLowerCase().compareTo(partsB[0].toLowerCase());
            } else if (Integer.parseInt(partsA[1]) != Integer.parseInt(partsB[1])) {
                return Integer.parseInt(partsA[1]) - Integer.parseInt(partsB[1]);
            } else {
                return 0;
            }
        });
        return files;
    }
}

a와 b의 HEAD, NUMBER를 추출하는 코드가 중복되고, rank를 비교 하는 메서드를 사용해서 코드를 간결하게 만들어주도록 한다.

코드 작성(2차)

import java.util.*;

class Solution {
    public String[] solution(String[] files) {
        Arrays.sort(files, (a, b) -> {
            // 파일 이름을 HEAD와 NUMBER로 분리
            String[] partsA = splitFileName(a);
            String[] partsB = splitFileName(b);
            
            // HEAD 비교
            int headCompare = partsA[0].compareToIgnoreCase(partsB[0]);
            if (headCompare != 0) {
                return headCompare;
            }
            
            // NUMBER 비교
            int numA = Integer.parseInt(partsA[1]);
            int numB = Integer.parseInt(partsB[1]);
            return Integer.compare(numA, numB);
        });
        return files;
    }

    // 파일 이름을 HEAD와 NUMBER로 분리하는 메소드
    private String[] splitFileName(String file) {
        String head = file.split("\\d")[0];
        String number = file.substring(head.length()).split("\\D+")[0];
        return new String[]{head, number};
    }
}
728x90
반응형