반응형
▶ 문제1 - 문자열 섞기
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/181942
▶ 풀이
def solution(str1, str2):
answer = ''
for i in range(len(str1)):
answer += ''.join([str1[i], str2[i]])
return answer
★ 풀이노트
· 두 문자열이 순차적으로 더해지기에, 인덱스를 사용하여 설계했다.
· line 4 : 두 문자열의 길이가 동일하기에 둘 중 아무 변수의 길이만큼 반복문을 돌렸다.
· line 5 : 각 변수의 인덱스의 값을 join하여 변수 answer에 추가해준다.
(join() 대신에 answer += str1[i] + str2[i] 라고 간결하게 사용해도 될 것 같다.)
▣ 다른 사람 풀이
def solution1(str1, str2):
return ''.join([str1[i] + str2[i] for i in range(len(str1))])
def solution2(str1, str2):
return ''.join(i + j for i, j in zip(str1, str2))
★ 풀이노트
· 위 solution1, 2는 제너레이터 표현식을 활용하였다.
· 다만, solution1의 경우 제너레이터 표현식 + 리스트 컴프리헨션도 포함하고 있다. → 중간에 리스트 생성
· 메모리 효율을 생각하면 solution1 보다는 solution2가 더 효율적이다.
(리스트 컴프리헨션의 경우 리스트를 생성하기에 그만큼 메모리를 차지한다.
solution2의 경우 리스트를 생성하지 않아, 메모리면에서는 효율적이다.)
· 추가로, solution2의 경우 zip() 메서드를 사용하였다.
🧐 추가 설명
[제너레이터 표현식]
* 정의 : 반복(iteration)을 통해 데이터를 하나씩 생성하는 방식이다.
리스트 컴프리헨션과 달리 리스트를 생성하지 않기에 메모리 사용에 효율적이다.
* 기본 구조 : (expression for variable in iterable)
예) gen = (x * 2 for x in range(5))
* 특징 : 메모리 효율적?이여서 속도도 빠르고 코드도 짧게 작성할 수 있다.
데이터가 큰 코드에 적용하면 아주 효율적일듯하다.
* 표현식 : 소괄호() 를 사용한다.
(리스트 컴프리헨션은 대괄호 [] 를 사용한다.)
[zip()]
* 정의 : 여러개의 iterable(반복 가능한 객체)를 튜플 형태로 반환한다.
## zip() 메서드 ##
## 기본 사용법 ##
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
result = zip(list1, list2) # zip 객체 반환
print(list(result)) # [(1, 'a'), (2, 'b'), (3, 'c')]
## 반복문 활용 ##
names = ["Alice", "Bob", "Charlie"]
scores = [85, 90, 78]
for name, score in zip(names, scores):
print(f"{name}의 점수: {score}")
# 출력
'''
Alice의 점수: 85
Bob의 점수: 90
Charlie의 점수: 78
'''
## 길이가 다른 경우1 (짧은 길이에 맞춰서 동작함) ##
list1 = [1, 2, 3, 4]
list2 = ['a', 'b']
print(list(zip(list1, list2))) # [(1, 'a'), (2, 'b')]
## 길이가 다른 경우2 (활용) ##
from itertools import zip_longest
list1 = [1, 2, 3, 4]
list2 = ['a', 'b']
result = list(zip_longest(list1, list2, fillvalue="없음"))
print(result) # [(1, 'a'), (2, 'b'), (3, '없음'), (4, '없음')]
🧐 solution1 vs. solution2
비교 | solution1 | solution2 |
리스트 생성 여부 | O (불필요한 리스트 생성) |
X (제너레이터 사용) |
코드 가독성 | 비효율적 (range(len(str1)) 사용으로 비교적 비효율적) |
간결 (zip(str1, str2) 활용으로 더 간결) |
메모리 사용량 | 많음 (리스트를 만들기 때문에 더 많이 사용) |
적음 (제너레이터로 인해 더 적게 사용) |
▶ 문제2 - 문자 리스트를 문자열로 변환하기
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/181941
▶ 풀이
def solution(arr):
return ''.join(arr)
★ 풀이노트
· 리스트를 문자열로 결합하기 위해 join() 메서드를 사용하였다.
🧐 추가 설명
[join()]
* 리스트, 튜플 등 이터러블(iterable) 객체에 있는 요소들을 하나의 문자열로 결합할 때 사용한다.
* 구분자.join(리스트)의 구조를 갖는다.
▶ 문제3 - 문자열 곱하기
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/181940
▶ 풀이
def solution(my_string, k):
return my_string * k
★ 풀이노트
· 문자열을 반복하고 싶으면 곱셈 연산자(*)를 사용하면 된다.
▶ 문제4 - 더 크게 합치기
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/181939
▶ 풀이
def solution(a, b):
a, b = str(a), str(b)
if int(a + b) >= int(b + a):
return int(a + b)
else:
return int(b + a)
★ 풀이노트
· 일단 함정은 일반적인 덧셈이 아니라는 것!
· line 2 : 정수로 받은 변수 a, b를 우선 문자열로 형변환 해준다. 그래야 문제와 같이 연산이 가능하다.
· line 4 ~ 7 : if문을 이용하여 a + b와 b + a의 결과값을 비교한다.
이때의 포인트는 다시 정수로 형변환 해주는 것!
▣ 다른 사람 풀이
def solution1(a, b):
return int(max(str(a) + str(b), str(b) + str(a)))
def solution2(a, b):
return max(int(str(a) + str(b)), int(str(b) + str(a)))
★ 풀이노트
· max() 메서드를 이용해서 값을 비교한 풀이이다.
· 이때, 두 solution의 차이는 형변환의 위치이다.
· solution1은 최대값을 찾은 후 형변환을 시도하였고 solution2는 형변환 후 최대값을 찾았다.
· 사실, 위 문제에서는 오답이 날 수는 없을 것 같지만,
만약 자리수가 다른 경우 solution1은 의도치 않는 값이 반환 될 수 있다. 이것은 max() 메서드의 특징 때문이다.
🧐 추가 설명
[max()]
* 정의 : 이터러블 혹은 2개 이상의 값 중에서 큰 값을 반환한다.
* 특징 : 숫자, 문자 등 비교하여 가장 큰 값을 반환한다.
이때, 사전식 순서로 비교한다. →유니코드 값(혹은 ASCII 코드)로 비교한다.
* 주의 : 숫자 비교 시 정수형(int)일때와 문자형(string)일때 다른 결과를 반환할 수 있다!
why? 정수형의 경우 숫자 그대로 값을 비교하지만,
문자형의 경우 문자 하나하나 유니코드 값 혹은 ASCII 코드로 비교한다.
예를 들어 100과 99 중 최대값은 100 이지만,
"100"과 "99" 중 먼저 "1" 과 "9"를 비교하기 시작한다.
즉 "1" 보다는 "9"가 큰 값이므로 결과값은 "99"가 된다. ★★★★주의!★★★★
## 숫자 리스트에서 최대값 ##
print(max([1, 5, 3, 9, 2])) # 9
## 두 개 이상의 값 비교 ##
print(max(3, 1, 6, 8, 2)) # 8
## 문자열 최대값 찾기 ##
print(max(["apple", "banana", "kiwi", "strawberry"])) # "strawberry"
## 문자열 길이로 최대값 찾기 ##
print(max(["apple", "banana", "kiwi", "strawberry"], key=len)) # "strawberry"
## ⭐️ 주의 ⭐️ ##
## 숫자(type : str) 비교 ##
result = max("10", "2")
print(result) # "2"
## 숫자(type : int) 비교 ##
result = max(10, 2)
print(result) # 10
▶ 문제5 - 두 수의 연산값 비교하기
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/181938
▶ 풀이
def solution(a, b):
return max(int(str(a) + str(b)), 2 * a * b)
★ 풀이노트
· 문제4와 동일하다고 해야하나?
· 우선 입력 받은 a, b를 문자형으로 변환 후 덧셈 해준다. 그 후 다시 정수형으로 변환한다.
· 첫 번째 인자와 두 번째 인자 중 큰 수를 반환한다.
* max()의 경우 동일한 최대값이 포함된 경우 첫 번째 등장하는 값으로 반환한다.
😆 새로 알게 된 것들 😆
1. 제너레이터 표현법과 리스트 컴프리헨션 (문제1)
2. zip() 사용법 (문제1)
3. max() 주의사항! (문제4)
글을 정리하며...
전부터 코드 작성할때 메모리 걱정을 하긴 했는데...
아직 메모리 관련하여 깊은 지식이 없다 보니 결과만 나오면 되지 식의 코드를 작성하기만 했었다.
오늘을 계기로 차근차근 공부해봐야겠다.
프로그래머스 문제 풀다보면 정답은 맞아도 처리속도가 좀 걸리면 오답 처리를 한다고 하던데 미리 대비를 해야지 😱
반응형
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[Lv.0-C] 원하는 문자열 찾기 (1) | 2025.06.10 |
---|---|
[Lv.1-Python] 3문제 풀이(예산, 이상한 문자 만들기, 삼총사) (5) | 2025.02.13 |
[기초 Lv.0-Python] 코딩 기초 트레이닝 Day4 - 연산, 조건문 (0) | 2025.02.10 |
[기초 Lv.0-Python] 코딩 기초 트레이닝 Day2 - 출력, 연산 (0) | 2025.02.07 |
[기초 Lv.0-Python] 코딩 기초 트레이닝 Day1 - 출력 (0) | 2025.02.06 |
댓글