Geisha 2024. 9. 26. 16:22

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

 

프로그래머스

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

programmers.co.kr

 

// head 먼저 (대소구분 X)
// number 숫자가 될 수 있게 
// tail
// 위의조건해당사항없는 동일순서면 들어온순서 그대로 반환해야함
// 정렬방식을 변경해야한다.

// class Node를 만들고
// 만약 string 완전체하나 
// number 하나 
// tail 하나 이런식으로 하면 어떨까..
    
// comparable 또는 comparator 를 활용해야할듯
// sort를 할때 조건을 여러개 달아주자
// arraylist에 Node를 넣고 정렬을 Collections.sort()해버리는게 나을듯.

import java.util.*;

class Solution {
    class Node {
        String str;
        String head;
        int number;
        String tail;
        
        public String getStr() {
            return str;
        }
        
        public Node(String str) {
            this.str = str;
            String s = str.toUpperCase();
            int start = -1, end = -1;
            boolean find = false;
            
            // 숫자의 시작과 끝 찾기
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if (c >= '0' && c <= '9') {
                    if (!find) {
                        start = i;
                        find = true;
                    }
                    end = i;
                } else if (find) {
                    break;
                }
            }
            
            this.head = str.substring(0, start);
            this.number = Integer.parseInt(str.substring(start, end + 1));
            this.tail = str.substring(end + 1);
        }
    }
    
    public String[] solution(String[] files) {
        List<Node> list = new ArrayList<>();
        
        for (String file : files) {
            list.add(new Node(file));
        }
        
        Collections.sort(list, (n1, n2) -> {
            // head를 대소문자 구분 없이 비교
            int headCompare = n1.head.compareToIgnoreCase(n2.head);
            if (headCompare == 0) {
                // 숫자 비교
                if (n1.number == n2.number) {
                    return 0; // 들어온 순서 유지
                }
                return n1.number - n2.number;
            }
            return headCompare;
        });
        
        return list.stream()
                   .map(Node::getStr)
                   .toArray(String[]::new);
    }
}