일반 질문

Q

코드를 같은말인데 두가지 방식으로 작성했는데요. 하나는 정상작동 되는데 다른 하나는 왜 안돼는 걸까요?

조회 712

좋아요 1

2020년 11월 26일

A
2개의 답변이 있어요
2020년 11월 26일

댓글 3

2020년 11월 26일
: 를 빼면 원하는 값으로 도출되지 않습니다. :(
2020년 11월 26일
그럼 int 부분을 뺴면 될 것 같습니다. List를 int로 만들 수 없어요. se_num = num_list[:len(num_list)-1]로 해보세요
2020년 12월 2일
감사합니다!
2020년 11월 27일

댓글 1

2020년 12월 2일
감사합니다!

리스트 타입과 숫자 타입 부분을 좀더 공부했습니다.

재귀함수의 고찰

문제)
재귀함수를 사용해서 리스트의 요소를 거꾸로 만들어주는 함수를 만드시요. 단, 반복문은 사용금지.
def flip(some_list):
# 코드작성
#테스트
some_list = [1, 2, 3, 4, 5]
some_list = flip(some_list)
print(some_list)

첫번째, recurrsion case 와 base case 생각해보기.

- recursive case : 현 문제 범위가 너무 커서, 같은 형태의 작은부분 문제를 재귀적으로 푸는 경우
- base case : 이미 문제가 충분히 작아서, 더 작은 부분으로 나누지 않아도 풀수 있는 경우

base case부분을 생각해보아야한다.

계산을 안해도 알 수 있는 문제
some_list가 작다면, 1개의 요소가 있거나 아예 없다면 요소를 바꿔도 똑같다는 걸 알 수 있다.

if len(some_list) == 0 or len(some_list) == 1:
return some_list

그 다음은 recursive case를 생각해보자.

[1, 2, 3, 4, 5]만 되도 계산이 복잡하다.
이걸 뒤집으려면 어떻게 해야할까?

우선, [1, 2, 3, 4] 와 [5]로 분리시켜 봅시다.
[5]에다가 [1, 2, 3, 4]를 뒤집어서 더하면 되겠지요?
[1, 2, 3, 4]는 익숙한 형태지요?
[1, 2, 3, 4]를 뒤집는게 filpe([1, 2, 3, 4])입니다.
바로 우리가 찾던 더 작은 부분 이지요.

[5] + filpe([1, 2, 3, 4]) 로 하면 되겟네요.

이걸 일반화 하면

some_list[-1] + flipe(some_list[:-1]) 입니다.

여기서 잠깐~!
리스트 슬라이싱을 조금 더 이해해봅시다.

a = [1, 2, 3, 4, 5]
라는 리스트가 있을때

숨은 인덱스(위치)정보는 이렇게 됩니다.

0, 1, 2, 3, 4
리스트 : [1, 2, 3, 4, 5]
-5, -4, -3, -2, -1

예시 몇가지로 개념을 잡아봅시다.
a[0] = 1 입니다. 0번째 위치에 있는 요소는 1 이지요.
a[4] = 5 입니다. 4번째 위치에 있는 요소는 5.
a[-1] = 5 입니다. 거꾸로 한스텝 이동한 위치로 요소는 5입니다.
즉 a[-1] == a[4] 입니다.
a[-2] == a[3]
..

자 더 나아가서
슬라이싱을 해봅시다.

a[:2]는 a리스트에 위치 0 <= 리스트 < 위치 2 값을 슬라이싱 합니다.
즉, a[:2] = [1, 2] 가 됩니다.
a[:-1]은 뭘까요?
아까 a[-1]은 거꾸로 한칸, 즉, 위치 4와 같다고 했습니다. 위치 4에 있는 값은 5지요?
a[:-1] 은 위치 0 <= 리스트 < 위치 - 1(=위치4) 와 같습니다.
[1, 2, 3, 4]가 나오겠네요.

쪼금 더 나아가서
리스트에서 맨끝에 위치한 요소만 리스트 슬라이싱하면
a[-1:] 이 됩니다.
a리스트가 5개 인건 다 알기때문에
a[4] 하면 되겠지요

하지만 일반화로 들어가면 a의 길이를 모릅니다.
그러면 a[len(a)-1]을 하면 되지만, 궂이 코드를 길게 할 필요는 없지요? 이런 방법도 있구나 하면 됩니다.
마이너스 위치를 잘만 할용하면 함수를 잘 작성할 수 있습니다.

슬라이싱의 특성을 봅시다
a[:3] 은 이런 말입니다. 처음 위치부터 ~ 2번위치까지 리스트!
처음 위치는 0번 위치겠죠? 0 <= 리스트 < 3
a[2:4]는 2번위치부터~~ 3번위치까지 리스트! 2<= 리스트 < 4
a[-1:]은 -1본 위치부터 ~~~ 끝까지! -1<= 리스트 < 끝
즉, a[-1:]은 [5] 입니다.

여기서 추가 심화과정!

a[-1] 과 a[-1:]은 뭘까요? 다 똑같은 5 아니냐구요? 네. 아닙니다.
a[-1]은 숫자(int)타입 5가 나옵니다. 요소값이 뽑혀 나온거구요
a[-1:]은 리스트(list)타입 [5] 가 나옵니다. 리스트라는 이야기죠.

(주) 코드잇

대표강영훈

개인정보보호책임자강영훈

이메일support@codeit.kr

사업자 번호313-86-00797

통신판매업제 2019-서울중구-1034 호

주소서울특별시 중구 청계천로 100 시그니쳐타워 동관 10층 코드잇