본문 바로가기

건승하고있어요/알고리즘

[문자열사용하기] 상수

반응형

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

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

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

(출처: https://www.acmicpc.net/problem/2908)


참으로 오랜만에 알고리즘을 풀어 보았따. 


문제를 푸는 순서는 이렇게 했다.

1. 세자리 숫자를 두 번 받는다. (next()) - String으로 받는다. 자리를 바꿔야 하기 때문에

2. 각각의 숫자의 0번 째 index와 2번 째 index를 서로 바꾼다.

3. 바뀐 숫자의 String을 int형으로 교체

4. 더 큰 숫자를 비교하여 출력


굉장히 직관적이고 원시적으로 문제를 푼 것 같아서 속상하지만서도....ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

방법이 딱히 떠오르지 않기에..ㅠ_ㅠ 

(실제로 남들보다 코드가 상당히 길었다.ㅋㅋㅋㅋ)


여기에서 바로 막혔던 부분은 바로 1번이었다.

String에서 원하는 문자의 index를 찾는 방법만 기억나지, 이 두 자리를 대체하는 방법은 뭐였나 기억이 나지 않았다.

그 때 문득 스쳐 지나간 기억, String은 하나의 객체로서 내용의 변형이 불가능하다는 점!!!!!!...은 기억 속에서 끄집어 냈기 때문에 확실하지는 않다. 

아무튼 그래서 이 문자열을 다시 만들기 위해서 또 다시 생각해 본 방법으로 


1. 각각의 index마다 가진 값을 일일이 가져온다. 2. 다시 String 객체를 만든다. 


근데 이 방법은 너무 원시적인 것 같아서... 다시 다른 방법을 생각했다. String을 재조립 할 수 있는 StringBuilder를 활용해 보기로 했다. 


  StringBuilder sb = new StringBuilder(num1);
  StringBuilder sb2 = new StringBuilder(num2);
        
        sb.setCharAt(0, num1.charAt(2));
        sb.setCharAt(2, num1.charAt(0));
        sb2.setCharAt(0, num2.charAt(2));
        sb2.setCharAt(2, num2.charAt(0));        


저번에 Scanner객체를 두 개 만들었을 때는 오류가 났었는데, StringBuilder는 딱히 임포트를 하지 않아도 되는 내장객체라 그런지 두개를 생성해도 오류가 나지 않았다. scanner로 받은 두 개의 String을 받아서 StringBuilder로 바꿨다. 그 다음 setCharAt(idx, 바꿀char) 메소드로 각각의 글자를 바꿔줬다. 뭔가 굉장히 원시적이다. 하하하하하하하하하하하하하하하하


이후로 StringBuilder애들을 String으로 바꿔준 뒤 integer형으로 바꾼다.

        String numnum = sb.toString();
        String numnum2 = sb2.toString();
        
        int numnumnum = Integer.parseInt(numnum);
        int numnumnum2 = Integer.parseInt(numnum2);


변수 이름이 왜저런지는 묻지 말아주세여...

StringBuilder에는 toString() 메소드가 있다. StringBuilder->String


그리고 나서 parseInt로 String->Integer


if(numnumnum>numnumnum2) {
            System.out.println(numnumnum);
        } else {
            System.out.println(numnumnum2);
        }


그리고 나서는 크기 비교해서 큰거 출력해줌





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.Scanner;
 
public class SSNum {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String num1 = scan.next();
        String num2 = scan.next();
        
        StringBuilder sb = new StringBuilder(num1);
        StringBuilder sb2 = new StringBuilder(num2);
        
        sb.setCharAt(0, num1.charAt(2));
        sb.setCharAt(2, num1.charAt(0));
        sb2.setCharAt(0, num2.charAt(2));
        sb2.setCharAt(2, num2.charAt(0));
        
        String numnum = sb.toString();
        String numnum2 = sb2.toString();
        
        int numnumnum = Integer.parseInt(numnum);
        int numnumnum2 = Integer.parseInt(numnum2);
        
        if(numnumnum>numnumnum2) {
            System.out.println(numnumnum);
        } else {
            System.out.println(numnumnum2);
        }
        
        scan.close();
    }
}
 
cs





반응형