사실 이 문제는 문제를 이해하는데 더 시간이 걸렸다.
예제를 보면 입력이 2 4 7 10 인데 이 중 A_i X A_j 의 최대가 28이라는 게 이해가 안됐다. 입력이 2 4 7 10이면 단조인 수이고 따라서 최대값은 70이 되어야 되는거 아닌가? 라고 생각했다.
하지만 계속 문제를 보다보니 이 문제는 아래와 같았다.
2x4, 2x7, 2x10, 4x7, 4x10, 7x10을 진행한다.
결과로 8, 14, 20, 28, 40, 70이 나오게된다.
이 중 단조로운 수는 8, 14, 28이고 그 중 가장 큰 값은 28이기에 답이 28이 되는 것이다.
따라서 아래와 같이 문제 풀이 계획을 세울 수 있었다.
아래와 같이 danjo라는 리스트에 A[i]xA[j]를 넣어주었다. 이렇게 되면 모든 경우의 수의 곱이 danjo리스트에 입력된다.
for test_case in range(1, T + 1):
N = int(input())
A = list(map(int, input().split()))
danjo = []
result = -1
for i in range(N-1):
for j in range(i+1, N):
danjo.append(A[i]*A[j])
아래의 코드에서 isitdanjo함수는 val값이 danjo인지 확인하기 위해 만들어준 함수이다. 단조인 수라면 True를 반환, 아니라면 False를 반환한다.
따라서 단조로운 수일 때 최댓값을 저장하고 있는 result보다 크다면 result를 갱신하는 방식으로 최댓값을 구한다.
for i, val in enumerate(danjo):
if isitdanjo(val):
if val>result:
result = val
else:
continue
isitdanjo함수는 아래와 같다.
확인하기 편하도록 int를 str로 변환해주고 인덱스 1부터 진행하면서 단조로운 수에 위배되면 False를 return, 끝까지 돌았는데 아무 이상 없다면 True를 리턴한다.
def isitdanjo(d):
string = str(d)
for i in range(1, len(string)):
if string[i-1] > string[i]:
return False
return True
T = int(input())
def isitdanjo(d):
string = str(d)
for i in range(1, len(string)):
if string[i-1] > string[i]:
return False
return True
for test_case in range(1, T + 1):
# 입력의 곱들 1자로 나열
# 그중 단조 확인하면서 최댓값에 저장하기.
N = int(input())
A = list(map(int, input().split()))
danjo = []
result = -1
for i in range(N-1):
for j in range(i+1, N):
danjo.append(A[i]*A[j])
for i, val in enumerate(danjo):
if isitdanjo(val):
if val>result:
result = val
else:
continue
print(f'#{test_case} {result}')