답:
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문이 있어서 더 높을 것 같다.... 는 같다고 한다
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 신남 ㅋㅋㅋㅋㅋㅋㅋ

문제 분석 및 해석
> 주어지는 배열 뒤집어 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:
느낀점:
아 오늘도 열심히 공부했다
아침부터 해내버렸다 갬격
'알고리즘 풀이' 카테고리의 다른 글
[algorithm] 프로그래머스: 점의 위치 구하기, 최댓값만들기 (0) | 2023.04.11 |
---|---|
[algorithm] 프로그래머스: 가위바위보 (0) | 2023.04.10 |
[algorithm] 프로그래머스: 배열 두 배 만들기 (0) | 2023.04.06 |
[algorithm] 프로그래머스: 최빈값 구하기 (0) | 2023.04.05 |
[algorithm] 프로그래머스: 몫 구하기 (0) | 2023.04.04 |