programmers.co.kr/learn/courses/30/lessons/42576?language=java
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
ArrayList<String> part = new ArrayList<String>(Arrays.asList(participant)); //ArrayList를 사용하기위한 participant의 인수를 가진 part선언
ArrayList<String> comp = new ArrayList<String>(Arrays.asList(completion)); //ArrayList를 사용하기위한 completion 인수를 가진 comp
Collections.sort(part); //part를 오름차순으로 정렬
Collections.sort(comp); //comp를 오름차순으로 정렬
while(true){
if(part.get(0).equals(comp.get(0))){ //만약 part와 comp의 0번째 인덱스 값이 같다면
part.remove(0); //part와 comp의 첫째값 삭제
comp.remove(0);
if(comp.size() == 0){ //삭제를 했는데 comp의 크기가 0이 되었다면 반복 종료
break;
}
} else { //만약 0번째 인덱스 값이 다르다면 반복 종료
break;
}
}
String answer = part.get(0); //part와 comp의 값이 다르다는건 완주하지 못한 사람이라는 뜻
return answer;
}
}
첫번째로 이렇게 작성을 해봤는데 효율성 테스트에서 실패했습니다.
생각해보니 굳이 두개 리스트의 값을 비교를 하는데 하나하나 삭제를 하는 것이 비효율적이게 만드는 것이라 생각했습니다. 그래서 remove를 빼고 비교만 해보았습니다.
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
ArrayList<String> part = new ArrayList<String>(Arrays.asList(participant)); //ArrayList를 사용하기위한 participant의 인수를 가진 part선언
ArrayList<String> comp = new ArrayList<String>(Arrays.asList(completion)); //ArrayList를 사용하기위한 completion 인수를 가진 comp선언
Collections.sort(part); //part를 오름차순으로 정렬
Collections.sort(comp); //comp를 오름차순으로 정렬
int num = 0; //인덱스를 넣어주기 위한 num을 선언
while(true){
if(num == comp.size()){ //num이 comp의 크기와 같아지면 반복을 종료(계속 진행할 경우 comp의 크기를 index가 초과함)
break;
}
if(part.get(num).equals(comp.get(num))){ //part와 comp가 동일한 인덱스를 가질때 값을 비교
num++; //같을 경우 인덱스를 증가
} else { //다를경우 반복을 종료
break;
}
}
String answer = part.get(num); //값이 달라졌을 때의 part의 값이 정답!
return answer;
}
}
이렇게 하니 효율성 테스트에 성공하였습니다. 문제를 풀었습니다.
그런데 이렇게 인덱스로 비교만 할것이라면 굳이 ArrayList를 사용해야 하는건가 생각을 하여 처음에 입력받은 배열 그대로 사용하여 비교를 하면 효율성이 좋아지지 않을까 생각을하여 다시 작업을 해봤습니다.
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
Arrays.sort(participant); //입력받은 participant를 정렬
Arrays.sort(completion); //입력받은 completion 정렬
int num = 0; //인덱스에 사용하기위한 num선언
while(true){
if(num == completion.length){ //만약 num가 completion의 크기를 넘으면 반복종료
break;
}
if(participant[num].equals(completion[num])){ //만약 participant와 completion가 같은 인덱스에 같은 값을 가진다면
num++; //인덱스 증가
} else {
break; //다른값을 가진다면 반복종료
}
}
String answer = participant[num]; //값이 다를경우는 완주를 못한 사람이므로 정답!
return answer;
}
}
이렇게도 물론 문제풀이에 성공하였습니다. 그리고 확실히 코드도 깔끔해진 느낌입니다. 그런데 효율성이 ArrayList를 사용한 것 보다 나빠졌습니다. (시간이 늘어났으니 효율성이 나빠진게 맞..겠죠?)
배열이 더 효율적이라고 알고 있었는데, 이런 결과가 나와서 조금 당황했습니다.
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스] 숫자 문자열과 영단어, 자바 (0) | 2022.12.11 |
---|---|
[프로그래머스] 문자열 압축 파이썬 (0) | 2022.01.01 |
[프로그래머스] 신규 아이디 추천 파이썬 (0) | 2021.12.28 |