본문 바로가기
Algorithm

[Algorithm] 가장 점수가 높은 사람을 리턴 하라

by dev_Step 2022. 6. 2.

프로그래머스[초급] 

1번 학생 : 1,2,3,4,5, ---- 쭉 반복
2번 학생 : 2,1,2,3,2,4,2,5  ---- 쭉 반복
3번 학생 : 3,3,1,1,2,2,4,4,5,5  ---- 쭉 반복

되며 정답 배열 answers[] 가 주어질때 

1,2,3번 학생중 가장 많이 맞은 학생을 리턴하라, 만약 동일한 점수의 사람이 있다면 학생 순번이 빠른 순서대로 리턴하라

 

 

여태까지 풀면서 가장 오래 걸린 알고리즘 문제였다.

 

풀이를 설명하자면

1.우선 반복 되는 패턴을 조사하여 1번,2번,3번 학생의 리턴을 배열로 하여 2차원 배열을 선언하여

넣어주었다.

2. 향상된for문을 통해서 arr[]을 꺼내서 answers[] 배열과 정답이 같은지 확인하여 check 변수를 통해서

맞은 갯수를 파악하였고, answers의 문제 갯수가 10,000개 까지 가능하므로 arr의 배열값을 0 ~ arr.length-1  까지 계속반복 해야 했으므로,  num % arr.length 일떄 다시 num=0으로 변경해주었다. 또한 arr[] 이 한번 끝나고 나면 다시 새로운

arr[]이 오므로 향상된 for문이 1회씩 끝날떄 마다도 num=0으로 초기화 및 answer 배열에 맞은횟수를 넣어주었다.

 

3.answer[] 배열에 맞은 획수가 들어가면 1차원 배열에 요소가 3개인 배열이 되는데 이 것을 통해서

가장 많이 맞은 학생을 찾아서 해당 학생을 리턴해주어야 했다 

 

4. 맞은횟수 배열 arr[] 을 통해서  요소값 (0번 1번)(0번 2번)(1번 2번) 비교하여 큰쪽이나 작은쪽을 0으로 변경 하여 

만약 획수가 { 3, 1, 2} 일경우는  {3, 0, 0} 이되고,  { 4, 4, 2} 일경우는  {4, 4, 0} 이된다. 즉 작은 수를 0으로 치환 하였다.

 

5. 이렇게 작은 수를 0으로 변경한 배열을 가지고 해당 배열에서 0이 아닌 요소 갯수를 구하여 리턴해줄 배열 result[] 의 크기를 구했고, 0이 아닐때의 index 값을 String으로 받아서 for문을 통해서 charAt과 valueOf 를 통해서 문자를 숫자로 바꿔서 배열로 추가하여 리턴해 주었다.

 

6.일단 내가 풀이한 방법으로는 코드를 돌리면 평균 0ms 가 소요 된다.

 

 

============================================================================================

문제를 풀면서 어려웠던 부분은..

회수를 배열로 만드는 것, 큰수를 찾아서 작은수를 0 으로 변경하는 것까지는 좋았는데 

배열에서 0이 아닌 갯수를 파악하여 새로운 배열을 만들고, 0이 아니였던 index를 찾아서 리턴해주는게 어려웠다.

 

좀더 나은 방법을 찾으려다 차선책인  for문을 돌려소 0이 아닌 값을 찾아서 갯수를 늘려주고, 해당 인덱스를 문자열로 받아서 해당 값을 쪼개서 넣어주는 방법,..을 이용했다.

 

다른 사람의 방법을 통해 내 코드를 더 간결하게 수정해 보자

>> 아래 부분을 더 간결하게 표현 할 수 있었다.

>> 원래는 num이라는 인스턴스 별수를 선언하여 arr[num]을 넣어줘서 {1,2,3,4,5}를 반복하게 했는데

>> 증가하는 i 값에서 arr.length 로 나눈 나머지를 이용하면 0,1,2,3,4 를 계속 반복해서 사용할 수 있었다

또한 

>> check를 선언해서 일치하는 숫자를 증가 시켜준후에 answer 배열에 넣어줬는데 

>> arr[] 요소 가 총 3개 있는데 이를 구분하기 위해서 step을 선언하고

>>  answer[step]++ 을 통해서 첫번째 arr[] 일때 step이 0 으로 바로 ++ 증가 할 수 있도록 조치 해줬다.     

 

 

최대값 구하는 방법으론

Math.max라는 메서드를 사용하는 방법과, for문을 통해서 temp에 최대값을 계쏙 넣어줘서 다음요소와 계속 비교하는 방법이 있었다.

 

>> 아래의 방법이 내가 구현하고자 하는 방법과 가장 유사한것 같다.

1.우선 리턴할 배열의 크기를 구하기 위해서  arr에서 최대 값을 가진 배열의 요소 갯수를 파악하고 해당 크기로

리턴할 배열을 만들어준다 result[]

 

2. 그리고 arr[] 을 돌면서 arr의 요소가 temp 즉 최대값과 동일할때 해당 요소의 index를 +1 하여 result[num]에 넣어 준다

이떄 num의 경우는 0부터 넣어줘야 하므로 인스턴스 변수 num을 하나 선언해줘야 한다. 

 

 

** 이문제의 키워드를 최대값이 였던 것 같다. 따로 최대값을 구해놓은 다음에 사용하니 코드도 도 간결해지고 가독성이 좋아 진것 같다. 문제를 해결할때 어떤게 키워드가 되는지도 생각해봐야 겠다.

'Algorithm' 카테고리의 다른 글

[Algorithm] 포켓몬 고르기  (0) 2022.06.04
[Algorithm] 체육복  (0) 2022.06.03
[Algorithm] K번째 숫자  (0) 2022.06.01
[Algorithm] 완주하지 못한 선수  (0) 2022.05.31
[Algorithm/Lamda] 함수형 인터페이스  (0) 2022.05.28