algorithm/programmers

[프로그래머스/자바] 파일명 정렬 풀이 - 2018 KAKAO BLIND RECRUITMENT

hsm914 2022. 12. 1. 23:30
728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2018 KAKAO BLIND RECRUITMENT 3차 Level 2 문제다.

 

 

먼저 [files.length][4] 크기의 2차원 배열 file을 생성한다.

0에는 files의 파일명, 1에는 head, 2에는 number, 3에는 tail을 저장해서

Arrays.sort를 통해 1, 2를 기준으로 정렬한다.

ans에 file의 0을 넣어 반환하면 된다.

 

 

파일명을 한글자씩 sb에 저장하고,

숫자를 만난 경우 sb(head)를 1에 저장한다. 이때 head는 대소문자를 구분하지 않으므로 소문자 또는 대문자로 변경해서 대입한다.

숫자가 끝나고 문자가 시작되거나 숫자가 5글자를 넘은 경우, sb(number)를 2에 저장한다.

그리고 파일명을 다 돌면 sb(tail)를 3에 저장한다.

 

파일명을 모두 분리해주었다면 Arrays.sort를 통해 정렬해준다.

head가 같은 경우 number를 정렬한다.

number는 문자열 사전순이 아닌 숫자 대소비교를 해야 하므로 Integer.parseInt로 변경해준다.

head가 같지 않은 경우 head를 사전순 정렬해준다.

 

head와 number를 기준으로 정렬해주었다면 file의 인덱스 0, 즉 파일명만을 ans에 넣어 ans를 반환한다.

 

 

 

주의할점

1) number는 최대 다섯 글자다. (예를 들어 img001234567.txt인 경우 head: img, number: 00123, tail: 4567.txt)

 

2) tail이 비어있는 경우 number이 null일 수 있다.

내 경우에는 tail을 만나는 경우 (숫자가 끝나고 문자가 시작되는 경우) number을 대입하는 식으로 구현했는데,

그러면 tail이 없는 경우 number도 대입되지 않아 Arrays.sort에서 런타임 에러가 발생했다.

 

 

 

배운점 및 느낀점

코드에 활용하진 않았지만 compareToIgnoreCase()라는 함수를 통해 대소문자 구분 없이 비교할 수 있다는 걸 알았다.

그리고 head, number, tail을 너무 복잡하게 구분한 것 같은데,

정규표현식을 더 배워봐야겠다..!!

 

 

import java.util.Arrays;

class Solution {
    public String[] solution(String[] files) {
        int n = files.length;
        String[][] file = new String[n][4];
        StringBuilder sb = new StringBuilder();
        
        for(int i=0;i<n;i++) {
            file[i][0] = files[i];
            
            int cnt = 0;
            boolean flag = false;
            int idx = 1;
            
            for(int j=0;j<files[i].length();j++) {
            	char c = files[i].charAt(j);
                if(idx == 1 && (c < '0' || c > '9'))
                    sb.append(c);
                else if(c >= '0' && c <= '9' && !flag) {
                    if(idx == 1) {
                        file[i][idx++] = sb.toString().toLowerCase();
                        sb.setLength(0);
                    }
                    if(++cnt > 5) {
                    	file[i][2] = sb.toString();
                    	file[i][3] = files[i].substring(j, files[i].length());
                    	break;
                    }
                    sb.append(c);
                }
                else if(c < '0' || c > '9' || flag) {
                    if(idx == 2) {
                        flag = true;
                        file[i][idx++] = sb.toString();
                        sb.setLength(0);
                    }
                    sb.append(c);
                }
            }
            if(flag) 
            	file[i][3] = sb.toString();
            else if(file[i][2] == null)
            	file[i][2] = sb.toString();
            sb.setLength(0);
        }
        
        Arrays.sort(file, (o1, o2) -> o1[1].equals(o2[1]) ? 
        		Integer.parseInt(o1[2]) - Integer.parseInt(o2[2]) : o1[1].compareTo(o2[1]));
        
        String[] answer = new String[n];
        for(int i=0;i<n;i++)
            answer[i] = file[i][0];
        
        return answer;
    }
}
728x90