loading

알고리즘/알고리즘JAVA

[백준알고리즘/문자열] 2908번 문제 : 상수(자바/JAVA)

침착곰 2021. 5. 17. 20:35
반응형

안녕하세요

백준 알고리즘 단계별로 풀어보기 7단계 상수를 풀어봤습니다

이번 문제는 보는 순간 reverse()를 사용해서 풀면 될 것 같다는 생각을 했습니다

reverse()와 이외에도 다른 방법으로 문제를 풀었는데 그 방법에 대해서 설명하겠습니다!

 


문제 링크입니다

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

 

2908번: 상수

상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두

www.acmicpc.net

 

문제

상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두 개를 칠판에 써주었다. 그 다음에 크기가 큰 수를 말해보라고 했다.

상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 예를 들어, 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다.

두 수가 주어졌을 때, 상수의 대답을 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에 상근이가 칠판에 적은 두 수 A와 B가 주어진다. 두 수는 같지 않은 세 자리 수이며, 0이 포함되어 있지 않다.

 

출력

첫째 줄에 상수의 대답을 출력한다.

 

 


 

 

문제 풀이

첫 번째 방법은 split으로 배열로 나눈 다음 reverse()를 사용하여 글자를 반전시켜 값을 비교합니다

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

public class Main {
	public static void main(String[] args) throws IOException {
		// BufferedReader 선언 및 split을 사용 배열로 입력
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String[] sb = br.readLine().split(" ");
		
		// StringBuffer 선언 및 값 입력
		StringBuffer strBufferA = new StringBuffer();
		StringBuffer strBufferB = new StringBuffer();		
		strBufferA.append(sb[0]);
		strBufferB.append(sb[1]);
		
		// a, b를 reverse()를 사용하여 글자반전 
		int a = Integer.parseInt(strBufferA.reverse().toString());
		int b = Integer.parseInt(strBufferB.reverse().toString());
		
		// 비교 후 결과출력
		if(a > b)
			System.out.print(a);
		else
			System.out.print(b);
	}
}

 


두 번째 방법은 StringTokenizer를 사용하여 값을 구분하고 reverse를 사용하여 글자를 반전시켜 값을 비교합니다

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

public class Main {
	public static void main(String[] args) throws IOException {
		// BufferedReader 및 StringTokenizer 선언 및 입력
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		// a, b를 reverse()를 사용하여 글자 반전
		int a = Integer.parseInt(new StringBuilder(st.nextToken()).reverse().toString());
		int b = Integer.parseInt(new StringBuilder(st.nextToken()).reverse().toString());
		
		// 비교 후 결과 출력
		if(a > b)
			System.out.print(a);
		else
			System.out.print(b);
	}
}

 


세 번째 방법은 in.read()를 사용하여 값을 하나씩 받습니다

세 번째 받은 값은 * 100 // 두 번째 받은 값은 * 10 // 첫 번째 받은 값은 그대로 더하여 세 자리 값을 구합니다

세 자리 값을 두 번 구한 결과를 비교해 결과값을 출력합니다

import java.io.IOException;

public class Main {
	public static void main(String[] args) throws IOException {
		// 배열 선언
		int[] comp = new int[2];
		
		// 세번째는 *100, 두번째는 *10, 첫번째는 더해서 세자리값을 차례로 계산
		for(int i = 0; i < 2; i++) {
			int a = System.in.read() - '0';
			int b = System.in.read() - '0';
			int c = System.in.read() - '0';
			int line = System.in.read();
			comp[i] = (c * 100) + (b * 10) + a;
		}

		// 비교 후 결과 출력
		if(comp[0] > comp[1])
			System.out.print(comp[0]);
		else
			System.out.print(comp[1]);
	}
}

 

여기까지 제가 풀은 방식이었습니다

바로 속도 비교를 해보겠습니다

 


 

속도 비교

1 : split() 사용

2. nextToken() 사용

3. in.read() 사용

제 예상과는 다른 결과가 나왔습니다

 

저는 당연히 3번 방식이 메모리, 속도 다 빠를 줄 알았는데...

시간은 2번 방식, 3번 방식이 동일하게 나오고, 메모리는 2번 방식이 제일 빠르게 나왔습니다

보통 문자열 메서드가 메모리가 높게 나와서 당연히 3번 인줄 알았는데 reverse는 메모리에 부담이 적은 메서드인 것 같습니다

 

이상 백준 알고리즘 2908번 상수를 풀은 내용이었습니다

 

다음 문제 : 2021.05.18 - [알고리즘/알고리즘JAVA] - [백준알고리즘/문자열] 5622번 문제 : 다이얼(자바/JAVA)

이전 문제 : 2021.05.17 - [프로그래밍/JAVA] - [백준알고리즘/문자열] 1152번 문제 : 단어의 개수(자바/JAVA)

반응형
그리드형