[프로그래머스] [3차] 파일명 정렬(17686)

lhs's avatar
Dec 07, 2024
[프로그래머스] [3차] 파일명 정렬(17686)
 

1. 문제 풀이 아이디어

  • splitsubstring 메서드를 사용하여 문자열을 분리하고, sort 메서드에서 람다식을 활용하면 문제를 해결할 수 있다.

2. 나의 정답 코드

class Solution { public String[] solution(String[] files) { String[] answer = {}; Arrays.sort(files, (o1, o2) -> { String[] s1 = split(o1); String[] s2 = split(o2); String h1 = s1[0]; String h2 = s2[0]; if (h1.compareToIgnoreCase(h2) == 0) { Integer n1 = Integer.valueOf(s1[1]); Integer n2 = Integer.valueOf(s2[1]); return n1.compareTo(n2); } return h1.compareToIgnoreCase(h2); }); return files; } public String[] split(String s) { String h = s.split("\\d")[0]; String n = s.substring(h.length()).split("\\D")[0]; return new String[]{h, n}; } }

3. 정리

  • 숫자를 기준으로 문자열을 나눈 뒤 첫 번째 부분을 헤더(h)에 저장한다.
  • 헤더 길이만큼 제외한 나머지 문자열에서 숫자를 추출해 n에 저장하고, 이를 배열 형태로 반환한다.
  • 정렬 과정에서는 Arrays.sort를 사용해 정렬 기준을 구현한다.
    • 헤더(h)를 비교하여 동일한 경우, 숫자(n)를 비교하여 정렬한다.
    • 헤더가 다른 경우 비교하여 정렬한다.
  • 문자열 비교 시 대소문자 구분을 무시하기 위해 compareToIgnoreCase 메서드를 사용하였다.

4. 풀이 중 발생했던 문제

  • 처음에는 for문으로 인덱스를 탐색하여 substring으로 문자열을 구분하려 했으나, 숫자가 없는 경우 런타임 예외가 발생했다.
  • 이를 해결하기 위해 정규식을 활용한 split 메서드를 함께 사용하여 안전하게 구분할 수 있었다.
Share article

LHS's Study Space