[백준알고리즘] 10773번 제로

2024. 1. 25. 08:34백준알고리즘/구현

728x90

문제출처

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

 

10773번: 제로

첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000) 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경

www.acmicpc.net


알고리즘 유형

알고리즘 분류: 구현

언어: 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