오늘도 간단한 문제입니다.
전체 탐색을 이용한 문제이며 약간의 수학적 시직이 있으면 좀더 효과적인 코드를 작성할 수 있습니다.
문제
TopCoder Security Agency는 새로운 암호화 시스템을 개발했습니다. 이 시스템은 암호화하려고 숫자 리스트를 입력받습니다.
여러분은 TSA의 비밀 정보 수사원입니다. 암호화 과정에서 중요한 부부을 구현하는 것이 여러분의 일이빈다. 여러분은 입력 리스트엣 1개의 값을 선택하고 값을 1 증가시킵니다. 이때 리스트 내부의 모든 숫자 곱이 가장 커져야 합니다.
int[] numbers 형태로 숫자 배열이 주어질 때 곱의 최댓갑을 리턴하세요. 리턴값이 2의 62승을 넘는 문제는 나오지 않을 것입니다.
해석
Test Case#1 입력 = 1, 2 ,3 / 출력 = 12
Test Case#2 입력 = 1, 3, 2, 1, 1, 3 / 출력 = 36
문제는 그렇게 어렵지 않습니다.
입력 값 중에 하나를 선택하여 값을 1 증가시키고 나머지와 곱했을 때 가장 큰 값을 구하는 것입니다.
#1을 봤을 때
1 선택 |
2 X 2 X 3 |
12 |
2 선택 |
1 X 3 X 3 |
9 |
3 선택 |
1 X 2 X 4 |
8 |
이렇게 됩니다. 결국 제일 큰 값은 12가 됩니다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public static long encrypt(int[] numbers) { long ans = 1; for (int i = 0; i < numbers.length; i++) { long n = 0; n = numbers[i] + 1; for (int j = 0; j < numbers.length; j++) { if (i == j) continue; n = n * numbers[j]; } ans = Math.max(ans, n); } | cs |
저는 이렇게 작성을 했습니다. 책에는 수학적 지식을 이용하여 엄청 가단하게 작성을 해놨습니다.
어느 정도의 수학적 지식을 가지고 있다면 코딩을 작성하는데도 많은 도움을 주는 것 같습니다.
지금 당장 수학을 공부할 필요는 없겠지만 시간나면 조금식 공부해두면 충분히 도움을 받을 수 있을 것 같습니다.
'Project > Algorithm' 카테고리의 다른 글
[백준 알고리즘] 1010 다리 놓기 (0) | 2017.11.14 |
---|---|
[TopCoder] 고장난 로봇 (1) | 2017.11.12 |
[TopCoder] 초급 - 전체 탐색 (0) | 2017.10.24 |
[TopCoder] 초급 - 시뮬레이션 (0) | 2017.10.24 |
[TopCoder] 탑코더를 시작하며 (0) | 2017.10.24 |
댓글