반응형
문제(암호)
TopCoder Security Agency(TSA, 오늘 설립되었어요!)는 새로운 암호화 시스템을 개발했습니다.
이 시스템은 암호화하려고 숫자 리스트를 입력받습니다.
여러분은 TSA의 비밀 정보 수사원입니다. 암호화 과정에서 중요한 부분을 구현하는 것이 여러분의 일입니다.
여러분은 입력 리스트에서 1개의 값을 선택하고 값을 1 증가시킵니다. 이때 리스트 내부의 모든 숫자 곱이
가장 커져야 합니다.
int[] numbers 형태로 숫자 배열이 주어질 때 곱의 최댓값을 리턴하세요. 리턴값이 2^62를 넘는 문제는 나오지 않을 것을 보장합니다.
입력
numbers : 2~50개의 요소가 있는 배열이며 각 요소의 값은 1~1000입니다.
출력
정수를 담고있는 변수
IO Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # Case# 0 numbers=[1, 2, 3] returns=12 # Case# 1 numbers=[1, 3, 2, 1, 1, 3] returns=36 # Case# 2 numbers=[1000, 999, 998, 997, 996, 995] returns=986074810223904000 # Case# 3 numbers=[1, 1, 1, 1] returns=2 | cs |
구현
1차 코드 : 각 배열의 요소마다 +1씩 번갈아 더해주며 모든 값의 곱을 구한다.
구한 곱중 가장 큰 값의 경우를 리턴해준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public class Cryptography2 { public static void main(String[] args) { int[] numbers=new int[]{1,2,3};//입력값 System.out.println(encrypt(numbers));//출력 } public static long encrypt(int[] numbers){ long ans = 0; long temp = 1; for(int i = 0; i<numbers.length; i++ ){ temp=1; for( int j = 0; j<numbers.length; j++ ) { if( i ==j ) temp *= (numbers[j] + 1);//각 요소마다 번갈아가며 1씩 높은값을 곱해줌 else temp *= numbers[j];//나머지 요소 모두 곱해줌 } ans = Math.max(ans, temp);//최대값을 갱신 } return ans;//가장 큰 곱의 경우 리턴 } } | cs |
2차 코드 : 배열의값중 가장 작은 값에 +1을 해주고 모든값을 곱하는 것이 가장 큰 수를 만들어냄을 알아냈다. 그래서 배열의 요소를 오름차순으로 정렬하고 가장 작은 최소값을 +1해준후 모든 값을 곱한다.
1 2 3 4 5 6 7 8 9 10 11 | public static long encrypt(int[] numbers){ long temp = 1; Arrays.sort(numbers);//먼저 정렬 numbers[0]++;//가장 작은 최소값을 +1해준다 for( int j = 0; j<numbers.length; j++ ) { temp *= numbers[j];//모든값을 곱한다 } return temp; } | cs |
반응형
'Problem Solving > 탑코더 알고리즘 트레이닝' 카테고리의 다른 글
2. 전체 탐색(즐거운 파티) (0) | 2019.01.30 |
---|---|
1. 시뮬레이션 (0) | 2019.01.29 |