백준 큰 수 계산

KIMYEONGJUN·2024년 10월 30일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

수의 개수 N(1 ≤ N ≤ 10) 이 주어지고 다음 2N-1 개의 줄에는 수와 연산자(+, -, *, /) 가 번갈아서 들어온다.

첫째 줄에 계산이 끝난 후 수를 출력한다.

내가 이 문제를 보고 생각해본 부분

N은 수의 개수이다. 
이 값에 따라 연산자와 숫자가 몇 번 입력될지를 결정한다.
opt는 연산자를 저장하는 리스트이고, 
list는 숫자를 저장하는 리스트이다.
첫 번째 숫자를 list에 추가한다.
N이 1보다 클 동안 반복한다. 
각 반복에서 연산자와 다음 숫자를 읽는다.
+ 또는 - 연산자는 단순히 리스트에 숫자를 추가하고,
연산자도 함께 저장한다.
마지막 숫자와 다음 숫자를 곱한다.
pollLast() 메서드는 리스트의 마지막 요소를 꺼내고,
그 값을 곱한 후 결과를 리스트에 추가해준다.
두 숫자의 부호가 다르면,
나눗셈을 수행하기 전에 next.subtract(BigInteger.ONE)을 통해 1을 빼고,
이를 subtract 연산에 사용합니다. 이는 소수점 내림 처리를 위한 방법이다.
두 숫자의 부호가 같으면 단순히 나누기만 수행한다.
리스트의 첫 번째 숫자를 BI에 저장한다.
연산자 리스트를 순회하면서 각 연산자를 기반으로 최종 결과를 계산한다.
+는 더하고, -는 빼는 방식으로 처리한다.

코드로 구현

package baekjoon.baekjoon_24;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.math.BigInteger;
import java.util.LinkedList;

// 백준 2408번 문제
public class Main822 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int N = Integer.parseInt(br.readLine());
        LinkedList<Character> opt = new LinkedList<>();
        LinkedList<BigInteger> list = new LinkedList<>();
        list.push(new BigInteger(br.readLine()));

        while(N --> 1) {
            char nextOpt = br.readLine().charAt(0);
            BigInteger next = new BigInteger(br.readLine());

            if(nextOpt == '+' || nextOpt == '-') {
                list.add(next);
                opt.add(nextOpt);
            } else if(nextOpt == '*') {
                list.add(list.pollLast().multiply(next));
            } else {
                if(list.getLast().compareTo(BigInteger.ZERO) != next.compareTo(BigInteger.ZERO)) {
                    list.add(list.pollLast().subtract(next.subtract(BigInteger.ONE)).divide(next));
                } else {
                    list.add(list.pollLast().divide(next));
                }
            }
        }

        BigInteger BI = list.get(0);

        for(int i = 0; i < opt.size(); i++) {
            if(opt.get(i) == '+') {
                BI = BI.add(list.get(i + 1));
            } else {
                BI = BI.subtract(list.get(i + 1));
            }
        }

        bw.write(BI.toString());
        bw.close();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글