[프로그래머스] 큰 수 만들기: 문자열보다 리스트 사용하기

2024. 10. 3. 01:02·TIL
반응형

문제 링크

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
'TIL' 카테고리의 다른 글
  • [프로그래머스] 기능개발: math.ceil 대체 수식
  • [프로그래머스] 예산: O(n^2) -> O(n log n)
  • [프로그래머스/SQL] 가격이 제일 비싼 식품의 정보 출력하기: 정렬 vs 서브쿼리
  • NestJS | TypeORM: entity 정의(soft delete, 추상클래스)
이라후
이라후
  • 이라후
    화이팅
    이라후
  • 전체
    오늘
    어제
    • 분류 전체보기 (133)
      • TIL (23)
      • 기타 (26)
      • Python (14)
      • Django (10)
      • JavaScript (8)
      • git & GitHub (8)
      • Web (10)
      • Go (3)
      • wecode (31)
  • 반응형
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
이라후
[프로그래머스] 큰 수 만들기: 문자열보다 리스트 사용하기
상단으로

티스토리툴바