프로그래머스 모의테스트 문제
두개의 배열 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 |