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

 

프로그래머스

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

programmers.co.kr

 

푸는데 1시간걸렸습니다.

 

기억해야할점들

-문자열 비교함수 int this.Head.compareTo(other.Head) 새로배운함수입니다.

//만약 값이 양수라면 
//this.HEAD가 더 사전순으로 뒤에있습니다.
//other.HEAD가 더 사전순으로 앞에있습니다.        
if(this.HEAD.toUpperCase().compareTo(other.HEAD.toUpperCase()) > 0){
    return 1;
}

'A' = 65  'Z' = 90 입니다.

this.Head= 'A' , other.Head = 'Z' 라고 가정합니다.

compareTo 함수에 의하여 -25가 나옵니다.

즉, compareTo < 0 이면  this.Head가 문자열 상으로 더 앞에 있다는 뜻입니다.

compareTo == 0 이면 같은 문자입니다.

compareTo > 0 이면 other.Head가 문자열 상으로 더 앞에 있다는 뜻입니다.

 

-문제에서 TAIL 부분은 아무것도 없을 수 있다고 했습니다.

저 같은경우 무조건 TAILStart 부분이 0 일 생각을 못했기에

substring(5, 0); 이런식으로 값이 나와 런타임 에러가 나왔습니다.

TAILStart 가 0 일때와 TailStart가 0이 아닐때를 비교하여 합니다.

    for(int j=0;j<files[i].length();j++){
        if(files[i].charAt(j) >='0' && files[i].charAt(j) <='9'){
            if(NUMBERstart == 0){
                NUMBERstart = j;
            }
        }
        else{
            if(NUMBERstart != 0 && TAILstart == 0){
                TAILstart = j;
            }
        }
    }
    System.out.println(" "+HEADstart+" "+NUMBERstart+" "+TAILstart+ " "+TAILEnd+ " ");

    String HEAD_ = files[i].substring(HEADstart, NUMBERstart);
    String NUMBER_;
    String TAIL_;
    if(TAILstart == 0){
        NUMBER_ = files[i].substring(NUMBERstart, TAILEnd);    
        TAIL_ ="";
    }else{
        NUMBER_ = files[i].substring(NUMBERstart, TAILstart);  
        TAIL_ = files[i].substring(TAILstart, TAILEnd);
    }

    System.out.println(HEAD_+""+NUMBER_+""+TAIL_);
    strArr.add(new Node(HEAD_, NUMBER_, TAIL_));

}

 

세번째, 정렬

MUZI01.zip muzi1.png가 입력으로 들어오면, 정렬 후에도 입력 시 주어진 두 파일의 순서가 바뀌어서는 안 된다.

라는 조건이 있습니다. 그렇기에 compareTo 함수의 정렬 부분에 this_number == other_number return 0 처리를 해줘야만 순서가 바뀌지 않습니다.

if(this_NUMBER < other_NUMBER){
    return -1;
}else if(this_NUMBER == other_NUMBER){
    return 0;
}else{
    return 1;
}

 

 

 

정답코드입니다.

import java.io.*;
import java.util.*;
import java.util.Map.*;
class Solution {
    
    ArrayList<Node> strArr = new ArrayList<Node>();
    public String[] solution(String[] files) {
        String[] answer = {};
        
        for(int i=0;i<files.length;i++){
            int HEADstart = 0;
            int NUMBERstart = 0;
            int TAILstart = 0;
            int TAILEnd = files[i].length();
            
            
            for(int j=0;j<files[i].length();j++){
                if(files[i].charAt(j) >='0' && files[i].charAt(j) <='9'){
                    if(NUMBERstart == 0){
                        NUMBERstart = j;
                    }
                }
                else{
                    if(NUMBERstart != 0 && TAILstart == 0){
                        TAILstart = j;
                    }
                }
            }
            System.out.println(" "+HEADstart+" "+NUMBERstart+" "+TAILstart+ " "+TAILEnd+ " ");
            
            String HEAD_ = files[i].substring(HEADstart, NUMBERstart);
            String NUMBER_;
            String TAIL_;
            if(TAILstart == 0){
                NUMBER_ = files[i].substring(NUMBERstart, TAILEnd);    
                TAIL_ ="";
            }else{
                NUMBER_ = files[i].substring(NUMBERstart, TAILstart);  
                TAIL_ = files[i].substring(TAILstart, TAILEnd);
            }
            
            System.out.println(HEAD_+""+NUMBER_+""+TAIL_);
            strArr.add(new Node(HEAD_, NUMBER_, TAIL_));
            
        }     
        
        Collections.sort(strArr);
        
        answer = new String[strArr.size()];
        for(int i=0;i<strArr.size();i++){
            System.out.print(" "+strArr.get(i).HEAD+" "+strArr.get(i).NUMBER+" "+strArr.get(i).TAIL);
            answer[i] = strArr.get(i).HEAD + strArr.get(i).NUMBER +strArr.get(i).TAIL;
        }
        
        return answer;
    }
}


class Node implements Comparable<Node>{
    String HEAD;
    String NUMBER;
    String TAIL;
    public Node(){
        
    }
    
    //오름차순정렬.
    public int compareTo(Node other){
        int this_NUMBER = Integer.parseInt(this.NUMBER);
        int other_NUMBER = Integer.parseInt(other.NUMBER);
        
        //만약 값이 양수라면 
        //this.HEAD가 더 사전순으로 뒤에있습니다.
        //other.HEAD가 더 사전순으로 앞에있습니다.        
        if(this.HEAD.toUpperCase().compareTo(other.HEAD.toUpperCase()) > 0){
            return 1;
        }else if(this.HEAD.toUpperCase().compareTo(other.HEAD.toUpperCase()) == 0){
            if(this_NUMBER < other_NUMBER){
                return -1;
            }else if(this_NUMBER == other_NUMBER){
                return 0;
            }else if(this_NUMBER > other_NUMBER){
                return 1;
            }
        }else if(this.HEAD.toUpperCase().compareTo(other.HEAD.toUpperCase()) < 0){
            return -1;
        }
        
        return 0;
    }
    
    public Node(String HEAD, String NUMBER, String TAIL){
        this.HEAD = HEAD;
        this.NUMBER = NUMBER;
        this.TAIL = TAIL;
    }
    
    
}

+ Recent posts