메이쁘

(JAVA) 백준 2033번 : 반올림 --- [수학, 구현] 본문

Algorithm/Baekjoon

(JAVA) 백준 2033번 : 반올림 --- [수학, 구현]

메이쁘 2020. 9. 17. 22:49

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

 

2033번: 반올림

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

www.acmicpc.net

 

안녕하세요.

 

구현인 줄 알았다가 수학까지 하게된 문제입니다.

 

 

이 문제는 간단해서 소스코드만 참고해도 이해하실 수 있다고 생각합니다.

 

 

아!

 

저는 정수형으로 풀지 않고 문자형으로 변환해서 숫자 하나하나 접근하는 방식을 사용했습니다.

 

그런데 여기서는 시간이 더 걸리더라구요.

 

이렇게 접근하는 방법은 아마 정수형으로 사용할 수 없는 문자열 길이에 사용하면 적합할 것 같습니다.

 

 

그렇기 때문에

 

가장 메모리와 시간이 낮은 정답 소스코드도 함께 첨부하겠습니다.

*** 출처는 @author 로 남겼습니다. 감사합니다.

 

 

- 수학적 방식으로 접근한 코드

/** 수학 식으로 접근하는 방법
		 * @author devetude
		 // 비교 변수 초기화
		int comp = 10;

		// 루프를 돌며 문제의 조건에 맞게 반올림 실행
		while (N > comp) {
			int nModComp = N % comp;

			if (nModComp * 10 / comp >= 5) {
				N += comp;
			}

			N -= nModComp;
			comp *= 10;
		}
		 */

 

 

 

 

필자의 소스코드(문자형 접근)


import java.util.Scanner;

// 수학, 구현 
// 반올림 
public class p2033 {
	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		String str = sc.next();
		char[] chArr = str.toCharArray();
		int len = chArr.length;
		
		int nextAdd = 0;
		StringBuilder sb = new StringBuilder();
		// 일의 자리부터 거슬러 올라가야 하므로 역순 탐색
		for(int i = len - 1; i >= 1; i--) {
			int num = (int) chArr[i] - '0';
			int nowNum = num + nextAdd;
			nextAdd = nowNum >= 5 ? 1 : 0;
			sb.append(0);
		}
		
		// 가장 맨 앞자리부터 반올림한 결과 얻기
		sb.insert(0, (int)(chArr[0] - '0') + nextAdd);
		System.out.println(sb.toString());
	}
}

 

 

감사합니다.

 

Comments