Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 리스트의 각 요소에 주어진 연산 적용하기

숫자로 이루어진 리스트 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]