※ 파이썬 문법 관련 내용은 '이것이 코딩테스트다' 교재를 참고하여 정리하였음.
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 |