[프로그래머스] 파일명 정렬 (JAVA)

개츠비·2023년 3월 18일
0

프로그래머스

목록 보기
10/16
post-custom-banner
  1. 소요시간 : 25분
  2. 문제 사이트 : 프로그래머스
  3. 문제 수준 : 레벨 2
  4. 문제 유형 : 정렬
  5. 다른 사람의 풀이를 참고 했는가 ? : X
  6. 한 번 풀었다가 다시 푸는 문제인가 ? : X
  7. 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/17686#
  8. 푼 날짜 : 2023.03.19

1. 사용한 자료구조 & 알고리즘

정렬을 사용했다.

2. 사고과정

사실 문제에 있는 그대로를 구현하면 됐다. 예제 테스트케이스에 있는 것 중에서 예외가 있을까 생각해봤지만 딱히 예외는 없을 것 같아서 바로 구현했다.

3. 풀이과정

문제에 쓰여진 그대로를 구현했다.
1. 처음으로 숫자로 시작하는 index 를 찾는다. 그 이전 인덱스 까지가 head.
2. 그 후 그 다음 문자부터 처음으로 0~9로 시작하지 않는 index를 찾는다. 그 이전 index 까지가 number. 여기서 010 이 나올 수 있으므로 String 형의 "010" 을 int 의 10 으로 형변환
3. 그리고 head 를 대문자로 바꿔준다. toUpperCase() 메소드 사용
4. 이제 정렬한다. 첫번째로는 head 를, 두번째로는 number 를, 마지막으로는 등장한 순서를 기준으로 정렬한다.
5. 정렬한 결과를 result 배열에 넘겨준다.

4. 소스코드

import java.util.*;
class Word{
    String head;
    int number;
    String before;
    int order;
    Word(String head,int number,String before,int order){
        this.head=head;
        this.number=number;
        this.before=before;
        this.order=order;
    }
}
class Solution {
    public String[] solution(String[] files) {
        Word word[]=new Word[files.length];
        for(int i=0;i<files.length;i++){
            String before=files[i];
            int index=0;
            for(int j=0;j<files[i].length();j++){
                if(files[i].charAt(j)>='0'&&files[i].charAt(j)<='9'){
                    index=j;
                    break;
                }
            }
            String head=files[i].substring(0,index);
            files[i]=files[i].substring(index,files[i].length());
            index=files[i].length();
            
            for(int j=0;j<files[i].length();j++){
                if(!(files[i].charAt(j)>='0'&&files[i].charAt(j)<='9')){
                    index=j;
                    break;
                }
            }
            head=head.toUpperCase();
            String num=files[i].substring(0,index);
            int number=Integer.parseInt(num);       
            word[i]=new Word(head,number,before,i);
            
        }
        Arrays.sort(word,new Comparator<>(){
            @Override
            public int compare(Word w1,Word w2){
                if(w1.head.compareTo(w2.head)>0){
                    return 1;
                }
                else if(w1.head.compareTo(w2.head)==0){
                    if(w1.number>w2.number)
                        return 1;
                    else if(w1.number==w2.number){
                        if(w1.order>w2.order)
                           return 1;
                    }
                   
                }
                return -1;
            }
        });
        
        String answer[]=new String[files.length];
        for(int i=0;i<answer.length;i++){
            answer[i]=word[i].before;
        }
  
 
        return answer;
    }
}

5. 결과

6. 회고

크게 어렵지 않았다. 하지만 난이도에 비해서 꽤 시간이 많이 걸렸다. 중간중간 어떤 예외가 있을까 생각하느라 오래 걸린 것 같다. 그리고 테스트케이스 예제가 정확히 주어지지 않아서 좀 헷갈렸던 부분도 있다

하루에 백준 1문제 이상 푸는 것을 목표로 하고있다.
https://solved.ac/profile/anwlro0212

profile
아이스 카라멜 마끼아또보단 뜨거운 아메리카노를, 맨투맨보단 니트를, 웹툰보단 책을 좋아하고 싶은 사람
post-custom-banner

0개의 댓글