문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/42883
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
프로그래밍을 하다 보면, 코드가 짧을수록 좋다는 착각에 빠질 때가 있다. 나는 문제를 풀 때 문자열이 주어지면, 바로 그 문자열로만 해결하려는 경향이 있다. 하지만 짧은 코드가 항상 좋은 코드를 의미하는 것은 아니다.
문자열과 리스트의 차이점, 그리고 언제 리스트를 사용하는 것이 더 좋은가?
https://ginghambagle.tistory.com/155
mutable(변경 가능)과 immutable(변경 불가능)
파이썬에서 리스트(List)는 mutable(변경 가능)하고, 문자열(String)은 immutable(변경 불가능)하다는 의미는 그 데이터 타입이 변경 가능한지, 즉 그 안에 저장된 요소를 직접 수정할 수 있는지와 관련이
ginghambagle.tistory.com
문자열은 immutable하다
def solution(number, k):
answer = ''
for n in number:
while answer and answer[-1] < n and k > 0:
answer = answer[:-1]
k -= 1
answer += n
if k > 0:
answer = answer[:-k]
return answer
- 이 코드는 문자열 answer를 계속해서 반복적으로 생성하고 덧붙이며 수정해 나가는 방식이다. 문자열은 immutable하기 때문에 answer += n이 실행될 때마다 새로운 문자열이 생성되고, 메모리 할당과 복사 과정이 포함되어 있다. 문자열이 길어질수록 성능에 부담을 줄 수 있다.
리스트는 mutable하다
def solution(number, k):
collected = []
for i, num in enumerate(number):
while len(collected) > 0 and collected[-1] < num and k > 0:
collected.pop()
k -= 1
if k == 0:
collected += list(number[i:])
break
collected.append(num)
collected = collected[:-k] if k > 0 else collected
answer = ''.join(collected)
return answer
- 이 코드는 리스트를 사용해서 필요한 조작을 수행하고, 마지막에 리스트를 문자열로 변환하여 반환한다. 리스트는 mutable하기 때문에 요소를 더하거나 빼는 작업이 효율적이다. append, pop 등을 통해 리스트를 수정할 때 새로운 객체를 생성하지 않고 기존 리스트를 변경하기 때문에 성능이 더 좋다.
결과 비교
테스트 7-10에서 큰 차이를 보인다
결론
문자열을 사용하고 그대로 반환하는 것이 코드 작성자에게는 편리하지만 컴퓨터의 관점에서 효율적인 코드를 작성하는 것이 중요하다. 성능이나 메모리 사용량을 고려해야 할 때는, mutable한 리스트 같은 자료구조를 적극적으로 사용하는 것이 더 나은 선택일 수 있다.
앞으로 코드를 작성할 때는 입력 데이터의 특성과 처리 방법을 고민하고, 문자열 대신 리스트를 사용하는 것이 적합한 상황인지 신경 써보겠다.
'TIL' 카테고리의 다른 글
[프로그래머스] 기능개발: math.ceil 대체 수식 (0) | 2024.10.05 |
---|---|
[프로그래머스] 예산: O(n^2) -> O(n log n) (1) | 2024.10.05 |
[프로그래머스/SQL] 가격이 제일 비싼 식품의 정보 출력하기: 정렬 vs 서브쿼리 (0) | 2024.07.26 |
NestJS | TypeORM: entity 정의(soft delete, 추상클래스) (0) | 2022.11.21 |
NestJS | @nestjs/config 패키지를 활용한 환경변수 관리 -> db연결 (0) | 2022.11.21 |