본문 바로가기
Problem Solving/카카오 블라인드 기출

2018 - [3차] 파일명 정렬

by Libi 2021. 8. 7.
반응형

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

 

코딩테스트 연습 - [3차] 파일명 정렬

파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램

programmers.co.kr

[ 문제풀이 ]

2018 카카오 기출문제들은 문자열을 다루는 문제가 참 많은 것 같다. 이 문제 또한 주어진 file에서 조건대로 HEAD, NUMBER를 추출한 후 정렬해주면 쉽게 해결할 수 있다.

다만, NUMBER를 추출할 경우 주의해야 한다.

NUMBER는 HEAD의 다음 인덱스부터 최대 다섯 글자로 이루어질 수 있지만 file의 총길이가 HEAD의 다음 인덱스 + 5보다 작을 수도 있기 때문에 둘 중 최솟값을 구하여 범위를 제한해줘야 한다.

그렇지 않으면 인덱스를 넘어가기 때문에 런타임 에러가 발생할 것이다.

import java.util.*;

class Solution {
    class File implements Comparable<File> {
        int idx, NUMBER;
        String fileName, HEAD;
        
        File(int idx, String fileName) {
            this.idx = idx;
            this.fileName = fileName;
        }
        
        public int compareTo(File o) {
        	if (this.HEAD.equals(o.HEAD)) {
        		if (this.NUMBER == o.NUMBER) {
        			return this.idx - o.idx;
        		}
        		return this.NUMBER - o.NUMBER;
        	}
        	return this.HEAD.compareTo(o.HEAD);
        }
    }
    
    public String[] solution(String[] files) {
        ArrayList<File> fileList = new ArrayList<>();
        for (int i = 0; i < files.length; ++i) {
            File file = new File(i, files[i]);
            
            int headPos = getHeadPos(files[i]);
            //HEAD는 대소문자를 구분하지 않기 때문에 소문자로 통일
            file.HEAD = files[i].substring(0, headPos).toLowerCase();
            
            int numberPos = getNumberPos(headPos, files[i]);
            file.NUMBER = Integer.parseInt(files[i].substring(headPos, numberPos));
            
            fileList.add(file);
        }
        
        //1.HEAD순 2.NUMBER순 3.idx순으로 정렬
        Collections.sort(fileList);
        
        String[] answer = new String[fileList.size()];
        for (int i = 0; i < fileList.size(); ++i) {
            answer[i] = fileList.get(i).fileName;
        }
        return answer;
    }
    
    public int getHeadPos(String s) {
        for (int i = 0; i < s.length(); ++i) {
            if (Character.isDigit(s.charAt(i))) {
                return i;
            }
        }
        return -1;
    }
    
    public int getNumberPos(int start, String s) {
    	//NUMBER부분은 최대 길이가 5이지만 문자열의 총 길이를 벗어날 수 있기 때문에
    	//둘 중 최소 값으로 범위를 제한함
    	int size = Math.min(s.length(), start + 5);
        
        for (int i = start + 1; i < size; ++i) {
            if (!Character.isDigit(s.charAt(i))) {
                return i;
            }
        }
        
        return size;
    }
}

 

 

반응형

'Problem Solving > 카카오 블라인드 기출' 카테고리의 다른 글

2019 - 오픈채팅방  (0) 2021.08.08
2018 - [3차] n진수 게임  (0) 2021.08.07
2018 - [3차] 자동완성  (0) 2021.08.07
2018 - [3차] 압축  (0) 2021.08.07
2018 - [3차] 방금그곡  (0) 2021.08.07

댓글