[백준알고리즘] 10773번 제로
2024. 1. 25. 08:34ㆍ백준알고리즘/구현
728x90
문제출처
https://www.acmicpc.net/problem/10773
알고리즘 유형
알고리즘 분류: 구현
언어: JAVA
문제
접근
입력된 값들의 합계를 구함. 단,0이 입력될 경우 바로 이전 값은 합계에서 제외
1. 첫번째 입력값(K 총 건수)을 제외하고 입력값을 리스트로 받음
:: 처음엔 배열을 생각했다가 각 요소를 제거해야하는 상황이 있으므로, 구조체를 리스트로 변경 적용
2. while문 내부에서 요소 값이 '0' 일 경우 체크
:: 처음엔 for문을 적용했다가 증감변수를 조건에 따라 증감시킬 수 있도록 컨트롤하기 위해 While문 사용
:: for문 사용시 무조건 증감연산자를 적용해야하기에 불필요하다고 판단
3-1. 리스트 내 값이 0일 경우 해당 인덱스 제거
3-2. 리스트 내 값이 0일 경우 해당 인덱스-1(이전요소) 함께 제거
:: 마지막 결과값으로 SUM을 하기 위해 아예 요소값을 제거하도록 처리
:: 순서는 0인 인덱스 제거 후 이전인덱스를 제거 하도록 함. 반대순서로 처리할 경우 이전인덱스가 먼저 제거되기 떄문에 기존 0인 인덱스가 1 당겨짐으로 영향이 있음.
4. 결과값 출력
package org.example.question.구현;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/*
* 문제: 나코더 기장 재민이는 동아리 회식을 준비하기 위해서 장부를 관리하는 중이다.
* 재현이는 재민이를 도와서 돈을 관리하는 중인데, 애석하게도 항상 정신없는 재현이는 돈을 실수로 잘못 부르는 사고를 치기 일쑤였다.
* 재현이는 잘못된 수를 부를 때마다 0을 외쳐서, 가장 최근에 재민이가 쓴 수를 지우게 시킨다.
* 재민이는 이렇게 모든 수를 받아 적은 후 그 수의 합을 알고 싶어 한다. 재민이를 도와주자!
*
* 입력: 첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000)
* 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경우 해당 수를 쓴다.
* 정수가 "0"일 경우에 지울 수 있는 수가 있음을 보장할 수 있다.
*
* 출력: 재민이가 최종적으로 적어 낸 수의 합을 출력한다. 최종적으로 적어낸 수의 합은 231-1보다 작거나 같은 정수이다.
* */
public class 재시도_Q10773 {
public static void main(String[] args) {
//1. 입력
// 입력 받는 수를 배열에 받음
// (변경) 리스트로 받음 (0이 존재할 경우 0인 인덱스 포함 이전 요소 인덱스까지 리스트에서 제거를 위함)
Scanner sc = new Scanner(System.in);
int K = sc.nextInt();
List<Integer> iptList = new ArrayList<>();
for (int i = 0; i < K; i++) {
iptList.add(sc.nextInt());
}
//2. 최종값 출력 전 입력 받은 배열 정리 (0이 있으면 기존 숫자 지우기)
// ex. 1 3 4 0 0 0 1 3
int listSize = K; //리스트요소를 아예 제거하는 경우가 있으므로 리스트 사이즈는 줄어듬
int i=0;
//while문으로 변경 (강제로 i를 증가시킬 필요없이 i를 코드상에서 제어를 위함)
while(i < listSize){
if (iptList.get(i)== 0) {
//제거순서 (1) 0인요소먼저제거 -> 이전요소제거 :: 순서 바꿔서 이전요소 먼저 제거 후 i번째 제거시 0 다음 요소가 제거됨
iptList.remove(i); //값이 0인 요소 제거
iptList.remove(i-1); //이전 가장 최근 요소 제거
if (i != 0) {
i -= 1; //2개의 요소를 제거했으므로 다음 순번을 '-1'
}
listSize -= 2; //2개의 요소를 제거했으므로 list size '-2'
}else{
i++;
}
}
System.out.println(iptList.stream().mapToInt(v->v).sum());
}
}
728x90
'백준알고리즘 > 구현' 카테고리의 다른 글
[백준알고리즘] 2920번 음계 (2) | 2024.01.26 |
---|---|
[백준알고리즘] 2738번 행렬 덧셈 (0) | 2024.01.22 |