코딩 기초 트레이닝

배열 비교하기

욱스917 2024. 6. 12. 17:26

https://school.programmers.co.kr/learn/courses/30/lessons/181856

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


 

문제 설명

이 문제에서 두 정수 배열의 대소관계를 다음과 같이 정의합니다.

  • 두 배열의 길이가 다르다면, 배열의 길이가 긴 쪽이 더 큽니다.
  • 배열의 길이가 같다면 각 배열에 있는 모든 원소의 합을 비교하여 다르다면 더 큰 쪽이 크고, 같다면 같습니다.

두 정수 배열 arr1과 arr2가 주어질 때, 위에서 정의한 배열의 대소관계에 대하여 arr2가 크다면 -1, arr1이 크다면 1, 두 배열이 같다면 0을 return 하는 solution 함수를 작성해 주세요.


제한사항

  • 1 ≤ arr1의 길이 ≤ 100
  • 1 ≤ arr2의 길이 ≤ 100
  • 1 ≤ arr1의 원소 ≤ 100
  • 1 ≤ arr2의 원소 ≤ 100
  • 문제에서 정의한 배열의 대소관계가 일반적인 프로그래밍 언어에서 정의된 배열의 대소관계와 다를 수 있는 점에 유의해주세요.

입출력 예

arr1 arr2 result
[49, 13] [70, 11, 2] -1
[100, 17, 84, 1] [55, 12, 65, 36] 1
[1, 2, 3, 4, 5] [3, 3, 3, 3, 3] 0

입출력 예 설명
입출력 예 #1

  • 예제 1번에서는 arr1의 길이는 2이고 arr2의 길이는 3으로 arr2의 길이가 더 깁니다. 따라서 arr2arr1보다 크므로 -1을 return 합니다.

입출력 예 #2

  • 예제 2번에서는 arr1의 길이과 arr2의 길이가 4로 같습니다. arr1의 모든 원소의 합은 100 + 17 + 84 + 1 = 202이고 arr2의 모든 원소의 합은 55 + 12 + 65 + 36 = 168으로 arr1의 모든 원소의 합이 더 큽니다. 따라서 arr1이 arr2보다 크므로 1을 return 합니다.

입출력 예 #3

  • 예제 3번에서는 arr1의 길이와 arr2의 길이가 5로 같고 각 배열의 모든 원소의 합 또한 15로 같습니다. 따라서 arr1과 arr2가 같으므로 0을 return 합니다.

배열 2개가 주어지는데, 그 배열 간의 상관관계를 계산하는 문제입니다.

규칙은 다음과 같습니다.

1. 배열의 길이가 더 긴 쪽이 크다.

2. 배열의 길이가 같다면, 배열 안 요소들의 합이 큰 쪽이 더 크다.

 

우선적으로 배열의 길이를 비교한 뒤, 같으면 값을 비교하도록 코드를 작성할 수 있습니다.

파이썬으로 풀어보겠습니다.

def solution(arr1, arr2):
    # arr1, arr2의 길이와 그 합을 계산합니다.
    L1, L2 = len(arr1), len(arr2)
    S1, S2 = sum(arr1), sum(arr2)
    # L1이 L2보다 크다면 arr1 > arr2이므로 1
    if L1 > L2:
        return 1
    # L1이 L2보다 작다면 arr1 < arr2이므로 -1
    elif L1 < L2:
        return -1
    # L1과 L2가 같다면 요소들의 합을 비교
    else:
        # S1이 S2보다 크다면 arr1의 합이 더 크므로 1
        if S1 > S2:
            return 1
        # S2가 S1보다 크다면 arr2의 합이 더 크므로 -1
        elif S1 < S2:
            return -1
        # 값이 같으면 0
        else:
            return 0

규칙에 맞게 코드를 작성했습니다.

 

다른 사람의 풀이를 찾아보다가 흥미로운 코드를 발견해서, 그 코드 리뷰를 쓰려합니다.

def solution(arr1, arr2):
    return (len(arr1) > len(arr2)) - (len(arr2) > len(arr1)) or (sum(arr1) > sum(arr2)) - (sum(arr2) > sum(arr1))

한줄로 길지만 끊어보면 다음과 같습니다.

# 1. (len(arr1) > len(arr2)) - (len(arr2) > len(arr1))
# 2. (sum(arr1) > sum(arr2)) - (sum(arr2) > sum(arr1))

1번 라인에서는 arr1과 arr2의 길이를 비교합니다.

여기서는 예제 1번을 사용한다고 가정해봅시다. len(arr1)은 2, len(arr2)는 3입니다.

(2 > 3) - (3 > 2) : 이건 boolean 연산인데, 이게 숫자 연산으로 넘어가면 (0 - 1)이 되므로 -1이 됩니다.

이 때 -1 or (2번줄)이 되는데, 파이썬의 논리 연산자는 단락 평가(short-circuit evaluation)라고 해서 이미 결과가 확정되면 그 이후를 실행하지 않습니다. 여기서는 2번줄을 실행하지 않게 됩니다. 연산을 더 빠르게 할 수 있는 거죠.

따라서 예제 1번에서는 -1이 출력되게 됩니다.

 

2번 라인 실행을 위해 예제 3번을 사용해봅시다. len(arr1)과 len(arr2) 모두 5입니다.

첫 번째 줄은 0 - 0 이므로 0이 됩니다. 이제 0 or (2번줄)이 되었으므로, 결과를 아직 확정지을 수 없어 2번줄이 실행됩니다.

두 번째 줄 역시 첫 번째와 동일한 구조입니다.

[ sum(arr1) > sum(arr2) ]와 같은 boolean 연산이 진행되고, 그 결과로 숫자 연산이 진행됩니다.

이 경우에는 sum(arr1), sum(arr2) 모두 15이므로 False - False = 0 - 0 = 0이 되는 거죠.

따라서 0 or 0이 되므로, 최종 답안은 0이 됩니다.

 

or 연산을 잘 활용한 풀이라 한번 해석해보았습니다.