Hayden's Archive
[알고리즘] 프로그래머스 : 완주하지 못한 선수 본문
알고리즘 문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/42576
내가 작성한 코드
처음에는 방법이 생각나지 않아서 0부터 돌리고 서로 일치하는 경우가 생겼을 때 participant 배열의 값을 서로 교환하여 일치하는 값들을 앞으로 차곡차곡 보내는 식으로 로직을 짰다. 이렇게 되면 participant 배열에서 가장 최후로 남는 마지막값이 정답이 되게 된다.
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
String temp = "";
for(int i = 0; i < completion.length; i++){
for(int j = i; j < participant.length; j++){
if(completion[i].equals(participant[j])){
temp = participant[j];
participant[j] = participant[i];
participant[i] = temp;
break;
}
}
}
answer = participant[participant.length-1];
return answer;
}
}
그러나 당연스럽게도 정확성은 통과했으나 효율성에서 통과하지 못했다.
Arrays 클래스의 sort() 메소드를 활용하여 코드를 다시 짰다. 돌리기 전에 먼저 participant 배열과 completion 배열을 알파벳 순으로 먼저 정렬하고 들어가는 것이다. 그렇게 되면 0부터 completion의 끝번까지 비교했을 때 일치하지 않는 부분이 생기면 그 인덱스의 participant 값을 뽑아내면 된다. 만일 전부 다 일치했다면 participant의 마지막값이 정답이 될 것이다.
import java.util.Arrays;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
boolean check = false;
Arrays.sort(participant);
Arrays.sort(completion);
for(int i = 0; i < completion.length; i++){
if(!participant[i].equals(completion[i])){
answer = participant[i];
check = true;
break;
}
}
if(check == false) answer = participant[participant.length-1];
return answer;
}
}
통과하고 다른 사람들의 풀이를 살펴봤는데 내 코드와 거의 흡사하지만 for문에 쓰일 i를 for문 밖에서 선언한 코드가 있었다.
이렇게 코드를 짜면 i가 로컬변수가 아닌 필드가 되어 살아남게 되는데 모든 값이 다 일치하고 participant의 마지막값이 정답일 경우 유용하게 쓸 수 있다. i는 completion.length가 되어 반복문에서 튕겨져 나오는데 그렇게 되더라도 i에는 completion.length가 저장되었고 participant[i]를 리턴시키면 된다.
간단한 차이지만 더 효율적이라고 판단된다.
int i;
for (i=0; i<completion.length; i++){
if (!participant[i].equals(completion[i])){
return participant[i];
}
}
return participant[i];