백준 알고리즘/문자열

[JAVA 자바] 백준 2908번 : 상수

Sun720 2022. 6. 6. 23:22

▶ 문제

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

 

2908번: 상수

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

www.acmicpc.net

 설명

두 수를 거꾸로 읽어서 비교하는 문제이다.

나는 한 번에 두 수를 문자열로 읽고서

자리배치를 거꾸로 바꾼 후

공백으로 두 문자를 나누는 방식으로 시작했다.

 

그 뒤 숫자로 변환하여서 최대값을 구하는 max() 메소드를 사용했다.

 

문자열을 거꾸로 하기 위해서는 두 가지 방법을 썼다.

1. StringBuilder의 reverse() 메소드 사용.

2. 문자열을 역순으로 byte 배열에 값을 준 후 다시 문자열로 변환.

 

 

문제 풀이

🌱 풀이1. 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 br = new BufferedReader(new InputStreamReader(System.in));
		String s = br.readLine();
		StringBuilder sb = new StringBuilder(s);
		sb.reverse();
		
		StringTokenizer strTo = new StringTokenizer(sb.toString(), " ");
		int a = Integer.parseInt(strTo.nextToken());
		int b = Integer.parseInt(strTo.nextToken());
				
		System.out.println(Math.max(a,  b));		
	}
}

StringBuilder 클래스는 주로 출력할 때 많이 사용하였다.

그러다 보니 append() 메소드밖에 잘 안썼는데, reverse() 메소드가 떠올라서 이번 기회에 사용해보았다.

 

StringBuilder 를 인스턴스 할 때 어떤 문자열을 넣어 초기화 하면,

reverse() 메소드를 썼을 때 그 저장되어 있는 문자열의 순서를 거꾸로 나열된다.

예를 들어  StringBuilder sb = new StringBuilder("abcdefg")  로 새 인스턴스가 만들어질 때

sb.reverse() 하면 sb에는 "gfedcba" 로 문자가 거꾸로 바껴있게 된다.

 

reverse() 메소드는 StringBuilder 형으로 반환하기 때문에 바로 출력해서 보고자 할 때는 toString()을 사용해주어야 한다.

마찬가지로 StringTokenizer 의 생성자 인자로 String 형을 받기 때문에

  StringTokenizer strTo = new StringTokenizer(sb, " ")  가 아니라

  StringTokenizer strTo = new StringTokenizer(sb.toString(), " ")   인 것이다.

 

그렇게 문자열을 거꾸로 바꾼 후 두 수로 잘랐다면 max() 메소드로 최대값을 구해 출력해내면 된다.

 

 

🌱 풀이2. byte[ ]배열 사용

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 br = new BufferedReader(new InputStreamReader(System.in));
		String s = br.readLine();
		byte[] reverseS = new byte[7];

		for (int i = 0, j = 6; i < 7; i++, j--) {
			reverseS[i] = s.getBytes()[j];
		}
		String newS = new String(reverseS);
		StringTokenizer strTo = new StringTokenizer(newS, " ");
		System.out.println(Math.max(Integer.parseInt(strTo.nextToken()), Integer.parseInt(strTo.nextToken())));
	}
}

byte, char 어떤 것이든 배열로 한 글자씩 '입력된 문자열'을 받도록 한다.

자바에서는 byte 가 1byte, char가 2byte 크기를 가진다고 하여

크기면에서 효율적인 byte를 사용해보았다.

 

 reverseS[i] = s.getBytes()[j]  

반복문을 통해 문자열 s의 끝부터 reverseS 배열의 값으로 할당해주었다.

 

 String newS = new String(reverseS)  

그렇게 reverseS 에 문자들이 다 들어갔다면 byte 형에서 String 형으로 변환해 주도록 한다.

이 때 newS라는 새 문자열 변수가 만들어지게 된다.

 

거꾸로 뒤집혀진 문자가 만들어졌다면 그다음은 위의 풀이와 마찬가지로 

정수로 변환한 후 비교하여 큰 수를 출력하도록 한다.

 

 

 

Log

StringBuilder 클래스에도 String 못지않게 다양한 생성자와 메소드가 있기 때문에 잘 살펴보고 필요에 따라 유연하게 사용할 수 있어야겠다.

728x90
반응형