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;
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[카카오 기출 문제]카카오프렌즈 컬러링북- 레벨 2, BFS (0) | 2022.10.29 |
---|---|
[카카오 기출 문제]튜플 - 레벨 2,구현 + 문자열 (0) | 2022.10.29 |
[카카오 기출 문제] 오픈채팅방 - 레벨 2,구현 + 문자열 (0) | 2022.10.07 |
[카카오 기출 문제] 괄호 변환 - 레벨 2,구현 + 문자열 (0) | 2022.10.05 |
[카카오 기출 문제] 크레인 인형뽑기 - 레벨 1, 구현 (0) | 2022.09.05 |