[SWEA][D3][#01206] View

작성:    

업데이트:

카테고리:

태그: , ,

문제

보안 규정상 생략


My Sol

for tc in range(1, 11):
    N = int(input())
    arr = list(map(int, input().split()))

    result = 0
    for i in range(2, N-2):
        # a, b, c, d 에 중앙값과 주위 값들의 차이를 각각 저장
        a, b, c, d = (arr[i] - arr[i-2]), (arr[i] - arr[i-1]), (arr[i] - arr[i+1]), (arr[i] - arr[i+2])

        # 만약 차이가 모두 양수, 즉 중앙값이 가장 크면
        if a>0 and b>0 and c>0 and d>0:
            # 가장 적게 차이나는 수 구하기
            min_val = a
            for k in [b, c, d]:
                if min_val > k:
                    min_val = k
            # 결과에 이를 더함
            result += min_val

    print(f'#{tc} {result}')

테스트 케이스는 10개로 고정되어있기 때문에 range(1, 11)로 고정시켰다.

idx를 2부터 배열 크기 -2까지 반복해서 조회하는데, 중앙값을 기준으로 -2, -1, 1, 2의 값과 중앙값의 차를 구한다. 만약 이 차이가 모두 양수라면 중앙값이 가장 크다는 뜻이므로, 모두 자연수인 뺄셈값 중에 가장 작은, 즉 5개 값 중에 차댓값을 찾아 이 차이를 결과에 더해준다. 이렇게 중앙값이 가장 큰 경우에만 차이를 결과에 더해주며 출력하면 되겠다.


결과

Pass


모범답안

for a in range(10):
    L = int(input())
    arr = list(map(int, input().split()))
    cnt = 0
    for i in range(2,L-2):
        arr_rl = [arr[i-2],arr[i-1],arr[i+1],arr[i+2]]
        maxV = arr[i-2]
        for j in arr_rl:
            if j > maxV:
                maxV = j
        if arr[i] > maxV:
            cnt += arr[i]-maxV
    print(f'#{a+1} {cnt}')

동기의 코드이다. 나는 처음부터 차이를 구해서 양수인지를 판단했는데, 그냥 주변 값을 리스트에 넣어 이 안에서 최댓값을 구하고, 이것보다 중앙값이 큰 경우에만 그 차이를 결과에 더해준다. 이렇게 되면 중앙값이 최대인지 판단하기 이전에 정렬을 매번 사용해야하므로 연산 시간이 길 것이라고 생각했으나, 연산 시간은 내 코드보다 빨랐다. 내가 차이를 4번 구하고 이를 if문에서 각각 양수인지 판단하는 과정보다 이 코드가 효율적인 모양이다.

댓글남기기