[Programmers] 모의고사(Java) -배열복사(Arrays.copyOfRange)


해결 방법

수포자들이 문제를 찍는 규칙이 반복적이기 때문에 배열에 각 수포자들의 규칙을 담고 반복문을 활용하여 답과 일치하는지 확인했다. 그리고 수포자들이 맞힌 문제의 개수를 순서대로 answer배열에 담고 거기서 max값을 구했다. 그리고 그 max값과 다시 answer배열의 요소들을 비교해서 같은 것들만 result배열에 순서대로 넣엇다. 리턴할때는 result배열의 크기가 3으로 정해져있고 빈 곳은 0으로 초기화되어 있기때문에 이런 필요없는 것들을 잘라내기 위해 Arrays.copyOfRange를 사용했다.

수포자들이 맞은 문제의 개수를 세는건 괜찮은것 같은데 max값을 구하는것부터 뭔가 더 효율적인 방법이 없나 싶었다. 다른사람들이 작성한 코드를 봤는데 max값을 Math.max메서드를 이용하는 것 외에는 거의 비슷했다.

import java.util.*;

class Solution {
    public int[] solution(int[] answers) {
        int[] answer= new int[3] ; //수포자들의 맞은 답 개수 저장
        int max=0; //맞은 최대 개수 저장
        int result[] = new int[3]; //제일 많이 맞은 사람 저장
        
        //수포자1
        int wrong_ans1[] = {1,2,3,4,5}; //수포자1의 규칙
        int idx1=0;
        for (int i=0;i<answers.length;i++) {
            if (idx1==5)
                idx1=0;
            if(answers[i]==wrong_ans1[idx1]) //답 맞음
                answer[0]++; //맞은개수 플러스
            idx1++; //인덱스 플러스
        }
    
        //수포자2
        int wrong_ans2[] ={2,1,2,3,2,4,2,5};
        int idx2 = 0;
       
        for (int i=0;i<answers.length;i++) {
            if (idx2==8) 
                idx2=0;
            if (wrong_ans2[idx2]==answers[i])
                answer[1]++;
            idx2++;
        }
        
        //수포자3
        int wrong_ans3[] = {3,3,1,1,2,2,4,4,5,5};
    
        int idx3=0;
        for (int i=0;i<answers.length;i++) {
            if(idx3==10) {
                idx3=0;
            }
            
            if (answers[i]==wrong_ans3[idx3]) {
                answer[2]++;
            }
            idx3++;
           
        }
       
        
        for (int i=0;i<3;i++) {
            if (max<answer[i]) {
                max=answer[i];
            }
        } //맞은 최대개수 구하기
        
        int idx=0;
        for (int i=0;i<answer.length;i++) {
            if(max==answer[i]) { 
                result[idx]=i+1;
                idx++;
            }
        } //맞은 개수가 제일많은 사람을 배열에 담기
        
        return Arrays.copyOfRange(result,0,idx);
    }
}

새로 배운 것

배열 복사하기

배열의 필요없는 부분을 자르려고 Arrays.copyOfRange에 대해 찾아보았다. 이 메서드는 복사할 배열의 인덱스를 직접 지정할 수 있다.

Arrays.copyOfRange(arr,start,end)
arr : 복사할 배열
start : 복사를 시작할 인덱스
end : 복사가 끝날 인덱스

  • 특정 범위가 아니라 배열의 첫부분부터 복사하려면
    Arrays.copyOf(arr,length)메서드를 사용할 수도 있다.

  • 가장 보편적인 배열복사(인덱스 지정X) 방법은 arr.clone()이다.

  • 배열을 특정위치에 복사해오고 싶다면 System.arraycopy(a,a_start_idx,b,b_start_idx,length)를 사용한다.
    a : 복사할 배열
    b : 붙여넣을 배열

예시 참고 :
https://velog.io/@kekim20/JAVA-%EB%B0%B0%EC%97%B4%EB%B3%B5%EC%82%AC-System.arraycopy%EC%99%80-%EC%96%95%EC%9D%80-%EB%B3%B5%EC%82%ACshallow-copy%EA%B9%8A%EC%9D%80-%EB%B3%B5%EC%82%ACdeep-copy

  • 그 외 이중for문을 이용해서 배열을 복사할 수도 있다.

좋은 웹페이지 즐겨찾기