하루에 한 문제

[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 파일명 정렬 -Java 본문

알고리즘/프로그래머스 lv2 다시풀기

[프로그래머스-lv2 2018 KAKAO BLIND RECRUITMENT] 파일명 정렬 -Java

dkwjdi 2021. 3. 16. 21:24

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

 

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

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

programmers.co.kr

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Solution {
		class Info implements Comparable<Info>{
			String head;
			String number;
			String tail;
			public Info(String head, String number, String tail) {
				this.head = head;
				this.number = number;
				this.tail = tail;
			}
			@Override
			public int compareTo(Info o) {
				if(this.head.toUpperCase().compareTo(o.head.toUpperCase())==0) {
					return Integer.parseInt(this.number)-Integer.parseInt(o.number);
				}
				return this.head.toUpperCase().compareTo(o.head.toUpperCase());
			}
		}
	    public String[] solution(String[] files) {
	       
	        
	        List<Info> info=new ArrayList<>();
	        
	        for(int i=0; i<files.length; i++) {
	        	StringBuilder head= new StringBuilder();
	        	for(int j=0; j<files[i].length(); j++) {
	        		char ch=files[i].charAt(j);
	        		if(Character.isDigit(ch)) {//숫자라면
	        			String numberAndtail=makeNumberAndTail(files[i], j);
	        			String [] nAt=numberAndtail.split(",");
	        			if(nAt.length==1) info.add(new Info(head.toString(),nAt[0],""));
	        			else info.add(new Info(head.toString(),nAt[0],nAt[1]));
	        			break;
	        		}
	        		else head.append(ch); //숫자 아니라면
	        		
	        	}
	        }
	        Collections.sort(info);
	        String[] answer = new String[info.size()];
	        for(int i=0; i<info.size(); i++) {
	        	Info result=info.get(i);
	        	answer[i]=result.head+result.number+result.tail;
	        }
	        return answer;
	    }

		private String makeNumberAndTail(String str, int j) {
			StringBuilder sb= new StringBuilder();
			
			for(int i=j; i<str.length(); i++) {
				char c=str.charAt(i);
				if(Character.isDigit(c)) sb.append(c);
				else {
					if(i==str.length()-1) sb.append(","+"");
					else sb.append(","+str.substring(i));
					return sb.toString();
				}
			}
			sb.append(","+"");
			// TODO Auto-generated method stub
			return sb.toString();
		}
	}

소요시간 : 1시간 12분

 

문제를 똑바로 읽자..

 

TAIL에 공백이 올 수도 있다는 것을 똑바로 안보고 코딩을 해서 많이 해맸습니다.

그리고 정렬할때 이름이 같을 때 확인할 때는 toUpperCase()를 사용해서 비교했는데

밑에 리턴문에서 toUpperCase()를 안써서 이거 찾는다고 시간이 다갔습니다..ㅜ

 

로직을 살펴보면,

 

1. HEAD를 분리한다.

2. NUMBER를 분리한다.

3. 남은 TAIL을 저장한다.

 

그리고 정렬을 해줍니다. 정렬 조건은

1. HEAD순 정렬(대,소문자상관 X)

2. HEAD같다면 NUMBER 정렬 (String으로 받아서 Integer.parseInt로 변환해서 정렬해줍니다)

3. HEAD와 NUMBER 같다면 그대로 

 

끝~

Comments