[데이터분석] 부트캠프 TIL

20260111 TIL

myun0506 2026. 1. 12. 01:02

Today I Learn

: 코드카타, 파이썬 연습문제 / 심화문제

 

- 코드카타

 

- 문제 1. 

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131118

2. 정답 코드: 

select i.rest_id, i.rest_name, i.food_type, i.favorites, 
       i.address, round(avg(r.review_score),2) as score
from rest_info i
join rest_review r
on i.rest_id = r.rest_id 
where i.address like '서울%'
group by 1,2,3,4,5
order by score desc, 4 desc

 

3. 오류 상황: 처음에 where 절에서 서울이 들어가기만 하면 추출하는 %서울%이라고 작성해서 오류가 생김. '서울'이라는 글자가 처음이 아닌 부분에 오게 되면 문제가 원하는 '서울'에 위치한 식당이 아니므로 틀린 답이 됨

 

2-1. 정답 코드 (CTE 활용) : 

with score as ( 
    select rest_id, round(avg(review_score),2) as score
    from rest_review
    group by rest_id
)
select i.rest_id, i.rest_name, i.food_type, i.favorites, 
       i.address, s.score
from rest_info i
join score s
on i.rest_id = s.rest_id 
where i.address like '서울%'
order by score desc, 4 desc

 

 

2-2. 정답 코드 (서브쿼리 활용) :

select i.rest_id, i.rest_name, i.food_type, i.favorites, 
       i.address, s.score
from rest_info i
join (select rest_id, round(avg(review_score),2) as score
      from rest_review
      group by rest_id) as s
on i.rest_id = s.rest_id 
where i.address like '서울%'
order by score desc, 4 desc

 

 

- 파이썬 연습문제 / 심화문제

 

- += 연산자와 + 연산자가 리스트(mutable 객체)를 다루는 방식의 차이

  • a += [4] (In-place 수정)
    • a가 가리키던 메모리 공간에 직접 값을 추가함
    • a += [4] : 기존의 a 리스트를 그대로 두고, 그 뒤에 4를 붙여라!
  • a = a + [4] (새로운 객체 생성 및 할당)
    • 두 리스트를 합쳐서 완전히 새로운 리스트 객체를 만들어냄
    • a+[4]: 메모리 어딘가에 [1,2,3,4]라는 새로운 리스트를 만듦 (기존 a는 건드리지 않음)
    • a = ... : 변수 a가 방금 만든 새로운 리스트의 주소를 가리키도록 업데이트(재할당)
a = [1, 2, 3] # 리스트 mutable
b = a
print(id(a),id(b))
a += [4]
print(a, b) # [1,2,3,4], [1,2,3,4]
print(id(a),id(b)) # 주소값 그대로

a = [1, 2, 3]
b = a
print(id(a),id(b))
a = a + [4]
print(a, b) # [1,2,3,4], [1,2,3]
print(id(a),id(b)) # a는 주소값 달라짐

 

 

https://myun0506.tistory.com/31

 

가변 (Mutable) vs 불변 (Immutable)

- Mutable vs Immutable구분Mutable (가변)Immutable (불변)정의생성된 후 객체의 내부 상태를 변경 가능생성된 후 객체의 내부 상태를 변경 불가능대표 타입list, dict, setint, float, str, tuple수정시메모리 주소

myun0506.tistory.com

 

- q=p[:]의 얕은 복사 방식

  • 외곽 주소: p와 q는 서로 다른 새 리스트임. 서로 다른 주솟값을 가짐
  • 내부 요소:
    • p[0]과 q[0]은 숫자 1의 주소를 같이 가리킴
    • p[2]와 q[2]는 내부 리스트 [3,4]가 저장된 동일한 주소를 가리킴
x = [1, 2, 3]
y = x[:] 
print(id(x),id(y)) # 서로 다른 주소값
x[0] = 99 # x는 주소값 그대로
print(x, y) # [99,2,3],[1,2,3]
print(id(x),id(y)) # 서로 다른 채로 유지

p = [1, 2, [3, 4]]
q = p[:] 
print(id(p),id(q)) # 주소값 서로 다름
print(id(p[2]),id(p[2][0])) # but 안의 내용의 주소는 같음
print(id(q[2]),id(q[2][0]))
p[2][0] = 999
print(p, q) # [1,2,[999,4]],[1,2,[999,4]]
print(id(p),id(q)) # 주소값 서로 다른 채로 유지

 

 

https://myun0506.tistory.com/27

 

할당 vs 얕은 복사 vs 깊은 복사 / In-place 제자리 수정 vs Out-of-place 외부 생성

- 할당 vs 얕은 복사 vs 깊은 복사얕은 복사객체의 최상위 레벨만 복사하고, 그 안에 포함된 하위 객체들은 원본 객체와 참조를 공유함깊은 복사객체와 그 안에 포함된 모든 하위 객체까지 재귀적

myun0506.tistory.com

 

- append()와 +=의 차이

  • t[2].append(5)
    • 리스트 내부만 수정함 (할당 작업 없음)
    • 튜플에 아무런 간섭을 하지 않음
  • t[2] += [6]
    • 리스트 수정 후 다시 할당하려함
    • 튜플에서 내용물 바꾸지 말라고 차단함
    • 에러는 발생하지만 리스트 안의 값은 이미 수정 # (1, 2, [3, 4, 5, 6])
t = (1, 2, [3, 4]) # 튜플 안에 리스트 포함
t[2].append(5)
print(t) # (1, 2, [3, 4, 5])

# 아래 줄이 실행된다면 어떤 일이 일어나는지(출력/에러 포함) 정확히 쓰세요.
t[2] += [6] # TypeError: 'tuple' object does not support item assignment

 

https://myun0506.tistory.com/31

 

가변 (Mutable) vs 불변 (Immutable)

- Mutable vs Immutable구분Mutable (가변)Immutable (불변)정의생성된 후 객체의 내부 상태를 변경 가능생성된 후 객체의 내부 상태를 변경 불가능대표 타입list, dict, setint, float, str, tuple수정시메모리 주소

myun0506.tistory.com

 

- 슬라이스 할당

  • 슬라이스[:] 할당 규칙
    • 오른쪽에 오는 값은 반드시 반복 가능한 객체(Iterable)여야 하며,
    • 그 안의 요소들을 하나씩 꺼내어 할당함!!!
      • 즉, 오른쪽에 리스트가 오든, 튜플이 오든, 문자열이 오든,
      • 파이썬은 그 안의 내용물을 언패킹해서 슬라이스 자리에 끼워넣음
    • 시각적 이해
      • lst[1:4]라는 구간을 리스트에서 도려냄
      • 오른쪽에 있는 (9,8)에서 요소를 하나씩 꺼냄 (9와 8)
      • 도려낸 자리에 그 요소들을 차례대로 채워넣음
      • 결과: [0, 9, 8, 4]
  • 단일 인덱스 할당
    • 지정된 칸에 객체를 통째로 집어넣음
# 슬라이스 할당
lst = [0, 1, 2, 3, 4]
lst[1:4] = (9, 8)
print(lst) # [0,9,8,4]

lst = [0, 1, 2, 3, 4]
lst[1:4] = [9, 8]
print(lst) # [0,9,8,4]


# 단일 인덱스 할당
lst = [0, 1, 2, 3, 4]
lst[1] = (9,8)
print(lst) # [0, (9, 8), 2, 3, 4]

 

 

https://myun0506.tistory.com/53

 

리스트, 튜플, 딕셔너리

- 리스트슬라이싱 기본 구조 [start:stop:step]start (시작 인덱스) - 기본값: 0stop (종료 인덱스) - 기본값: 시퀀스의 길이step (간격) - 기본값: 1step의 부호에 따라 생략된 start와 stop의 기본값이 완전히 바

myun0506.tistory.com

 

'[데이터분석] 부트캠프 TIL' 카테고리의 다른 글

20260113 TIL  (0) 2026.01.13
20260112 TIL  (1) 2026.01.12
20260109 TIL  (1) 2026.01.09
20260108 TIL  (0) 2026.01.08
20260107 TIL  (1) 2026.01.07