본문 바로가기
Programming/Cos Pro 1급

Cos Pro 1급 - 샘플 문제 풀이 3차 1번 (배열의 회전)

by 우공80 2022. 10. 17.
728x90

배열의 회전

문제 지문 #1


정수로 이루어진 두 배열 arrA와 arrB가 주어질 때, arrA를 회전해 arrB로 만들 수 있는지 알아보려 합니다. 배열의 회전이란 모든 원소를 오른쪽으로 한 칸씩 이동시키고, 마지막 원소는 배열의 맨 앞에 넣는 것을 말합니다.

rotation.png

이를 위해 다음과 같이 프로그램 구조를 작성했습니다.

1. arrA와 arrB의 길이가 다르면 false를 return 합니다.
2. 두 배열의 구성 성분이 달라 회전했을 때 같아질 가능성이 없다면 false를 return 합니다.
3. arrA 배열을 두 번 이어 붙여 길이가 2배인 배열로 만듭니다.
4. arrA의 부분 배열 중 arrB와 같은 배열이 있으면 true를, 그렇지 않으면 false를 return 합니다.

두 배열 arrA와 arrB가 매개변수로 주어질 때, arrA를 회전해 arrB로 만들 수 있으면 true를, 그렇지 않으면 false를 return 하도록 solution 메소드를 작성하려 합니다. 위 구조를 참고하여 코드가 올바르게 동작할 수 있도록 빈칸에 주어진 func_a, func_b, func_c 메소드와 매개변수를 알맞게 채워주세요.


매개변수 설명

두 배열 arrA와 arrB가 solution 메소드의 매개변수로 주어집니다.

  • arrA의 길이는 1 이상 1,000 이하입니다.
  • arrA의 원소는 0 이상 1,000 이하의 정수입니다.
  • arrB의 길이는 1 이상 1,000 이하입니다.
  • arrB의 원소는 0 이상 1,000 이하의 정수입니다.

return 값 설명

arrA를 회전해 arrB로 만들 수 있으면 true를, 그렇지 않으면 false를 return 해주세요.


예시

arrA arrB return
[1, 2, 3, 4] [3, 4, 1, 2] true
[1, 2, 3, 4] [1, 4, 2, 3] false


예시 설명

예시 #1
arrA 배열을 오른쪽으로 2칸 회전하면 arrB와 같아집니다.

예시 #2
arrA 배열은 회전해도 arrB와 같아질 수 없습니다.

 

혼자 풀이


빈칸 채우기 문제입니다. 문제에 답이 나와있는 것이나 마찬가지여서 문제를 맞추는 것 자체는 어렵지 않았습니다.
그런데, func_b, func_c 함수 이해가 어렵네요. 문제는 풀어놓고, 이 함수를 이해하느라 끙끙대었습니다.
결론부터 말하면, 차근차근히 배열에 접근하는 것을 생각하면 또 어렵지 않게 풀 수 있는 문제였습니다.
함수에 대한 이해는 아래 주석으로 달았습니다.

/*=======================================
    3차 1번  배열을 회전 시키기
 ========================================*/

class Solution {
	//arrA 배열을 두번 이어붙여 길이가 2배인 배열로 만듭니다.
    int[] func_a(int[] arr) {
        int length = arr.length;
        int[] ret = new int[length*2];
        for(int i = 0; i < length; i++)
        	//arr[i]를 ret[i]에 넣고,ret[i+length]에 넣어 같은 배열 두개를 이어붙인 배열이 된다.
            ret[i + length] = ret[i] = arr[i]; 
        return ret;
    }
    
    //두 배열의 구성 성분이 달라 회전했을 때 같아질 가능성이 없다면, false를 return합니다.
    boolean func_b(int[] first, int[] second){
        int[] counter = new int[1001]; //counter 배열의 인덱스는 first 배열의 원소의 값을 의미함(0~1000)
        for(int i = 0; i < first.length; i++){ //counter의 각 원소는 first의 원소의 갯수를 의미함
            counter[first[i]]++;    //first의 원소에 대해서는 개수를 증가
            counter[second[i]]--;   //second의 원소에 대해서는 개수를 감소
        }
        for(int i = 0; i < 1001; i++)
            if(counter[i] != 0)      //first와 second의 구성 성분이 같다면, counter의 원소는 전부 0이어야 함 
                return false;        //0이 아닌 경우에는 구성성분이 다른 것임
        return true;
    }
    //arrA의 부분 배열 중 arrB와 같은 배열이 있으면 true를, 그렇지 않으면 false를 return합니다.    
    boolean func_c(int[] first, int[] second){
    int length = second.length;
    for(int i = 0; i < length; i++){     //first의 i 자리부터
        int j;
        for(j = 0; j < length; j++)       //second의 j와 비교
            if(first[i + j] != second[j])   //second[j]와 다른 것이 있으면  break 
                break;
        if(j == length)     //break 없이 끝나면 true 반환
            return true;     
    }
    return false;
   }

    public boolean solution(int[] arrA, int[] arrB) {
        if(arrA.length != arrB.length)
            return false;
//        if(func_@@@(@@@)) {
//            int[] arrAtemp = func_@@@(@@@);
//            if(func_@@@(@@@))
//                return true;
//        }
        if(func_b(arrA,arrB)) {                  //수정한 부분
            int[] arrAtemp = func_a(arrA);
            if(func_c(arrAtemp,arrB))
                return true;
        }
        return false;
    }

    // 아래는 테스트케이스 출력을 해보기 위한 main 메소드입니다.
    public static void main(String[] args) {
        Solution sol = new Solution();
        int[] arrA1 = {1, 2, 3, 4};
        int[] arrB1 = {3, 4, 1, 2};
        boolean ret1 = sol.solution(arrA1, arrB1);

        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        System.out.println("solution 메소드의 반환 값은 " + ret1 + " 입니다.");

        int[] arrA2 = {1, 2, 3, 4};
        int[] arrB2 = {1, 4, 2, 3};
        boolean ret2 = sol.solution(arrA2, arrB2);

        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        System.out.println("solution 메소드의 반환 값은 " + ret2 + " 입니다.");
    }
}

 

정답


혼자 풀이와 정답이 같습니다.

첨부 파일


프로젝트 파일 전체를 첨부합니다.

Solution 이 문제, CorrectSolution 이 정답, MySolution이 제가 푼 것입니다.
"Project from existing sources..." 메뉴에서 불러다 쓰시면 됩니다.

ThirdQuestion1.zip
0.01MB

출처: https://www.ybmit.com/cos_pro/cos_pro_r_test.jsp

728x90

댓글