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 |