문제 지문 #1
정수로 이루어진 두 배열 arrA와 arrB가 주어질 때, arrA를 회전해 arrB로 만들 수 있는지 알아보려 합니다. 배열의 회전이란 모든 원소를 오른쪽으로 한 칸씩 이동시키고, 마지막 원소는 배열의 맨 앞에 넣는 것을 말합니다.
이를 위해 다음과 같이 프로그램 구조를 작성했습니다.
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..." 메뉴에서 불러다 쓰시면 됩니다.
'Programming > Cos Pro 1급' 카테고리의 다른 글
Cos Pro 1급 - 샘플 문제 풀이 3차 3번 (ArrayList 활용) (0) | 2022.10.18 |
---|---|
Cos Pro 1급 - 샘플 문제 풀이 3차 2번 (팰린드롬 문자열 찾기) (2) | 2022.10.17 |
Cos Pro 1급 - 샘플 문제 풀이 2차 10번 (charAt() 활용하기) (0) | 2022.10.16 |
Cos Pro 1급 - 샘플 문제 풀이 2차 9번 (문자열 비교) (0) | 2022.10.16 |
Cos Pro 1급 - 샘플 문제 풀이 2차 8번 (배열의 탐색) (0) | 2022.10.15 |
댓글