본문 바로가기

파이썬 Phyton

[파이썬 코딩] Cos Pro 1급 3차 문제1 - 배열을 회전시켜보세요

1 ] 문제

정수로 이루어진 두 리스트 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 함수와 매개변수를 알맞게 채워주세요.

 

2 ] 해답

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_b(arrA, arrB):
      arrA_temp = func_a(arrA)
   if func_c(arrA_temp,arrB):
       return True
   return False

 

- 헷갈렸던 부분 func_b

def func_b(first, second):
   MAX_NUMBER = 5
   counter = [0 for _ in range(MAX_NUMBER)]
   for f, s in zip(first, second):
     counter[f] += 1
     counter[s] -= 1
     print(counter)
 -------------------------------------
first = [1, 2, 3, 4]
second = [3, 4, 1, 2]

func_b(first,second)

>> func_b(fisrt, second) 의 반환값

[0, 1, 0, -1, 0]
[0, 1, 1, -1, -1]
[0, 0, 1, 0, -1]
[0, 0, 0, 0, 0]

 

first값 +1 / second 값 -1 => 만약 두 리스트가 같다면 최종리스트의 값은 0리트스 반환
만약 0이 아니라면 리턴값 False 반환

  for c in counter:
     if c != 0:
      return False