loading

알고리즘/알고리즘JAVA

[백준알고리즘/JAVA/while문] 10951번 문제 : A+B-4

침착곰 2021. 4. 25. 15:05
반응형

안녕하세요

백준알고리즘 단계별로 풀어보기 4단계 10951번 문제 A + B - 4를 풀어봤습니다

while문을 사용해서 풀어보는 문제입니다

맨 처음에 문제를 보고 ??? 했습니다

왜냐하면 while문이 끝나는 조건이 어디에도 없어서 당황했습니다 ㅠ

다른 블로그의 글을 참고해서 풀 수 있었습니다

지금까지 어디도 참고안하고 혼자서 정답을 풀었는데 슬프네요 ㅠㅠ

 

문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

 

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

 

출력

각 테스트 케이스마다 A+B를 출력한다.

 

 


문제 풀이

문제를 푼 방식에 대해서 알아보겠습니다

문제는 총 3가지의 방식으로 풀었습니다

 

1. Scanner방식

맨 처음은 제일 쉬운 방식 Scanner를 사용해서 풀어봤습니다

while문의 조건은 hasnextInt를 사용해서 Scanner에서 Int로 값이 반환되지 않으면 while문이 끝나도록 설정을 했습니다

최적화랑은 거리가 멀게 개발을 해서 속도는 그렇게 빠르지 않을 것입니다

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {	
		Scanner sc = new Scanner(System.in);
		
		while(sc.hasNextInt())
		{
			int a = sc.nextInt();
			int b = sc.nextInt();
			System.out.println(a + b);
		}
		
		sc.close();
	}
}

 

2. BufferedReader, charAt 방식으로 변수를 선언하지 않고 바로 출력하는 방식

두 번째 방법은 BufferedReader와 charAt을 사용해서 풀었습니다

중간에 보시면 보통은 int a, int b를 사용해서 중간변수에 데이터를 집어넣고 출력을 하지만 바로 append쪽에서 계산을 해서 집어넣어봤습니다

그 이유는 변수를 선언하지 않고 바로 넣으면 속도측면에서 조금 더 빠르지 않을까? 생각해서였습니다

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));
		StringBuilder sb = new StringBuilder();
		String str;
		
		while((str = br.readLine()) != null)
		{						
			sb.append((str.charAt(0) - 48) + (str.charAt(2) - 48) + "\n");
		}
		
		System.out.print(sb);
	}
}

 

3. BufferedReader, charAt 방식으로 변수를 선언하고 출력하는 방식

 세 번째 방식입니다

 위와 다르게 int a, int b를 넣어서 중간에 변수를 넣어서 데이터를 집어넣고 계산을 돌립니다

 이제 속도차이에 대해서 알아보겠습니다

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));
		StringBuilder sb = new StringBuilder();
		String str;
		
		while((str = br.readLine()) != null)
		{			
			int a = str.charAt(0) - 48;
			int b = str.charAt(2) - 48;
			
			sb.append((a+b) + "\n");
		}
		
		System.out.print(sb);
	}
}

 

속도 검증

중간에 에러 뜬 부분은 넘어가주시길... ㅠ_ㅠ

아래부터 1번, 2번, 3번 방식의 시간차이입니다

Scanner방식은 256ms

BufferedReader + 변수 선언x 방식은 152ms

BufferedReader + 변수 선언o 방식은 148ms

의 속도를 보여줬습니다

흐음... 중간에 변수를 선언하면 속도가 더 지연될 것 같은데 속도가 더 적게 걸린 것을 볼 수 있습니다

 

그 이유는 제 개인적인 생각으로는 append를 타는 도중에 charAt을 호출하기 때문에 그것을 변경하는 과정에서 메모리의 중간 누수가 더 크게 작용해서 2번째 방식이 3번째 방식보다 시간이 더 걸릴 것이라고 생각이 됩니다

그렇기 때문에 프로그래밍을 함에 있어서 중간에 계산로직을 끼우는 것보다 한 라인에서 계산을 끝내고 다른 라인에서는 이 역할을 하는 것이 프로그램 최적화에 있어서 가장 좋은 방법이라고 생각이 됩니다

이번 알고리즘 문제를 풀면서 프로그래밍을 함에 있어서 배운 점이 하나 있는 것 같아서 좋네요 ㅎ

 

여기까지 백준알고리즘 10951번 문제 A + B - 4를 풀은 내용이었습니다

알고리즘을 푸는데 제 글이 참고가 되셨으면 좋겠습니다 ㅎ

 

다음 문제 : 2021.04.30 - [알고리즘/알고리즘JAVA] - [백준알고리즘/JAVA/while문] 1110번 문제 : 더하기 사이클

이전 문제 : 2021.04.24 - [알고리즘/알고리즘JAVA] - [백준알고리즘/JAVA/while문] 10952번 문제 : A+B-5

반응형
그리드형