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