PS/Softeer

[인증평가(4차) 기출] 통근버스 출발 순서 검증하기 - lv3

ForteQook 2022. 10. 19. 15:24

문제

Softeer

 

Softeer

문제에서 주어진 조건을 만족하는 서로 다른 (i, j, k) 순서쌍의 개수를 출력한다. 첫 번째 위치에는 2번 버스, 두 번째 위치에는 3번 버스, 그리고 세 번째 위치에는 1번 버스가 기다

softeer.ai

풀이

Softeer

 

Softeer

안녕하세요. Softeer 운영 담당자 입니다. 지난 9월 6일에 Softeer 4회 정기 인증평가가 실시되었습니다. 이번 역량 진단에도 많은 분들께서 관심을 가지고 참여하여 주셨습니다. 인증을 받으신 분들

softeer.ai

도저히 풀 수 없어 풀이를 봤다. 결국 DP 문제였는데, 버스 번호가 1 부터 N까지 자연수로 정해져 있다는 점에 착안하여 어떤 버스 번호 X와 주어진 배열 A 에서의 인덱스 j 에 대해서 dp[X][j] 를 j 번째 보다 오른쪽에 있는 번호들 중 X 보다 작은 번호들의 개수로 둔다. 여기서 i < j 를 만족시키면서 A 를 이중 순회하며 A[i] < A[j] 인 경우를 찾아내면 된다.

구간합 문제를 거의 풀어보질 않아서, 해설에서와 같이 이 문제가 구간합 유형이라는것은 이해하지 못하겠다.

N = int(input())
A = [0] + list(map(int,input().split()))
dp = [[0]*(N+1) for _ in range(N+1)]

answer = 0
for x in range(1,N+1):
    dp[x][N]=0
    dp[x][N-1] = 1 if A[N]<x else 0
    for j in range(N-2,0,-1):
        if(A[j+1]<x):
            dp[x][j] = dp[x][j+1] + 1  
        else: 
            dp[x][j] = dp[x][j+1]

for i in range(1,N-1):
    for j in range(i+1,N):
        if(A[i]<A[j]):
            answer+=dp[A[i]][j]


print(answer)

'PS > Softeer' 카테고리의 다른 글

[21년 재직자 대회 예선] 회의실 예약 - lv2  (0) 2022.10.04
[인증평가(3차) 기출] 교차로 - lv3  (0) 2022.10.02