본문 바로가기

코딩

[TopCoder 알고리즘] 전체탐색 - 암호

Problem : Cryptography

 

TopCoder Security Agency (TSA)는 새로운 암호화 시스템을 개발했다. 이 시스템은 암호화를 위해 숫자 리스트를 입력받는다. 

당신은 TSA의 비밀 정보 수사원이다. 암호화 과정에서 중요한 부분을 구현하는 것이 당신의 임무이다. 당신은 입력 리스트에서 1개의 값을 선택하고 값을 1 증가시킨다. 이때 리스트 내부의 모든 숫자 곱이 가장 커져야 한다.

int[] numbers 형태로 숫자 배열이 주어질 때 곱의 최댓값을 리턴하라. 리턴값이 2^62를 넘는 문제는 나오지 않는다. 

 

 

제약 조건 :

 

capacities : 2-50개의 요소라 있는 배열이며 각 요소의 값은 1-1000이다

리턴값 2^62를 넘지 않는다

 

 

예시 :

numbers = {1 , 2 , 3}

Returns : 12

 

numbers = {1 , 3 , 2 , 1 , 1 , 3}

Returns : 36

 

 

 


문제 해설

 

문제의 핵심은 1을 더했을 때 모든 요소의 곱을 값을 가장 크게 만드는 요소를 하나 고르고, 그 결과를 리턴하는 것이다.

 

직관적으로 생각하면 주어진 리스트에서 가장 작은 값, 즉 최솟값을 구한 후 해당 값에 1을 더한 후 전체 요소를 곱해 리턴하면 된다. 해당 요소의 값을 1 증가시켰을 때 전체의 값이 가장 크게 증가하려면 증가시키기 전 해당 값을 제외한 나머지 요소들의 값이 가장 크면 되기 때문이다. 

 

이러한 빠른 해법을 발견했다면

 

① 최솟값을 찾고

② 해당 값을 제외한 나머지 요소의 곱을 리턴 하면 가장 쉽게 문제를 해결할 수 있다.

 

 

하지만 이런 해법을 발견하지 못했더라도,

각 요소를 탐색하며 전체 곱을 구해보고 그중 최댓값을 리턴하는 전체 탐색의 방식을 통해 문제를 해결할 수 있다.

 


Python

 

먼저 전체 탐색을 통해 문제의 해결하는 코드는 아래와 같이 짤 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def Cryptography(numbers):
  result = - float("inf")  
 
  for i in range(len(numbers)) :
    temp_res = 1
    for k, n in enumerate(numbers) :
      if k == i : 
        temp_res *= (n + 1)
      else:
        temp_res *= n
    
    if temp_res > result :
      result = temp_res
 
  return result
cs

 

line 2 : 리턴할 값의 초기값을 -Inf로 설정 

line 4 : 주어진 numbers 리스트의 인덱스 대해 for loop 돌기

line 5 : 곱셈 값 temp_res의 초기값을 1로 설정

line 6 : numbers 리스트의 각 요소에 대해

line 7-8 : 해당 요소의 인덱스 k가 현재 체크하려는 인덱스 i와 같으면 요소에 1을 더해 곱하기

line 9-10 : 나머지 요소는 해당 요소를 곱해 temp_res를 구하기

line 12-13 : 이번에 체크한 값이 기존의 최대값(result)보다 크면, 이번 이터레이션에서 구한 값을 result에 저장

line 15 : 결과 리턴

 

 

Test Case 실행 예시 :