관리 메뉴

나만을 위한 블로그

[Algorithm] 프로그래머스 - 배열 회전시키기 (Kotlin) 본문

알고리즘 문제 풀이/프로그래머스

[Algorithm] 프로그래머스 - 배열 회전시키기 (Kotlin)

참깨빵위에참깨빵_ 2022. 12. 28. 00:02
728x90
반응형
정수가 담긴 배열 numbers, 문자열 direction이 매개변수로 주어진다
배열 numbers의 원소를 direction 방향으로 한 칸씩 회전시킨 배열을 리턴하는 solution()을 완성하라

 

 

처음에는 배열의 0번 원소를 맨 뒤로 보내느니 마니 하는 로직을 생각했었지만 코틀린이니까 뭔가 간단히 만들어 둔 함수가 없을까 해서 찾아봤더니 있었다. 바로 rotate()다. Collections에 속하기 때문에 import문을 꼭 써줘야 한다.

 

import java.util.Collections

class Solution {
    fun solution(numbers: IntArray, direction: String): IntArray {
        val aList = numbers.toList()
        if (direction == "right") {
            Collections.rotate(aList, 1)
        } else {
            Collections.rotate(aList, -1)
        }
        
        return aList.toIntArray()
    }
}

 

이렇게 써서 제출했더니 통과됐다. rotate()의 설명과 원형은 아래와 같다.

이 함수는 자바로 작성돼 있어서 함수 설명은 오라클 문서의 rotate() 설명부로 이동해야 확인할 수 있다. 아래 링크로 이동해 Ctrl + F로 rotate를 찾으면 바로 이동할 수 있다.

 

https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#rotate(java.util.List,%20int) 

 

Collections (Java Platform SE 7 )

Rotates the elements in the specified list by the specified distance. After calling this method, the element at index i will be the element previously at index (i - distance) mod list.size(), for all values of i between 0 and list.size()-1, inclusive. (Thi

docs.oracle.com

지정된 리스트의 요소를 지정된 거리(distance)만큼 회전한다. 이 메서드를 호출한 후 인덱스 i에 있는 요소는 0과 list.size() - 1 사이의 모든 i값에 대해 이전의 인덱스(i - distance) mod list.size()에 있는 요소가 된다. 이 메서드는 리스트 크기에 영향을 주지 않는다
예를 들어 리스트가 [t, a, n, k, s]로 구성됐다고 가정한다. Collections.rotate(list, 1) 또는 Collections.rotate(list, -4)를 호출하면 list는 [s, t, a, n, k]로 구성된다. 이 메서드는 나머지 요소의 순서를 유지하면서 리스트 안에서 하나의 요소를 이동하기 위해 하위 리스트에 유용하게 적용될 수 있다. 예를 들어 다음 관용구는 인덱스 j의 요소를 위치 k(j보다 크거나 같아야 함)로 이동한다

Collections.rotate(list.sublist(j, k+1), -1)

리스트가 [a, b, c, d, e]로 구성됐다고 가정한다. 인덱스 1의 요소(b)를 두 위치 앞으로 이동하려면 아래 코드를 사용한다.

Collections.rotate(list.subList(1, 4), -1)

결과로 얻는 리스트는 [a, c, d, b, e]다. 둘 이상의 요소를 앞으로 이동하려면 회전 거리의 절대값을 늘린다. 요소를 뒤로 이동시킬면 양수 이동 거리를 사용하라...(중략)

< 매개변수 >

distance : 리스트를 회전할 거리. 이 값에는 제한이 없다. 0, 음수 또는 list.size()보다 클 수 있다
public static void rotate(List<?> list, int distance) {
    if (list instanceof RandomAccess || list.size() < ROTATE_THRESHOLD)
        rotate1(list, distance);
    else
        rotate2(list, distance);
}

 

 

반응형
Comments