An array A consisting of N integers is given. Rotation of the array means that each element is shifted right by one index, and the last element of the array is moved to the first place. For example, the rotation of array A = [3, 8, 9, 7, 6] is [6, 3, 8, 9, 7] (elements are shifted right by one index and 6 is moved to the first place).
The goal is to rotate array A K times; that is, each element of A will be shifted to the right K times.
Write a function:
class Solution { public int[] solution(int[] A, int K); }
that, given an array A consisting of N integers and an integer K, returns the array A rotated K times.
For example, given
A = [3, 8, 9, 7, 6] K = 3
the function should return [9, 7, 6, 3, 8]. Three rotations were made:
[3, 8, 9, 7, 6] -> [6, 3, 8, 9, 7] [6, 3, 8, 9, 7] -> [7, 6, 3, 8, 9] [7, 6, 3, 8, 9] -> [9, 7, 6, 3, 8]
For another example, given
A = [0, 0, 0] K = 1
the function should return [0, 0, 0]
Given
A = [1, 2, 3, 4] K = 4
the function should return [1, 2, 3, 4]
Assume that:
- N and K are integers within the range [0..100];
- each element of array A is an integer within the range [−1,000..1,000].
In your solution, focus on correctness. The performance of your solution will not be the focus of the assessment.
Copyright 2009–2021 by Codility Limited. All Rights Reserved. Unauthorized copying, publication or disclosure prohibited.
int 배열 A와 숫자 K가 주어지고
K번 만큼 오른쪽으로 시프트 해주면 되는 문제.
- 예시(A, K, 리턴값)
[3.8.9.7.6] , 3 -> [9,7,6,3,8]
나는 이렇게 풀었다.
시프트 2중 for문 말고 다른 방법이 있을까 생각해보았다.
리스트로 만들어서 마지막 요소를 제일 앞으로 넣어주고, 마지막 요소를 제거하는 방식으로 진행했다.
// you can also use imports, for example:
import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
public int[] solution(int[] A, int K) {
// write your code in Java SE 8
int aLength = A.length;
if(aLength != K){
List<Integer> intList = new ArrayList<>();
for(int i=0; i<aLength;i++){
intList.add(A[i]);
}
for(int j=0; j<K; j++){
intList.add(0 , intList.get(aLength-1));
intList.remove(intList.size()-1);
}
for(int k=0; k<intList.size(); k++){
A[k] = intList.get(k);
}
}
return A;
}
}
주어지는 A의 길이와 K가 같은 경우
결국 제자리이기 때문에 바로 A가 return 되도록 validation을 걸어주었다.
2중 for문을 피해본다고 하다가 for문을 3번 썼다.
correctness에 focus하라는 말로 위안을 삼으며 제출.
아뿔싸
한 곳에서 에러가 났다.
empty array란다.
A가 빈 값이 들어온 것이다 A = [];
센스있다고 자부하면서 A의 길이와 K가 같은 경우는 validation을 걸었으면서
빈 값이 들어올거라는 전제를 생각하지 못했다.
어디선가 이런 뉘앙스의 글을 본 것이 떠올랐다.
서버 개발자는 클라이언트 데이터를 믿지 마라
당연하게도 값을 넘길거라고 생각한 내가 바보였다.
// you can also use imports, for example:
import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
public int[] solution(int[] A, int K) {
// write your code in Java SE 8
int aLength = A.length;
if(aLength !=0 && aLength != K){ // A 사이즈가 0인 경우도 체크
List<Integer> intList = new ArrayList<>();
for(int i=0; i<aLength;i++){
intList.add(A[i]);
}
for(int j=0; j<K; j++){
intList.add(0 , intList.get(aLength-1));
intList.remove(intList.size()-1);
}
for(int k=0; k<intList.size(); k++){
A[k] = intList.get(k);
}
}
return A;
}
}
A의 사이즈가 0인 경우도 함께 체크해 주었다.
결과는 전체 통과
한참 멀었다.
'개발자의 삶 > Algorithm' 카테고리의 다른 글
[LeetCode] Two Sum (with Go) (0) | 2022.02.03 |
---|---|
[Codility] 4. FrogJmp (0) | 2021.07.28 |
[Codility] 3. OddOccurrencesInArray (0) | 2021.07.19 |
[Codility] 1. BinaryGap (0) | 2021.07.16 |
알고리즘 공부 (0) | 2021.07.16 |