프로그래머스 코딩테스트 Lv1. Review

Suyeon Woo·2025년 2월 16일

codingtest

목록 보기
1/1

(25.02.16)
github 링크


1. 함수 호출시 원본객체 수정 여부

  • 파이썬에서 함수의 인자 전달 방식은 객체의 참조를 전달하는 방식이다. 하지만 객체가 immutable / mutable인지에 따라 동작 방식이 달라진다.
  • immutable 객체 (정수, 실수, 문자열, 튜플 등): 함수 내부에서 값을 변경해도 원래 변수의 변경이 아닌 새로운 객체가 생성된다.
    • 문자열 - immutable과 관련하여: 인덱스 슬라이싱을 자주 사용한다.
  • mutable 객체 (리스트, 딕셔너리, 집합 등): 함수 내부에서 값을 변경하면 원본 객체의 값이 바뀌는 것이다.

2. 날짜/시간 관련 문제

  • 날짜 간의 선후 관계를 따질 때 문자열로 비교하는 방법도 있지만, yymmdd를 '일' 로만 변환하여 정수 형태로 비교할 때가 편리한 경우도 있다.
  • 마찬가지로, hh:mm의 경우도 모두 '분'의 정수로 변환하여 비교하는 게 더 쉬운 문제가 있다.

3. 문자열 관련 함수

  • 구분자 기준으로 문자열을 분리하여 리스트 형태로 반환한다.
    • (예) 공백 기준으로 분리: str.split()
      string = "Hello World!"
      a, b = string.split()
      print(a)	# Hello
      print(b)	# World!
  • 문자열 뒤집기: str[::-1]
  • replace 함수: 특정 부분 문자열을 특정 문자열로 바꾼다.
string.replace(old, new, count)
# old: 교체하고자 하는 부분 문자열
# new: old를 교체할 새로운 문자열
# count: 최대 교체 횟수 (default: 모두 교체)
  • strip 함수: 문자열의 양쪽의 문자를 제거한다.
string.strip([chars])
# string.strip("xy") 와 같이 작성하면 x또는 y가 모두 삭제됨
  • 특정 문자열 패턴 찾기: 정규 표현식 (관련 문제)
    import re
     new_id = re.sub(r"[^a-z0-9-_.]", "", new_id)    # 2단계
     new_id = re.sub(r"\.+", ".", new_id)    # 3단계
    • re.sub(pattern, repl, string) 메소드의 인자는 순서대로, 검색할 정규 표현식 패턴, 패턴을 대체할 문자열, 대체할 대상 문자열이다.

4. 카운터 객체

  • 리스트, 튜플, 집합, 문자열에서 각 원소의 개수를 딕셔너리 형태로 반환한다. (관련 문제)
import collections
    
X = "hello world"   
Y = collections.Counter(X)
print(Y)	# Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})

5. 소수 판별 또는 약수 구하기

  • 주어진 숫자 n의 제곱근 n**1/2 까지의 홀수만 확인해보면 된다. int로 형변환시 제곱수가 아닌 경우 내림 연산까지 되므로, int(n**1/2)+1 까지 확인하면 된다.

6. 딕셔너리의 사용

  • 리스트와 비교하여 딕셔너리를 사용하면 키값을 기준으로 짧은 시간에 키에 해당하는 값을 찾을 수 있다는 장점이 있다. 문제 풀이시 자주 사용한다.
  • 딕셔너리 정렬: 키 기준(기본) vs. 값 기준
    • 관련 문제 1
      # dictionary를 value(dic[x])기준 내림차순 정렬한다.
       dic = sorted(dic, key=lambda x:dic[x], reverse=True)
    • 관련 문제 2: ind.items()는 딕셔너리 ind에서 키와 값의 쌍을 튜플 형태로 반환한다. 예를 들어, ind = {'a': 3, 'b': 1, 'c': 2}라면 ind.items()는 dict_items([('a', 3), ('b', 1), ('c', 2)])를 반환한다. 따라서 x[1]은 값, x[0]은 키를 의미하게 되는 것이다.
      ind = {word: word[n] for word in strings}
       # value: x[1] 기준으로 정렬한 후(값), 같으면 x[0](키) 기준으로 정렬
       sorted_ind = sorted(ind.items(), key=lambda x: (x[1], x[0]))

7. 리스트 관련

  • 리스트를 문자열로 변환 (괄호 안에는 구분자를 추가할 수 있다.)

    return ''.join(i for i in lst)
  • 리스트의 정렬 기준 (람다식 사용)

    return sorted(lst, key = lambda x: x[2]) # 2차원 리스트 lst를 각 원소 리스트의 인덱스 2인 원소를 비교하여 정렬한다.
    
  • list.sort() vs. sorted(list)

    • list.sort(): 원본 리스트가 변경되며, 반환값은 None이다.
    • sorted(list): 원본 리스트는 변경되지 않고, 정렬된 새로운 리스트를 새로 생성해서 반환
  • map 함수: 이터러블의 각 요소에 지정된 함수(람다식 또는 함수)를 적용하여 새로운 이터러블을 반환

    numbers = [1, 2, 3, 4, 5]
    result = map(lambda x: x * 2, numbers)
    print(list(result))  # [2, 4, 6, 8, 10]
    • map객체의 형태로 반환하므로, 원하는 형태로 변환해서 사용한다.

8. 아스키 코드 및 n진법 변환

  • 아스키 코드: 관련 문제
    • 문자 -> 아스키코드: ord() 함수
    • 아스키코드 -> 문자: chr() 함수
  • int(n,3) 의 형태로 3진법 수 n을 10진법으로 변환한다. 10진법->k진법의 경우 몫과 나머지 연산으로 직접 구해야 한다.

9. 자료구조의 사용


❇️

profile
👩‍💻

0개의 댓글