프로그래머스 모의테스트 문제

두개의 배열 arrA, arrB를 받아서 

arrA를 회전시켜 arrB를 만들 수 있으면 true 아니면 false 리턴하는 함수 만들기!


[문제]

* 배열의 회전이란 모든 원소를 오른쪽으로 한 칸씩 이동시키고, 마지막 원소는 배열의 맨 앞에 넣는 것을 말합니다.

* 두 배열 arrA와 arrB가 매개변수로 주어질 때, arrA를 회전해 arrB로 만들 수 있으면 true를, 그렇지 않으면 false를 return 하는 solution 함수를 작성해주세요.


[제한 조건]

arrA는 길이가 1 이상 1,500 이하인 배열입니다.

arrA의 원소는 0 이상 1,500 이하인 정수입니다.

arrB는 길이가 1 이상 1,500 이하인 배열입니다

arrB의 원소는 0 이상 1,500 이하인 정수입니다.



[문제풀이]

제가 생각한 솔루션은 다음과 같습니다.

ArrayList 이용하기!

사실, Queue를 이용해도 상관 없겠지만 이런 문제의 경우 전 ArrayList가 편해서 이걸로 풀었습니다.

1. ArrayList a를 만들어서 a에 arrA 배열을 넣는다.

2. confirm 메서드를 만든다.

2-1) a.size()와 arrB 배열 크기가 다르면 false return

2-2) a의 원소 와 arrB의 원소를 하나씩 비교해서 같으면 ture 아니면 false 리턴

3. ArrayList a를 순환시켜 arrB를 만들 수 있는지 확인한다.

confirm메서드에 a와 arrB를 던져서 answer값 받기


이것을 코드로 옮기기!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class mock_test01 {
    //confirm 메서드 선언
    public static boolean confirm(ArrayList<Integer> a,int[] arrB) {
        boolean answer = true;
        //배열 크기가 다르면 false
        if(a.size() != arrB.length){
            answer = false;
            return answer;
        }
 
        //배열 원소 하나씩 비교하기
        else 
            for(int i=0; i<arrB.length; i++) {
                //if(!a.get(i).equals(arr2[i])) {
                //System.out.println("a.get = "+a.get(i) + " arr2 = "+arrB[i]);
                if(!a.get(i).equals(arrB[i])) {
                    answer = false;
                    break;
                }
            }
            return answer;
        
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        int[] arrA = {1,2,3,4,5,6}; //4,1,2,3 -> 3,4,1,2 -> 2,3,4,1 -> 1,2,3,4
        int[] arrB = {6,1,2,3,4,5};
        int temp = arrA[arrA.length-1]; //arrA의 마지막 값
        boolean answer = false;
        ArrayList<Integer> a = new ArrayList<Integer>();
 
        //ArrayList a에 arrA 원소 넣기
        for(int i=0; i<arrA.length; i++) {
            a.add(arrA[i]);
        }
        
        //arrA 순환시키기
        for(int j=0; j<arrA.length; j++) {
             a.add(0,temp);             //배열 맨 마지막 값을 맨 앞으로 삽입
             a.remove(arrA.length);     //맨 마지막값은 삭제
             //System.out.println(a);
             
             //만들 수 있으면 break
             if(confirm(a,arrB)) {  //순환된 ArrayList a로 arrB를 만들 수 있는지 확인
                 answer = true;
                 break;
             }
             //순환 후 맨 마지막값 다시 temp에 넣기
             temp = a.get(arrA.length-1);
        }
        
         System.out.println(answer);
    }
}
cs


효율성 검사가 없어서 통과 되긴했네요

지금은 무식하게 풀고있긴 하지만 계속 연습하다보면 더 좋은 방법들을 찾을 수 있을것 같습니다.


/* 2019 - 01 - 31 수정 */

풀이 확인하니 배열 자체를 순환시키면 됬는데, 저는 왜  위의 풀이처럼 저렇게 풀었는지 이해가 안가는군여...

역시 모르면 피곤해지나봅니다 ㅠㅠ

덕분에 Arrays.equals(arrA,arrB)처럼 간단하게 자바에서 배열 원소를 비교해주는 클래스를 지원해준다는 것을 하나 배워가네요 ㅋㅋ


수정된 풀이 입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class mock_test01 {
    
    public static boolean circulation(int[] arrA,int[] arrB) {
        
        int first;
        boolean answer = false;
        
        for(int j =0; j<arrA.length; j++) {
            //배열 순회하기 
            first = arrA[0];
            //한바퀴 돌때까지 순회
          for(int i=0; i<arrA.length-1; i++) {
                arrA[i] = arrA[i+1];
            }
            arrA[arrA.length-1= first;
            //arrA랑 arrB랑 같아지면 break
            if(Arrays.equals(arrA, arrB)) {
                answer = true;
                break;
            }
        }
        return answer;
    }
    
    
    public static void main(String[] args) {
        int[] arrA = {1,2,3,4,5,6}; //4,1,2,3 -> 3,4,1,2 -> 2,3,4,1 -> 1,2,3,4
        int[] arrB = {1,2,3,4,5,6};
        boolean answer = false;
    
        System.out.println(circulation(arrA,arrB));
        
    }
cs


공부합시다!!!


'알고리즘 공부 > 알고리즘 문제' 카테고리의 다른 글

문자열 내 맘대로 정렬하기  (0) 2019.03.12
빙고 개수 카운트하기  (0) 2019.01.31
도로에 가로등 전구 달기  (0) 2019.01.26
숫자를 한글로 읽기  (0) 2019.01.06
완주하지 못한 선수  (0) 2018.12.10

+ Recent posts