숫자로 이루어진 리스트 nums가 있고, 연산자를 나타내는 문자열 op(예: "+", "-", "/", "*")와 하나의 값 val이 함께 주어졌다고 가정해 봅시다. 이때 우리가 해야 할 일은 리스트의 모든 숫자에 대해 val과의 연산을 수행한 뒤, 그 결과를 새로운 리스트로 반환하는 것입니다.
예를 들어 입력이 [5, 3, 8]이고 연산자가 *, 값이 3이라면 출력은 [15, 9, 24]가 됩니다.
문제 해결 접근 방법
이 문제는 다음 단계를 따라 해결할 수 있습니다.
- 결과를 담을 새로운 리스트
res를 생성합니다. nums의 각 요소i에 대해 다음을 반복합니다.op가 '+'라면res의 끝에i + val을 추가합니다.op가 '-'라면res의 끝에i - val을 추가합니다.op가 '*'라면res의 끝에i * val을 추가합니다.- 그 외의 경우(나눗셈),
val이 0이 아니라면res의 끝에i // val(정수 나눗셈의 몫)을 추가합니다.
- 모든 요소를 처리한 후
res를 반환합니다.
구현 예제
아래 코드를 통해 더 잘 이해할 수 있습니다.
class Solution:
def solve(self, nums, op, val):
res = []
for i in nums:
if op == '+':
res.append(i + val)
elif op == '-':
res.append(i - val)
elif op == '*':
res.append(i * val)
elif val:
res.append(i // val)
return res
ob = Solution()
nums = [5, 3, 8]
print(ob.solve(nums, '*', 3))
입력
[5, 3, 8]
출력
[15, 9, 24]
코드 설명 및 참고 사항
위 코드는 조건문을 사용해 연산자 종류에 따라 분기 처리하며, 각 요소에 해당 연산을 적용한 결과를 순서대로 새 리스트에 저장합니다. 시간 복잡도는 리스트의 길이를 n이라 할 때 O(n)으로 효율적입니다.
나눗셈의 경우 0으로 나누면 오류가 발생하므로, elif val: 조건을 통해 val이 0이 아닐 때만 나눗셈을 수행하도록 안전장치를 두었습니다. 또한 // 연산자를 사용해 정수 나눗셈의 몫을 구하며, 실수 결과가 필요하다면 / 연산자로 변경하면 됩니다.
참고로 파이썬에서는 operator 모듈과 딕셔너리를 활용해 같은 로직을 더 간결하게 작성할 수도 있습니다.
import operator
ops = {'+': operator.add, '-': operator.sub, '*': operator.mul, '/': operator.floordiv}
def solve(nums, op, val):
return [ops[op](i, val) for i in nums] if val or op != '/' else []
print(solve([5, 3, 8], '*', 3)) # [15, 9, 24]