나의 작은 valley

[cosPro 1급] 배열 회전 본문

Computer Science/[알고리즘]

[cosPro 1급] 배열 회전

붕옥 아이젠 2023. 8. 13. 01:45
728x90

정수로 이루어진 두 리스트 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 해주세요.

 

문제코드)

def func_a(arr):
    ret = arr + arr
    return ret

def func_b(first, second):
    MAX_NUMBER = 1001
    counter = [0 for _ in range(MAX_NUMBER)]
    for f, s in zip(first, second):
        counter[f] += 1
        counter[s] -= 1
    for c in counter:
        if c != 0:
            return False
    return True

def func_c(first, second):
    length = len(second)
    for i in range(length):
        if first[i : i + length] == second:
            return True
    return False

def solution(arrA, arrB):
    if len(arrA) != len(arrB):
        return False
    if func_@@@(@@@):
        arrA_temp = func_@@@(@@@)
        if func_@@@(@@@):
            return True
    return False

#아래는 테스트케이스 출력을 해보기 위한 코드입니다. 
arrA1 = [1, 2, 3, 4]
arrB1 = [3, 4, 1, 2]
ret1 = solution(arrA1, arrB1)

#[실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
print("solution 함수의 반환 값은", ret1, "입니다.")

arrA2 = [1, 2, 3, 4]
arrB2 = [1, 4, 2, 3]
ret2 = solution(arrA2, arrB2)

#[실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
print("solution 함수의 반환 값은", ret2, "입니다.")

 

정답 코드)

#2배로 늘리는 함수
def func_a(arr):
    ret = arr + arr
    return ret

# c == 0이 아닌게 있으면 아예 다른 수가 있는거여서 같이질 가능성 x
def func_b(first, second):
    MAX_NUMBER = 1001
    counter = [0 for _ in range(MAX_NUMBER)]
    for f, s in zip(first, second):
        counter[f] += 1
        counter[s] -= 1
    for c in counter:
        if c != 0:
            return False
    return True

#부분 리스트 비교
def func_c(first, second):
    length = len(second)
    for i in range(length):
        if first[i : i + length] == second:
            return True
    return False

def solution(arrA, arrB):
    if len(arrA) != len(arrB):
        return False
    if func_b(arrA,arrB):
        arrA_temp = func_a(arrA)
        if func_c(arrA_temp,arrB):
            return True
    return False

arrA1 = [1, 2, 3, 4]
arrB1 = [3, 4, 1, 2]
print(solution(arrA1, arrB1))

arrA2 = [1, 2, 3, 4]
arrB2 = [1, 4, 2, 3]
print(solution(arrA2, arrB2))

#총평

빈칸을 채워넣는 문제는 그냥 제일 쉬운 유형이다. 함수의 기능만 잘 이해하고 적절한 매겨변수만 넣어주면 풀린다. 

 

심지어 함수의 기능이 직관적으로 이해가 안되더라도 하나씩 임의의 값을 넣어보면서 진행할 수도 있다.

 

 

#재밌는 포인트 1

func_b를 보면 이게 투표 문제랑 유사한 방법인데 arrA와 arrB의 원소들을 리스트의 인덱스로 사용했다. 만약에 하나의 배열에만 존재하는 원소가 있다면 그 원소는 1 혹은 -1이 될 테니깐 아무리 배열을 회전시켜도 같아질 확률이 없다. 

 

따라서 false 반환

 

 

#재밌는 포인트2

func_c는 확대한 arrA 안에 arrB가 있는지 확인하는 함수인데 그 확인하는 방법을 눈여겨볼만하다.

 

arrB의 크기를 구하고 그 크기만큼 for문을 돌면서 인덱싱을 i:i + length를 해서 모든 경우를 다 시도해볼 수 있게 만들었다.

 

728x90

'Computer Science > [알고리즘]' 카테고리의 다른 글

[cosPro 1급] 로봇 이동  (0) 2023.08.13
[cosPro 1급] 팰린드롬 우열 가리기  (0) 2023.08.13
[cosPro 1급] 연속 0처리  (0) 2023.08.13
[cosPro 1급] 패스워드  (0) 2023.08.13
[cosPro 1급] 숫자 재배치  (0) 2023.08.13
Comments