문제설명

이 시험같은 경우 제출하면 사라져버리는 문제이기에 최대한 기억나는 대로 서술하겠습니다.

우선 여러 개의 숫자가 들어있는 리스트 2개를 받습니다. 그 중 첫번째 여러 개의 숫자가 있는 리스트를 받아 이 리스트의 숫자를 맨 앞의 숫자를 맨 뒤로 보내고, 그러고 난 후 다시 맨 앞의 숫자를 다시 맨 뒤로 보내고 이 과정을 반복을 할 경우, 만약 두번째로 받은 리스트와 동일할 경우 True값을 반환하고 아닌 경우는 False를 반환합니다.

예시

  1. 만약 [1, 2, 3, 4]와 [3, 4, 1, 2]의 리스트 2개를 받는 경우
  • [1, 2, 3, 4]의 맨 앞 숫자인 1을 맨 뒤로 보내면 [2, 3, 4, 1]이 됩니다. 아직은 두번째 리스트와 동일하지 않습니다.
  • 그러나 한번 더 맨 앞 숫자를 뒤로 보내면 [3, 4, 1, 2]가 됩니다. 고로 두번째 리스트와 동일하므로 True를 반환합니다.
  1. 만약 [9, 4, 6]과 [6, 4, 9]의 리스트 2개를 받는 경우
  • [9, 4, 6]의 맨 앞 숫자 9를 뒤로 보낼 경우 [4, 6, 9]가 됩니다. 그리고 계속적으로 맨 앞 숫자를 뒤로 보내게 되면 오직 3가지의 케이스만 나옵니다.([9, 4, 6], [4, 6, 9], [6, 9, 4])
  • 두번째 리스트는 절대 동일할 수 없으므로 False를 반환합니다.

문제해설

접근방식

우선 효율성을 위해 만약 두 리스트의 원소가 하나라도 같지 않으면 어차피 맨 앞 숫자를 뒤로 보내든 절대 같을 수가 없기에 False를 반환해주고 나머지의 경우에 대해서만 반복문을 돌렸습니다. 반복문은 말그대로 원소를 회전시킵니다.

def solution(arrA, arrB):
    answer =[]

    if sorted(arrA) != sorted(arrB):
        return False
    else: ##안에 있는 원소가 다 같아야 원소 회전에 의미있음
        for i in range(len(arrA)):
            arrA.insert(0, arrA[-1])
            del arrA[-1]

            if arrA == arrB:
                answer.append("True")
            else:
                answer.append("False")
    if "True" in answer:
        return True
    else:
        return False
  1. 두 리스트의 원소가 다를 경우 바로 False를 반환합니다.(효율성을 위해)
  2. for반복문에서는 원소회전을 시키고 그 사이에 만약 두번째 리스트와 같은 리스트가 하나라도 있을 경우 따로 만든 리스트에 True를 넣어줍니다. 그 외엔 False를 넣어줍니다.
  3. 마지막으로 리스트안에 True라는 값이 하나라도 있다면 원소회전을 하면서 같은 리스트가 한 번이라도 있었으므로 True를 반환합니다. 만약 True값이 하나도 없다면 원소회전을 해도 같은게 없으므로 False를 반환합니다.

채점결과

시험 순간에 캡쳐할 시간이 없었네요...ㅠ 결론적으로는 100점이 나왔습니다.