마트철수

[51] 코딩테스트: 파일명 정렬 자바 풀이 본문

개인공부/알고리즘

[51] 코딩테스트: 파일명 정렬 자바 풀이

마트스 2025. 1. 17. 14:00

코딩테스트 준비 51일차

 

오늘 풀 문제는 파일명 정렬이다.

 

파일명 정리는 구글링해서 풀이를 완료했다.

그 이유는.. 정렬하는 람다를 잘 모르겠다 아직두ㅜ

 

▼ 아래 정리해둔 포스팅 함께 첨부하겠다.

2024.12.26 - [개인공부/IT 지식] - [Arrays.sort] 배열 정렬하기: Comparator와 Lambda 활용

 

파일명 정리

  • 정렬 지정
    • Arrays.sort(files, (o1, o2) ->{ ...
    • head, number에 따라 정렬이 달라지도록
  • 리턴값
    • return new String[]{head, number};
  • 새로 배운 메서드
    • 대소문자 상관없이 비교: int h = a[0].compareToIgnoreCase(b[0]);
    • 숫자인지 아닌지: !Character.isDigit(s.charAt(i))

출처: 프로그래머스 파일명 정렬 자바 풀이

 

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

최종 코드

import java.util.*;

class Solution {
    public String[] solution(String[] files) {
        Arrays.sort(files, (o1, o2) ->{
            String[] a = count(o1);
            String[] b = count(o2);
            
            //head 비교
            int h = a[0].compareToIgnoreCase(b[0]);
            if(h!=0){
                return h;
            }
            //number 비교
            int n1 = Integer.parseInt(a[1]);
            int n2 = Integer.parseInt(b[1]);
            if(n2 != n1){
                return Integer.compare(n1, n2);
            }
            return 0;
        });
        return files;
    }
    
    private String[] count(String s){
        String head = "";
        String number = "";
        int i = 0;
        
        while(i < s.length() && !Character.isDigit(s.charAt(i))){
            head += s.charAt(i);
            i++;
        }
        
        while(i < s.length() && Character.isDigit(s.charAt(i))){
            number += s.charAt(i);
            i++;
        }
        
        return new String[]{head, number};
    }
}

 


 

내가 이해가 어려웠던 부분은 head 비교이다.

//head 비교
int h = a[0].compareToIgnoreCase(b[0]);
if(h!=0){
    return h;
}

 

만약 head만 대소문자 상관없이 비교했을 때,

같지 않으면 h가 -1 return 되었을 거다.

 

그러면 if문 조건에 들어가니깐 h return!

그러면 비교 대상도 안되는 것임