Programming/백준 문제풀이

[프로그래머스 Lv1] 오답노트

수박주스으 2025. 2. 27. 01:42

※ 파이썬 문법 관련 내용은 '이것이 코딩테스트다' 교재를 참고하여 정리하였음.

1. 리스트 컴프리헨션

  • 리스트 컴프리헨션은 리스트를 초기화하는 방법 중 하나. 대괄호 안에 조건문+반복문을 넣어 리스트를 초기화한다.
# 약수 합 문제
def solution(n):
    li = [] # n의 약수들
    
    for i in range(1, n+1):
        if n % i == 0:
            li.append(i)
        
    return sum(li)
    

# 리스트 컴프리헨션 이용
def solution(n):
    return sum([i for i in range(1, n+1) if n % i == 0])

 

 

다른 예제

# 1부터 9까지 수의 제곱값을 포함하는 리스트
array = [i * i for i in range(1, 10)]

# N x M 2차원 리스트 초기화
# 2차원 리스트를 초기화할 때는 반드시 리스트 컴프리헨션을 이용해야 한다.
n = 3
m = 3
array = [[0] * m for _ in range(n)]

 

관련 문제

약수의 합 : https://school.programmers.co.kr/learn/courses/30/lessons/12928

자릿수 더하기 : https://school.programmers.co.kr/learn/courses/30/lessons/12931

평균 구하기 : https://school.programmers.co.kr/learn/courses/30/lessons/12944

 

 

2. 리스트에서 모든 요소가 숫자로 구성되어 있을 때

  • sum(리스트)하면 리스트 안에 들어있는 모든 요소의 합을 구할 수 있다.
  • 따라서, for 반복문으로 숫자를 하나씩 꺼내와 더하는 과정을 굳이 할 필요 없다.

 

관련 문제

약수의 합 : https://school.programmers.co.kr/learn/courses/30/lessons/12928

평균 구하기 : https://school.programmers.co.kr/learn/courses/30/lessons/12944

 

 

3. 리스트 관련 메서드 (요소 삽입, 삭제, 뒤집기 등)

함수명 사용법 설명 시간복잡도
append() 변수명.append() 리스트에 원소 하나 삽입 O(1)
sort() 변수명.sort() 기본 정렬 기능. 오름차순 정렬 O(NlogN)
변수명.sort(reverse = True) 내림차순 정렬 O(NlogN)
reverse() 변수명.reverse() 원소 순서를 모두 뒤집음 O(N)
insert() insert(삽입할 위치 인덱스, 삽입할 값) 특정한 인덱스 위치에 원소 삽입 O(N)
count() 변수명.count(특정 값) 리스트에서 특정값의 데이터 개수 세기 O(N)
remove() 변수명.remove(특정 값) 특정 값 제거. 이때 그 값이 여러개라면 하나만 제거 O(N)
  • insert()와 remove() 함수는 특정 값을 각각 삽입/제거한 후에 원소 위치를 조정해주어야 하기 때문에, 시간복잡도가 O(N)이다. 따라서 '시간 초과'로 테스트를 통과하지 못할 수도 있으니 유의하자.
  • 그러면 특정 값의 원소를 모두 제거하고 싶을 때는? 아래 코드를 이용해보자.
    a에 포함된 원소를 하나씩 확인하며 그 원소가 remove_set에 포함되지 않았을 때만 result에 삽입하겠다는 의미.
a = [1, 2, 3, 4, 5, 5, 5]
remove_set = {3, 5}

result = [i for i in a if i not in remove_set]
print(result)
  • 왜 answer.reverse()하면 뒤집기가 바로 적용이 안되는가? > 관련 문제 : 자연수를 뒤집어 배열로 만들기
    • 리스트.reverse() 메서드가 리스트 자체를 뒤집을 뿐, 반환값을 가지지 않기 때문이다. (None) 따라서 원본 값 변경이 일어나면 안되는 상황이라면 reverse 함수를 사용하면 절대 X

 

관련 문제

자연수를 뒤집어 배열로 만들기 : https://school.programmers.co.kr/learn/courses/30/lessons/12932

 

 

4. 두 정수 사이의 합 / 두 숫자 swap하기

  • 하나의 조건문으로 두 수의 대소비교 케이스를 모두 커버할 수 있다.
  • 첫 번째 풀었던 코드.
# 첫 번째 풀었던 코드
# 최솟값과 최댓값을 각각 구한 후, 케이스별로 나누어 풀었다.
def solution(a, b):
    answer = 0
    min_n = min(a, b)
    max_n = max(a, b)
    
    if min_n == max_n:
        answer = min_n
    else:   
        for n in range(min_n, max_n+1):
            answer += n
    
    return answer

 

 

  • 최적화 한 코드
    • 반복문이 아닌 range 함수를 사용한다.
# 최적화 한 코드
# 아래 코드를 통해 비교 케이스 없이 한 줄로 모두 커버 가능하다.
# 어떤 수가 들어오던, b가 항상 a보다 큼을 보장한다.
def solution(a, b):
    if a > b:
        a, b = b, a
    
    return sum(range(a, b+1))

 

 

관련 문제

두 정수 사이의 합 : https://school.programmers.co.kr/learn/courses/30/lessons/12912

 

 

4. 문자열 기본 연산 / 대문자 <-> 소문자 변환

1) 기본 연산

  • 덧셈 : 문자열 연결
  • 곱셈 : 곱한 값만큼 옆으로 연결
  • 문자열도 리스트의 일부라고 보아, 인덱싱과 슬라이싱 모두 적용 가능
# 1. 덧셈
a = "Hello"
b = "World"

print(a + " " + b) # Hello World

# 2. 곱셈
a = "String"

print(a * 3) # StringStringString

# 3. 인덱싱&슬라이싱
a = "ABCDEF"
print(a[2:4]) # CD

 

2) 대문자 <-> 소문자 변환 함수

  • upper() : 소문자 -> 대문자
  • lower() : 소문자 -> 대문자
  • 이때, 원본 문자열을 변경하지 않고, 모든 문자를 소문자/대문자로 변환한 새로운 문자열을 반환한다.
x = "hello"
y = "HELLO"
    
print(x.upper())
print(y.lower())

 

관련 문제

문자열 내 p와 y의 개수 : https://school.programmers.co.kr/learn/courses/30/lessons/12916

 

 

5. 변수의 동시 선언

  • 파이썬은 여러 변수의 동시 선언이 가능하다. 따라서 한 줄씩 따로 작성해서 코드를 낭비할 필요가 없다.
a, b = 0, 0 		# a = 0, b = 0
a, b, c = 1, 2, 3 	# a = 1, b = 2, c = 3

'Programming > 백준 문제풀이' 카테고리의 다른 글

[프로그래머스 Lv1] 오답노트2  (0) 2025.02.28
다짐글.  (0) 2025.02.10