본문 바로가기
알고리즘 풀이

[algorithm] 프로그래머스: 배열 뒤집기

by 째깍단 2023. 4. 7.

답: 

더보기
def solution(num_list):
    num_list.reverse()
    return num_list

 

메소드를 사용하면.. 이렇게나 간단하다.

하지만 그냥 넘어가면 재미가 없지.. 크큭....  삽질에 시간 붓기 비술 발동!! 

 

 

def solution(num_list):
    answer = []
    idx = -1
    for _ in num_list:
        num = num_list[idx]
        print(num)
        answer.append(num)
        idx -= 1
    return answer

 

시간복잡도로 따지면 아마 직접 풀이한 방식이 for문이 있어서 더 높을 것 같다.... 는 같다고 한다

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 신남 ㅋㅋㅋㅋㅋㅋㅋ

둘다 O(N)이래!!!

 

 

 


 

문제 분석 및 해석

 

> 주어지는 배열 뒤집어 return하기

 

for문과 append를 사용하면 될 것 같은걸?

아니면 sort, sorted함수를 사용하면 되지않을까?.. 라고 생각하던 시절이 있었습니다..

 

 

 

 

과정1.

 

1) 사용할만한 메서드들 조사 

sorted()

기존의 리스트를 변경하지 않고, 정렬된 리스트를 새롭게 리턴.   = 새 변수 리스트를 만들어줘야함

역순으로 만들고 싶으면 reverse=True를 추가한다.

- sorted(a_list) 형태로 사용

 

sort()

기존의 리스트를 정렬하고, 역순 정렬에 reverse=True를 추가

- a_list.sort() 형태로 사용

 

찾아보다보니 sort와 sorted는 이 문제에 사용할 수 없다.

얘네는 숫자를 순서대로 정렬해버리고 이후에 오름차순 내림차순을 결정하는 형식이기때문에 적절하지 않음!

 

 

 

2)

reverse() 메서드 사용하기

List에 최적화된 기능이라고 한다!

기존의 list를 정리, 반환한다.

- a_list.reverse()

 

reversed() 내장함수,  reversed iterator 객체

list의 기본 함수가 아니고, 때문에 적합한 함수라고 할 수는 없지만 사용할 수는 있다. 기존 리스트를 수정하지 않음.

reversed(num_list) 를 불러오면 에러가 나기때문에

list(reversed(num_list))

처럼 list로 한번 감싸주어야 한다

 

 

 

간단히 reverse() 메서드를 사용하여 문제를 풀었지만, 아쉬운 기분이 드는건 어쩔 수 없다.

 

 


 

 

그래서 시작한 과정2. 

for문 사용하여 list뒤집기는 가능할까?는 의문 풀기

 

 

1) for문과 reversed 를 사용하면 간단히 뒤집을 수 있다고 한다

numbers = [1, 2, 3, 4]
for i in reversed(numbers):
    print(i)

 

 

2)서로 대칭인 요소의 자리를 바꾸기

   찾아낸 코드를 이해하기까지 상당한 시간을 썼다..^^;

 

 

 

num_list[0]과 대칭되는 위치는 len(num_list)-1 (num_list[-1]위치)

num_list[1]과의 대칭은 len(num_list) -2 이다.

 

 

여기서 num_list[0] ~ 을 left,  num_list[-1]를 right로 생각해보자

그러면 

right = len(num_list) -left - 1  #…?

 

 

그리고 range(len(numlist))로 리스트를 처음부터 끝까지 돌아버리면

for문이 리스트를 반 돌면서 이미 뒤집어준 요소를 다시 되돌려놓는 형태가 된다.  반 돌면서 바꾸고, 바꾼 거 다시 바꿔줌

 

그래서 range(len(number)//2) 를 넣어 리스트의 길이를 2로 나눈 값까지만 서로 자리를 바꾸도록 해준다.

 

 

전체 코드는 이러하다..

for left in range(len(num_list)//2):
    right = len(num_list) - left - 1
    num = num_list[left]
    num_list[left] = num_list[right]
    num_list[right] = num
print(num)

 

 

 

잘 작동된다고 하는데 이미 위에서 혼란이 온 나 자신을 위해…

변수들을 내 입맛대로 바꾸고 한땀 한땀 분석해보았다;

 

 

출력을 위해   num_list = [5, 4, 3, 2, 1]    를 넣어주었다.

 

아직 친하지 않은 변수를 끙끙대며 생각하지말고,

a = 5이고 0번 index를 가진다

b= 1이고 -1 index를 가진다고 대입하면서 해석해본다.

 

def swap(num_list):
    for a_idx in range(len(num_list)//2):
    # 지금 여기에서의 list요소는 일반적인 요소값을 가져오는 것이 아니고
    # in range가 사용되며 index번호를 가져온다고 보아야한다. 그래서 a_idx로 적음


        b_idx = len(num_list) - a_idx - 1
        # b_idx, [0]번 요소와 대칭되는 요소를 변수로 넣는다.
        # len()은 길이이니까 5, a_idx는 index니까 0부터 시작
        # 그러니 num_list[0](=a_idx)과 대칭을 만들기위해 len(num_list)에 -1을 해준다.


        a = num_list[a_idx]
        print(a)
        # 위에 b_idx는 잠시 내버려두고,
        # 앞에서부터 차례로 요소를 a변수에 저장해준다.
        # 5, 4가 출력됨


		num_list[a_idx] = num_list[b_idx]
        # 이건 left right 가 같다는게 아니고…ㅠㅠ
        # num_list에 [a_idx]자리에 = 요소를 추가 하겠따…는 의미이다
        # 이건 수학이 아니고 파이썬문법임을 기억하자...


        num_list[b_idx] = a
        print(a)
        # 그리고 뒤에다가 저장해둔 num_list[left]를 넣겠다눈곤데
        # a는 [0] [1]이니까 5, 4 인데… 왜 뒤집히지?
        # 아!! 이때 b_idx는 len(num_list) - 1 한 값이니까 뒤에서부터 채워진다!!!!!!

    return num_list

swap(num_list)

 

 

+++

와 진짜 이거 이해하는데만 한 세월이고ㅋㅋㅋㅠㅠ

알고리즘을 풀이할때마다 연산자를 보고 일반적인 수학이라고 생각하고 푸는 경향이 아직 남아있다..^^;

 

 

이건 파이썬이라는 걸 기억하자

 

num_list[a_idx] = num_list[b_idx]

num_list[a_idx] = b

여기서 = 은 같은 거라고 말하는게 아니고 대체하는데 쓰는 문법이다

같은지 보는건 == 는는 이잖아

 

 


 

 

과정3.

풀이에서 독특해보이는 걸 봤다 while문, pop()을 사용

 

pop()은 num_list안의 내용물을 뒤에서부터 뱉어주고 해당 요소를 지운다.

그러니까 while문으로 돌리면 배열에 남은 것이 없을 때까지 새로운 list에 요소를 추가해서 돌려주도록 할 수 있나보다.

 

def solution(num_list):
    result =[]
    while(num_list):
        result.append(num_list.pop())
    return result

 

 

 

 

 


 

 

공부 후 문제 다시 해결해보기

 

주어지는 배열 뒤집어 return하기

 

열심히 공부한 것을 활용해보기위해 다시 내가 생각했던 첫 방법으로 돌아온다^.^..

 

 

시도1. for문과 append사용하기

일단 for문으로 요소를 하나씩 꺼내는데,

뒤의 요소를 먼저 꺼내서 새 list에 넣어주면 되지 않을까? 라고 생각했다.

 

num_list = [5, 4, 3, 2, 1]

def solution(num_list):
    answer = []
    for _ in num_list:
        idx = -1
        num = num_list[idx]
        print(num)
        answer.append(num)
        idx -= 1

    return answer

 

결과가  [1, 1, 1, 1, 1]로 나온다ㅋㅋ

 

 

문제가 되는 점은 for문 안에 idx = -1을 선언해주었기 때문으로 보인다.

for문이 돌때마다 idx가 -1로 초기화 되는 것이 아닐까? 그래서 배열을 바꾸어 확인했다.

 

num_list = [1, 4, 3, 2, 5]

def solution(num_list):
        idx = -1
        num = num_list[idx]
        print(num) #여기서 idx가 -1되었는지도 확인

아니 세상에 예상이 맞다니

 

그럼 idx = -1값을 for문 밖으로 내보내주면 해결이 되지않을까?

 

def solution(num_list):
    answer = []
    idx = -1
    for _ in num_list:

이예어ㅔ에에에에에ㅔㅔ

 


느낀점: 

 

아 오늘도 열심히 공부했다

 

아침부터 해내버렸다 갬격