백준 반올림 (99클럽 코딩테스트 33일차 TIL)

KIMYEONGJUN·2024년 4월 30일
0
post-thumbnail

목표

한가지 방법으로 문제를 푸는게 아니라 여러가지 방법으로 문제에 접근해서 풀어볼 수 있는 능력을 키우는게 목표이다.

문제

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

정수 N이 주어져 있을때 이 수가 10보다 크면 일의 자리에서 반올림
이 결과가 100보다 크면 다시 10의 자리에서 반올림
이 수가 1000보다 크면 100의 자리에서 반올림

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

N이 10보다 크면 일의 자리에서 반올림 
N이 100보다 크면 십의 자리에서 반올림 
N이 1000보다 크면 백의 자리에서 반올림 
이런식으로 코드를 작성해주면 되는줄 알았다.

코드로 구현

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        if(N < 10) {
            System.out.println(N);
        }
        else if(N < 100) {
            N = (N/10 + 1) * 10;
            System.out.println(N);
        }
        else if(N < 1000) {
            N = (N/100 + 1) * 100;
            System.out.println(N);
        }
        else if(N < 10000) {
            N = (N/1000 + 1) * 1000;
            System.out.println(N);
        }
        else if(N < 100000) {
            N = (N/10000 + 1) * 10000;
            System.out.println(N);
        }
        else if(N < 1000000) {
            N = (N/100000 + 1) * 100000;
            System.out.println(N);
        }
        else if(N < 10000000) {
            N = (N/1000000 + 1) * 1000000;
            System.out.println(N);
        }
        else {
            N = (N/10000000 + 1) * 10000000;
            System.out.println(N);
        }
        br.close();
    }
}

어제 스터디하면서 어떤분이 일일이 코드를 작성하시고 시도를 해보려고 노력했다.

처음에 위에 코드를 가지고 제출했는데 계속 틀렸다고 나왔다. 그래서 다른 방법으로 코드를 시도해봤다.

코드로 구현

package baekjoon.baekjoon_18;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 백준 2033번 문제
public class Main637 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        int[] arr = new int[str.length()];
        for (int i = 0; i < str.length(); i++) {
            arr[str.length()-i-1] = str.charAt(i) - '0';
        }

        for (int i = 0; i < arr.length-1; i++) {
            arr[i+1] += arr[i]>=5?1:0;
        }

        StringBuilder sb = new StringBuilder();
        sb.append(arr[arr.length-1]);
        for (int i = 0; i < str.length()-1; i++) {
            sb.append('0');
        }
        System.out.println(sb);
        br.close();
    }
}

입력된 숫자를 각 자리수로 쪼개서 저장한 뒤 오른쪽부터 왼쪽으로 반올림을 수행하는 방식으로 작성해봤다.

시간복잡도 O(N)

장점
입력 데이터 크기에 상관없이 빠르게 수행된다.
코드가 단순하고 이해하기 쉽다.

단점
데이터 크기가 엄청나게 커지면 연산 시간이 오래 걸릴 수 있다.
입력값에 따라 시간복잡도 차이가 크지 않다.

다행이 위에 코드를 사용해서 통과는 할 수 있었다.

마무리

오늘은 코드를 풀어보면서 첫번째 방법이 아니면 두번째 방법으로 풀어보는 연습을 해봤다. 첫번째 방법으로 아직 완전히 풀지는 못했지만 다시 코드를 작성해서 풀어볼 예정이다.

profile
Junior backend developer

0개의 댓글