문제: 상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 숫자 두 개를 칠판에 써주었다. 그 다음에 크기가 큰 수를 말해보라고 했다.
상수는 수를 다른사람과 다르게 거꾸로 읽는다. 예를 들어, 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를 활용해 보기로 했다.
저번에 Scanner객체를 두 개 만들었을 때는 오류가 났었는데, StringBuilder는 딱히 임포트를 하지 않아도 되는 내장객체라 그런지 두개를 생성해도 오류가 나지 않았다. scanner로 받은 두 개의 String을 받아서 StringBuilder로 바꿨다. 그 다음 setCharAt(idx, 바꿀char) 메소드로 각각의 글자를 바꿔줬다. 뭔가 굉장히 원시적이다. 하하하하하하하하하하하하하하하하
이후로 StringBuilder애들을 String으로 바꿔준 뒤 integer형으로 바꾼다.
변수 이름이 왜저런지는 묻지 말아주세여...
StringBuilder에는 toString() 메소드가 있다. StringBuilder->String
그리고 나서 parseInt로 String->Integer
그리고 나서는 크기 비교해서 큰거 출력해줌
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 |
'건승하고있어요 > 알고리즘' 카테고리의 다른 글
[문자열사용하기] 크로아티아 알파벳 (0) | 2018.03.08 |
---|---|
[문자열사용하기] 다이얼 (0) | 2018.03.07 |
[문자열사용하기] 알파벳찾기 / break문 (0) | 2018.02.17 |
[1차배열] 평균점수 (4) | 2018.02.16 |
[1차배열] 음계 (0) | 2018.02.15 |