알고리즘 공부/프로그래머스

(Java)프로그래머스 코딩테스트 연습 - 2018 KAKAO BLIND RECRUITMENT - [3차] 파일명 정렬

HRuler 2020. 12. 9. 20:34

1. 문제

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

 

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

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

programmers.co.kr

2. 나의 풀이

import java.util.*;

class Solution {
    public ArrayList<String> solution(String[] files) {
        ArrayList<String> answer = new ArrayList<>();
        for(String imsi : files) {
        	answer.add(imsi);
        }
        
        answer.sort((o1, o2) -> {
        	//System.out.println("o1 : " + o1 + ", o2 : " + o2);
        	String o1_head = "";
        	for(int i = 0; i < o1.length(); i = i + 1) {
        		//System.out.println("o1.charAt(" + i + ") : " + o1.charAt(i));
        		if(48 <= o1.charAt(i) && o1.charAt(i) <= 57) {
        			o1_head = o1.substring(0, i).toLowerCase();
        			
        			break;
        		}
        	}
        	//System.out.println("o1_head : " + o1_head);
        	String o2_head = "";
        	for(int i = 0; i < o2.length(); i = i + 1) {
        		//System.out.println("o2.charAt(" + i + ") : " + o2.charAt(i));
        		if(48 <= o2.charAt(i) && o2.charAt(i) <= 57) {
        			o2_head = o2.substring(0, i).toLowerCase();
        			break;
        		}
        	}
        	//System.out.println("o2_head : " + o2_head);
        	if(o1_head.compareTo(o2_head) > 0) {
        		return 1;
        	}else if(o1_head.compareTo(o2_head) < 0) {
        		return -1;
        	}
        	
        	int o1_number = o1.length();
        	for(int i = o1_head.length(); i < o1.length(); i = i + 1) {
        		if(48 > o1.charAt(i) || o1.charAt(i) > 57) {
        			o1_number = i;
        			//System.out.println("o1_number_end : " + o1_number);
        			break;
        		}
        	} 
        	o1_number = Integer.parseInt(o1.substring(o1_head.length(), o1_number));
        	//System.out.println("o1_number : " + o1_number);
        	int o2_number = o2.length();
        	for(int i = o2_head.length(); i < o2.length(); i = i + 1) {
        		if(48 > o2.charAt(i) || o2.charAt(i) > 57) {
        			o2_number = i;
        			//System.out.println("o2_number_end : " + o2_number);
        			break;
        		}
        	}
        	//System.out.println(o2.substring(o2_head.length(), o2_number));
        	o2_number = Integer.parseInt(o2.substring(o2_head.length(), o2_number));
        	//System.out.println("o1_number : " + o1_number);
        	if(o1_number > o2_number) {
        		return 1;
        	}else if(o2_number > o1_number) {
        		return -1;
        	}
        	return 0;
        });
                
        return answer;
    }
}

3. 다른 사람 풀이

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Solution {
  public String[] solution(String[] files) {
        List<FileName> fileNameList = new ArrayList<>();
        String head, number, tail;

        for (int i = 0; i < files.length; i++) {
            String s = files[i];
            Pattern p = Pattern.compile("[0-9]+");
            Matcher m = p.matcher(s);
            if (m.find()){
                number = m.group();
                int numberStartIndex = s.indexOf(number);
                head = s.substring(0, numberStartIndex);
                int numberEndIndex = numberStartIndex + number.length() - 1;
                if (numberEndIndex + 1 > s.length() - 1) {
                    tail = "";
                } else {
                    tail = s.substring(numberEndIndex + 1);
                }
                fileNameList.add(new FileName(head, number, tail));
            }
        } 

        fileNameList.sort(Comparator.comparing(FileName::getHead).thenComparing(Comparator.naturalOrder()));

        String[] answer = new String[files.length];
        for (int i = 0; i < files.length; i++) {
            answer[i] = fileNameList.get(i).toString();
        }
        return answer;
    }

    public static class FileName implements Comparable<FileName> {
        String head;
        String number;
        String tail;

        public FileName(String head, String number, String tail) {
            this.head = head;
            this.number = number;
            this.tail = tail;
        }

        public String getHead() {
            return head.toUpperCase();
        }

        @Override
        public String toString() {
            return head + number + tail;
        }

        @Override
        public int compareTo(FileName o) {
            int mine = Integer.parseInt(this.number);
            int yours = Integer.parseInt(o.number);
            return mine - yours;
        }
    }
}