[프로그래머스]Lv2. 파일명 정렬 (Java)

2023. 6. 29. 14:37·Algorithms(CT)/Programmers

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

 

프로그래머스

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

programmers.co.kr

문제 설명

버전 번호 외에도 숫자가 포함된 파일 목록은 여러 면에서 관리하기 불편했다. 예컨대 파일 목록이 ["img12.png", "img10.png", "img2.png", "img1.png"] 일 경우, 일반적인 정렬은 ["img1.png", "img10.png", "img12.png", "img2.png"] 순이 되지만, 숫자 순으로 정렬된 ["img1.png", "img2.png", "img10.png", img12.png"] 순이 훨씬 자연스럽다.

무지는 단순한 문자 코드 순이 아닌, 파일명에 포함된 숫자를 반영한 정렬 기능을 저장소 관리 프로그램에 구현하기로 했다.

소스 파일 저장소에 저장된 파일명은 100 글자 이내로, 영문 대소문자, 숫자, 공백(" "), 마침표("."), 빼기 부호("-")만으로 이루어져 있다. 파일명은 영문자로 시작하며, 숫자를 하나 이상 포함하고 있다.

파일명은 크게 HEAD, NUMBER, TAIL의 세 부분으로 구성된다.

  • HEAD는 숫자가 아닌 문자로 이루어져 있으며, 최소한 한 글자 이상이다.
  • NUMBER는 한 글자에서 최대 다섯 글자 사이의 연속된 숫자로 이루어져 있으며, 앞쪽에 0이 올 수 있다. 0부터 99999 사이의 숫자로, 00000이나 0101 등도 가능하다.
  • TAIL은 그 나머지 부분으로, 여기에는 숫자가 다시 나타날 수도 있으며, 아무 글자도 없을 수 있다.

파일명을 세 부분으로 나눈 후, 다음 기준에 따라 파일명을 정렬한다.

  • 파일명은 우선 HEAD 부분을 기준으로 사전 순으로 정렬한다. 이때, 문자열 비교 시 대소문자 구분을 하지 않는다. MUZI와 muzi, MuZi는 정렬 시에 같은 순서로 취급된다.
  • 파일명의 HEAD 부분이 대소문자 차이 외에는 같을 경우, NUMBER의 숫자 순으로 정렬한다. 9 < 10 < 0011 < 012 < 13 < 014 순으로 정렬된다. 숫자 앞의 0은 무시되며, 012와 12는 정렬 시에 같은 같은 값으로 처리된다.
  • 두 파일의 HEAD 부분과, NUMBER의 숫자도 같을 경우, 원래 입력에 주어진 순서를 유지한다. MUZI01.zip과 muzi1.png가 입력으로 들어오면, 정렬 후에도 입력 시 주어진 두 파일의 순서가 바뀌어서는 안 된다.

무지를 도와 파일명 정렬 프로그램을 구현하라.


💡 아이디어

  • files의 문자열을 하나씩 가져와 HEAD, NUMBER, TAIL 부분을 나눠줍니다.
  • 배열을 HEAD > NUMBER > TAIL 순의 기준으로 정렬해서 이를 answer배열에 넣어 return 합니다.

 

📃 풀이과정

1. files를 하나씩 받아와서 처음 숫자가 나오는 number index를 저장하고, 숫자 이후에 문자가 나오기 시작하는 index를 tail index를 저장하고, 문자열을 number index와 tail index를 기준으로 3개의 문자열로 나눠줍니다.

2. 정렬 기준에 맞춰 HEADER를 대소문자 상관없이 문자 순으로 정렬합니다.

3. 만약 HEADER가 같다면 NUMBER를 숫자 순으로 정렬합니다.

4. 정렬된  files들을 answer배열에 넣어서 최종 출력합니다.

 

전체 코드

import java.util.*;
class Solution {
    public String[] solution(String[] files) {
        String[] answer = {};
        
        /* files를 HEAD, NUMBER, TAIL 부분으로 나눈다 */
        String[][] files_split = new String[files.length][3];// HEAD, NUMBER, TAIL   
        for(int i=0;i<files.length;i++){
            
            int numIdx=-1;
            int tailIdx=-1;
            for(int j=0;j<files[i].length();j++){
                //숫자가 처음 나타나는 인덱스 찾기
                if(files[i].charAt(j)>='0' && files[i].charAt(j)<='9' && numIdx==-1){
                    numIdx=j;
                }
                //숫자 인덱스를 찾은 후, tail 처음 시작 인덱스 찾기
                if(numIdx>-1 && (files[i].charAt(j)<'0' || files[i].charAt(j)>'9')){
                    tailIdx=j;break;
                }
            }
            
            // HEAD, NUMBER, TAIL로 나눈다
            files_split[i][0]=files[i].substring(0,numIdx);// HEAD
            
            if(tailIdx==-1) files_split[i][1]=files[i].substring(numIdx,files[i].length()); //NUMBER
            else files_split[i][1]=files[i].substring(numIdx,tailIdx);
            
            if(tailIdx!=-1) files_split[i][2]=files[i].substring(tailIdx,files[i].length());
            
            //System.out.println(files_split[i][0]+" "+files_split[i][1]+" "+files_split[i][2]);
        }
        //배열 정렬
        Arrays.sort(files_split, new Comparator<String[]>(){
            public int compare(String[] a, String[] b){
                if(!a[0].equalsIgnoreCase(b[0])){//대소문자 상관없이 비교
                    return a[0].compareToIgnoreCase(b[0]);
                    
                }else
                    return Integer.parseInt(a[1])-Integer.parseInt(b[1]);     
            }
        });
        
        answer = new String[files.length];
        for(int i=0;i<files.length;i++){
            if(files_split[i][2]==null)
                answer[i]=files_split[i][0] + files_split[i][1];
            else
                answer[i]= files_split[i][0] + files_split[i][1] + files_split[i][2];
        }
        
        return answer;
    }
}

'Algorithms(CT) > Programmers' 카테고리의 다른 글

[프로그래머스] Lv.2 2개 이하로 다른 비트 (Java)  (1) 2023.07.04
[프로그래머스] Lv.2 뒤에 있는 큰 수 찾기 (Java)  (0) 2023.07.01
[프로그래머스] Lv.2 스킬트리  (0) 2023.06.29
[프로그래머스] Lv.2 방문 길이 (Java)  (0) 2023.06.29
[프로그래머스] Lv.2 땅따먹기 (Java)  (0) 2023.06.29
'Algorithms(CT)/Programmers' 카테고리의 다른 글
  • [프로그래머스] Lv.2 2개 이하로 다른 비트 (Java)
  • [프로그래머스] Lv.2 뒤에 있는 큰 수 찾기 (Java)
  • [프로그래머스] Lv.2 스킬트리
  • [프로그래머스] Lv.2 방문 길이 (Java)
gwee_99
gwee_99
bE bETTER!
  • gwee_99
    얼렁이와 뚱땅이
    gwee_99
  • 전체
    오늘
    어제
    • ====Category====
      • Algorithms(CT)
        • Programmers
        • Baekjoon
        • Goorm
      • Web
        • Error 해결
      • BackEnd
        • Spring
        • JPA
      • FrontEnd
        • HTML.CSS
        • JavaScript
      • Language
        • Java
      • Cloud
      • CSTS
      • Books
        • IT 5분 잡학사전
      • 일상
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    LV.2
    IT 5분 잡학사전
    lv2
    코딩테스트
    구름톤 챌린지
    구름
    인프런
    호텔 대실
    Til
    Greedy
    LV.3
    따라하며 배우는 html css
    그리디
    BOJ
    개발자북클럽
    java
    스택
    DP
    Lv.1
    제대로 파는 자바스크립트
    프로그래머스
    IT 잡학사전
    노마드코더
    백준
    lv.4
    DFS
    BFS
    자바
    존안님
    HTML
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gwee_99
[프로그래머스]Lv2. 파일명 정렬 (Java)
상단으로

티스토리툴바