본문 바로가기
코딩 테스트 문제 풀이

Do it 알고리즘 코딩 테스트 - 10번

by 김복칠 2023. 10. 27.

문제.

https://www.acmicpc.net/problem/11003

 

11003번: 최솟값 찾기

N개의 수 A1, A2, ..., AN과 L이 주어진다. Di = Ai-L+1 ~ Ai 중의 최솟값이라고 할 때, D에 저장된 수를 출력하는 프로그램을 작성하시오. 이때, i ≤ 0 인 Ai는 무시하고 D를 구해야 한다.

www.acmicpc.net


코드.

n,m = map(int,input().split())
a = list(map(int,input().split()))

B = []

for i in range(m-1):
    c = []
    c = a[0:i+1]
    B.append(min(c))

for i in range(n-m+1):
    b = []
    b = a[i:i+m]
    B.append(min(b))

for i in B:
    print(i,end=' ')
입력 값 출력 값
12 3

1 5 2 3 6 2 3 7 3 5 2 6
1 1 1 2 2 2 2 2 3 3 2 2

해석 및 풀이.

★ 이 문제는 입력받을 임의의 숫자의 개수 N과 구간의 갯수 M을 받고 M의 구간안에 있는 최솟값을 찾아 출력하는 프로그램을 만드는 문제입니다.

n,m = map(int,input().split())
a = list(map(int, input().split()))

B = []

먼저 범위와 최솟값을 구할 범위를 입력받아 줍니다. 이후 범위만큼의 임의의 수를 받을 리스트 a 를 만들어 줍니다. 그리고 구간별 최솟값을 받을 리스트 B 를 만들어 줍니다.

for i in range(m-1):
    c = []
    c = a[0:i+1]
    B.append(min(c))

그리고 인덱스를 통해 최솟값을 추출해 주는데 여기서 0번째 인덱스 숫자와 m-1번째 인덱스 숫자까지는 범위 m이 적용되지 않습니다. 따라서 그 구간만큼은 별도로 최솟값을 추출해 주는데 예를 들어 범위가 3이라고 주어졌을 때 a[0:1] 구간의 최솟값은 a[0] 혼자이며 a[0:2] 구간의 최솟값은 a[0],a[1] 이렇게 두개만 비교하면 됩니다. 따라서 구간의 범위를 충족하기 전의 구간은 최솟값을 따로 구해주어야 합니다. 그리고 리스트 B 에 순차대로 넣어줍니다.

for i in range(n-m+1):
    b = []
    b = a[i:i+m]
    B.append(min(b))

for i in B:
    print(i,end=' ')

이후 입력된 구간의 최솟값을 구해주어야하는데 반복문의 범위는 입력된 값의 숫자에서 앞에서 미리 구했던 숫자를 제외한 범위만큼 돌려주고 리스트 B 에 넣어줍니다. 마지막으로 리스트 b 에 입력된 값을 반복문을 이용하여 print로 가로로 나열해서 출력해줍니다.