[백준 19951번] 태상이의 훈련소 생활 (Java)

2024. 7. 8. 20:59· [자료구조] 알고리즘
목차
  1. 문제
  2. 풀이
  3. 알고리즘 설계 [접근 방법] : 누적합+DP
  4. 풀이 과정
  5. 코드

끝없는 dp 생활!

 

이번 문제는 누적합+dp문제다.

맨날 똑같은 문제만 풀고

새로운 문제는 나몰라라해서

다양한 문제를 풀어보고자 골랐다.

 


문제

 

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

 

 

 

 


풀이

 

알고리즘 설계 [접근 방법] : 누적합+DP

모든 지시를 처음부터 끝까지 계산하면 시간 초과가 발생한다. 그러므로, 처음과 끝만 저장한 후 누적합으로 풀면 O(n)의 속도로 풀 수 있다.

처음부터 끝까지 계산해야 하는 k값을 입력받는다. 그리고 처음 시작하는 인덱스 a에 k값을 저장한 후 끝나는 지점, 즉 b+1지점에 -k값을 저장한다.

왜냐하면, a부터 끝까지 +k값을 계산한다고 가정하면, b+1지점부터 끝까지는 +k값을 계산하면 안된다. 그러므로 b+1지점부터는 -k값을 해주어야 하기 때문이다. 

 

1) 문제의 예시를 보면 1 5 -3을 보면 1번부터 5번까지 -3을 계산해야 한다. 그럼 인덱스 1번 배열에 -3을 저장하고, 끝난 후인 인덱스 6에 3을 저장한다

2) 두번째 지시인 6 10 5도 마찬가지로 인덱스 6번에 5를 저장하고, 인덱스 11에 -5를 저장한다.

3) 세 번째 지시인 2 7 2도 마찬가지로 인덱스 2번에 2를 저장하고, 인덱스 8에 -2를 저장한다.

 

표에 인덱스 1번부터 10번까지 나타났다고 해보자

-3 2       8   -2    

 

그럼 이제, 누적합을 할 차례다. 반복문을 돌면서 현재 값은 현재 값+전의 값이 된다.

첫 번째 인덱스는 -3을 계산해주면 되는 것이고, 두 번째 인덱스의 값은 -3+2이므로 -1값을 해주면 된다. 

누적합이 반복된 표는 아래와 같다.

-3 -1 -1 -1 -1 7 7 5 5 5

 

이 값을 처음 받은 배열의 값과 더하면 된다.

 

풀이 과정

1.

배열 길이 n과 지시 사항 개수 m을 입력받는다.

 

2.

배열이 1부터 시작이므로, 배열 arr의 크기를 n+1로 설정한다. 그리고 값을 입력받는다.

 

3.

배열이 1부터 n+1까지 필요하므로, 누적합 배열 dp를 n+2 크기만큼 설정한다.

지시 사항 개수 m만큼 지시 사항을 입력받는다.

시작 인덱스인 start, 끝 인덱스인 end, 그리고 계산해야 하는 값 k를 입력받은 후, dp[start]+=k를 dp[end+1]-=k를 계산한다,

 

4.

처음부터 끝까지 dp배열을 돌면서, dp[현재] = dp[현재]+dp[현재-1]값을 진행한다.

그리고 처음 입력받은 배열 arr과 더한 값을 StringBuilder에 저장한다.

 

5.

StringBuilder를 출력한다.

 


코드

 

import java.util.*;

public class Test_19951_태상이의훈련소생활 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int n = sc.nextInt();
		int m = sc.nextInt();
		
		int[] arr = new int[n+1];
		for(int i=1; i<arr.length; i++) {
			arr[i] = sc.nextInt();
		}
		
		//수행 : 누적합
		int[] dp = new int[n+2];
		for(int t=0; t<m; t++) {
			int start = sc.nextInt();
			int end = sc.nextInt();
			int k = sc.nextInt();
			
			dp[start] = dp[start]+k;
			dp[end+1] = dp[end+1]-k;
		}
		
		//출력
		StringBuilder sb = new StringBuilder();
		for(int i=1; i<arr.length; i++) {
			dp[i] = dp[i]+dp[i-1];
			sb.append((arr[i]+dp[i])+ " ");
		}
		
		System.out.println(sb.toString());
		
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'[자료구조] 알고리즘' 카테고리의 다른 글

[프로그래머스_Lv.1] 자동차 대여 기록에서 장기/단기 대여 구분하기 (MySQL)  (0) 2024.07.27
[백준 16439번] 인간-컴퓨터 상호작용 (Java)  (0) 2024.07.15
[프로그래머스_Lv.1] 소수 구하기 (Java)  (0) 2024.04.24
[프로그래머스_Lv.3] 연속 펄스 부분 수열의 합 (Java)  (0) 2024.04.21
[프로그래머스_Lv.3] 네트워크 (유니온파인드_Java)  (1) 2024.04.13
  1. 문제
  2. 풀이
  3. 알고리즘 설계 [접근 방법] : 누적합+DP
  4. 풀이 과정
  5. 코드
'[자료구조] 알고리즘' 카테고리의 다른 글
  • [프로그래머스_Lv.1] 자동차 대여 기록에서 장기/단기 대여 구분하기 (MySQL)
  • [백준 16439번] 인간-컴퓨터 상호작용 (Java)
  • [프로그래머스_Lv.1] 소수 구하기 (Java)
  • [프로그래머스_Lv.3] 연속 펄스 부분 수열의 합 (Java)
콩지연
콩지연
콩지연
콩알탄의 코딩 실력 폭발 도전기
콩지연
전체
오늘
어제
  • 분류 전체보기 (77)
    • [자료구조] 알고리즘 (55)
    • [CS] 네트워크 (1)
    • 백엔드 (11)
    • 자바 (0)
    • 다양한 후기 (0)
    • 영어 (1)

인기 글

최근 글

hELLO · Designed By 정상우.v4.2.1
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.