코드

B 배열을 재배열하여 푸는 경우 (정답 인정이 된다…)

n = int(input())

# 배열 A
a = list(map(int, input().split()))

# 배열 B
b = list(map(int, input().split()))

# 함수 S를 적용할 배열
answer = []

# 함수 S 구현
def _S(a, b, answer):
    a.sort()
    b.sort(reverse=True)
    for i in range(n):
        answer.append(a[i] * b[i])

    print(sum(answer))

_S(a, b, answer)    

B 배열을 재배열하지 않고 푸는 경우

n = int(input())

# 배열 A
a = list(map(int, input().split()))

# 배열 B
b = list(map(int, input().split()))

# 함수 S를 적용할 배열
answer = [] 

# 함수 S 구현
def _S(a, b, answer):
    # 배열 A 오름차순 정렬
    a.sort()
    
    for i in range(n):
        # B에 곱해줄 A의 원소
        _a = a[i]
        
        # B에서 가장  값의 인덱스 번호
        max_idx = b.index(max(b))
        
        # 가장  값을 pop하여 _b에 담아줌
        _b = b.pop(max_idx) 
    
        # 오름차순으로 정렬된 A의 원소 * B의 가장  값을
        # 각각 곱하고 answer에 저장
        answer.append(_a * _b)
    
    #  합을 출력
    print(sum(answer))    
    
_S(a, b, answer)

문제 해설

문제에 배열 B는 재배열하여서는 안 된다는 조건이 있지만, 건드려도 정답이 인정이 되기는 한다. 하지만 문제의 요구사항에 부합하지 않으므로 B를 건들이지 않고 해결하는 코드 또한 작성하였다.

문제의 핵심 로직과 이를 구현하는 방법은 아래와 같다.


  • 핵심 로직 : 배열 A의 가장 작은 값과 배열 B의 가장 큰 값을 서로 곱하게 A를 정렬한다.

  • 구현

    • 배열 A : 오름차순으로 정렬
    • 배열 B : 가장 큰 값의 인덱스를 가져와 해당 인덱스로 가장 큰 값을 pop하고 변수에 담음
    • 그 후, A의 요소와 B에서 pop한 요소를 순서대로 곱해준 후, answer 리스트에 저장
    • answer 리스트의 합을 sum() 함수로 도출

위의 과정을 코드화 시키면 두번째 코드와 동일하다. 문제의 요구사항에 부합하게 문제를 푸는 것이 가장 중요하므로 이를 어기지 않고 그 요구사항들을 확실하게 파악할 수 있는 스킬을 연습해야겠다.

댓글남기기