|
[제한사항]
- 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
- completion의 길이는 participant의 길이보다 1 작습니다.
- 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
- 참가자 중에는 동명이인이 있을 수 있습니다.
[입출력 예]
추측)
참가자의 for문에서 한명한명 이름 값을 완주자의 for문으로 넣어 비교하는 중첩 for문을 사용하면 될거 같다.
카운트 변수를 둬서 동일 인물이 있다면 카운트를 올리고 없다면 0이 되어 0인 참가자를 출력하면 될 듯 하다.
소스코드)
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
Arrays.sort(participant); // 참가자 명단 정렬
Arrays.sort(completion); // 골인한 사람 명단 정렬
for(int i=0; i<completion.length; i++){ // 골인한 사람 명단을 기준으로 for문을 돌린다
if(!participant[i].equals(completion[i])){ // 앞에서 정렬했기 때문에 같은 인덱스를 비교한다
answer = participant[i]; // 같은 인덱스에 이름이 달라졌다면 동명이인이 발견된 것 답에 넣는다.
break;
}
answer = participant[participant.length - 1]; // if를 거치지 않았다면 하나를 뺀 모든 인덱스가 같다. 마지막 1인 한명이 바로 골인못한 사람이므로 출력
}
return answer;
}
}
리뷰)
추측한 방법으로는 동명이인을 가릴수 없었다. 그래서 다시 생각해봐야했다.
규리님이 정렬을 이용해 푸셨다는 것을 듣고 코드를 작성해봤다.
참가자와 완주자를 같은 방법으로 정렬한다. 그리고 같은 인덱스를 비교하다보면 이름이 안맞는 순간이 온다.
(참고로 배열 길이가 다를때 긴 쪽을 기준으로 동일하게 비교하면 ArrayIndexOutOfBoundsException이 발생한다.)
완주를 실패한 사람이 단 한명인 상황에서 이름이 안맞는 순간이라는 건 동명이인이 있어 같은 인덱스끼리의 이름이 달라진것! 달라진 그때의 참가자의 이름을 출력하면 그 사람이 바로 완주하지 못한 사람이다.
[0] | [1] | [2] | [3] | |
completion | ana | mislav | stanko | |
participant | ana | mislav | mislav | stanko |
또한 배열을 계속 비교하면서 이름이 달라지는 순간을 찾다가 완주자의 배열이 다 끝났다면 완주자 보다 배열 길이가 하나 더 큰 참가자 배열의 마지막 사람이 바로 완주하지 못한 사람이므로 출력한다.
[0] | [1] | [2] | [3] | [4] | |
completion | filipa | josipa | marina | nikola | |
participant | filipa | josipa | marina | nikola | vinko |
+ 제한사항을 정말 잘 이해해야한다 (하나 빼고 보기도 했고 ㅠ 반성합니다 ㅠ)
- completion의 길이는 participant의 길이보다 1 작습니다.
이 부분은 끝까지 골인하지 못한 사람은 단 한명이라는 힌트를 준다.
'Coding Test > Algorithm' 카테고리의 다른 글
Programmers] 자릿수 더하기 (0) | 2022.11.18 |
---|---|
Programmers] 나누어 떨어지는 숫자 배열 (0) | 2022.11.18 |
Programmers] 수박수박수박수박수박수? (0) | 2022.11.18 |
Programmers] 2016년 (0) | 2022.11.18 |
Programmers] 이상한 문자 만들기 (0) | 2022.11.18 |