fromzero
쪼렙 성장기
fromzero
전체 방문자
오늘
어제
  • Home
    • TIL
      • Python
      • HTML&CSS
      • Django
      • React
      • React Native
      • Git & Jira
      • Tech News
    • Algorithm
      • SW Expert Amademy
      • Baekjoon Online Judge
    • SSAFY
    • Daily log

인기 글

최근 댓글

최근 글

글쓰기 | 설정
hELLO · Designed By 정상우.
fromzero

쪼렙 성장기

4835. 파이썬 S/W 문제해결(알고리즘) | 구간합
Algorithm/SW Expert Amademy

4835. 파이썬 S/W 문제해결(알고리즘) | 구간합

2022. 2. 14. 21:58
문제 4835

[입력] 
첫 줄에 테스트 케이스 개수 T가 주어진다.  ( 1 ≤ T ≤ 50 )
다음 줄부터 테스트케이스의 첫 줄에 정수의 개수 N과 구간의 개수 M 주어진다. ( 10 ≤ N ≤ 100,  2 ≤ M < N )
다음 줄에 N개의 정수 ai가 주어진다. ( 1 ≤ a ≤ 10000 )
 
[출력] 
각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.

출처 SWEA

문제에 대한 모든 권리는 SW Expert Academy에게 있습니다.

 

 

2월 10일에 풀었을 때에는 구간합을 컨테이너(리스트)에 담아서 다시 for문을 돌려 최댓값과 최솟값을 구하는 방식으로 문제를 해결했다.

오늘 수업을 통해 최댓값이나 최솟값을 구해야하는 대상이 주어지지 않은 상황이라면!

즉, 이 문제처럼 계산을 통해 새롭게 구한 값 중에서 최댓값이나 최솟값을 구해야 하는 상황에서는 구한 값을 모두 리스트에 담아서 다시 계산할 것이 아니라 구한 값을 매번 비교하며 조건에 일치할 때 변수에 담아주면 된다는 꿀~~팁을 얻었다.

그래서 새롭게 코드를 짜보았다.

 

우선 처음 내가 풀었던 방식이다.

 

1) sort를 사용할 경우

T = int(input())

for tc in range(1, T+1):
    N, M = map(int, input().split())
    # 원본 숫자는 리스트에 담아두자
    nums = list(map(int, input().split()))
    # 숫자를 더할 변수와 더한 숫자를 담아둘 리스트
    total = 0
    totals = []
    # nums를 순회하면서 => 슬라이싱을 사용하면 for문 1개만 써도 됨
    for i in range(0, N-M+1):
        # M씩 묶어서 더하고
        for idx in range(i, i+M):
            total += nums[idx]
        # 묶어서 더한 숫자는 리스트에 추가하고
        totals.append(total)
        # 새로운 묶음으로 더해야 하므로 total은 다시 0으로 초기화
        total = 0
    # 더한 값이 담긴 리스트를 정렬하자
    sorted_totals = sorted(totals)
    print(f'#{tc} {sorted_totals[-1] - sorted_totals[0]}')

 

2) sort를 쓰지 않고 반복문을 통해 구하기

T = int(input())

for tc in range(1, T+1):
    N, M = map(int, input().split())
    # 원본 숫자는 리스트에 담아두자
    nums = list(map(int, input().split()))
    # 숫자를 더할 변수와 더한 숫자를 담아둘 리스트
    total = 0
    totals = []
    # nums를 순회하면서 => 슬라이싱을 사용하면 for문 1개만 써도 됨
    for i in range(0, N-M+1):
        # M씩 묶어서 더하고
        for idx in range(i, i+M):
            total += nums[idx]
        # 묶어서 더한 숫자는 리스트에 추가하고
        totals.append(total)
        # 새로운 묶음으로 더해야 하므로 total은 다시 0으로 초기화
        total = 0
    # sort를 쓰지 않고 더한 값이 담긴 리스트를 정렬하자
    length = len(totals)
    for j in range(length-1, 0, -1):
        for k in range(0, j):
            if totals[k] > totals[k+1]:
                totals[k], totals[k+1] = totals[k+1], totals[k]
    print(f'#{tc} {totals[-1] - totals[0]}')

 


sort도 추가적인 반복문도 필요 없는 ! 오늘 푼 방식

 

T = int(input())

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

    # 주어진 리스트를 돌면서 M개씩 더하자
    # 최종적으로 출력할 최댓값을 담을 변수와 최솟값을 담을 변수
    step_max = 1 # 문제에서 주어진 조건을 활용하자
    step_min = 10000 * M # 주어질 최대값은 10000이므로 이를 M개씩 더하면 최대값음 10000*M
    
    for i in range(N-M+1): # 인덱스 범위를 벗어나지 않도록 range를 설정한다
        step_sum = 0       # 구간합을 더해줄 변수
        for j in range(i, i+M): # i, i+1, i+2, ..., i+(m-1) 까지 더하도록 반복
            step_sum += arr[j]
            
        if step_max < step_sum: # 최댓값 구하기
            step_max = step_sum
        if step_min > step_sum: # 최솟값 구하기
            step_min = step_sum

    print(f'#{tc} {step_max - step_min}')

 

저작자표시 (새창열림)

'Algorithm > SW Expert Amademy' 카테고리의 다른 글

SWEA 1974. 스도쿠 검증 (파이썬)  (0) 2022.02.27
SWEA 1208. Flatten (파이썬)  (0) 2022.02.27
6209, 6216. 파이썬 연산자 연습 문제  (0) 2022.01.25
6206. 파이썬 연산자 연습 문제  (0) 2022.01.25
6314. 파이썬 내장함수 연습문제 2  (0) 2022.01.16
    'Algorithm/SW Expert Amademy' 카테고리의 다른 글
    • SWEA 1974. 스도쿠 검증 (파이썬)
    • SWEA 1208. Flatten (파이썬)
    • 6209, 6216. 파이썬 연산자 연습 문제
    • 6206. 파이썬 연산자 연습 문제
    fromzero
    fromzero

    티스토리툴바