참고
문제해설
문제 로직고민
NOTE
•
하나의 문자열에서 숫자값만 뽑아내야 한다.
◦
문자열을 char의 배열로 분리한뒤, Character.isDigit()함수를 사용해서 숫자이면 값을 넣고, 아닌경우 “ “을 넣어주었다.
◦
이후 split(”\\s+”)을 진행하면 연속된 공백은 분리된다.
◦
단 “”가 배열에 들어가있을 수 있으므로, 숫자로 변환하기전에 빈문자인지 확인한다.
•
숫자는 최대 100자이상이 될 수 있다.
◦
Long타입으로도 커버가 안되므로, BigInter라는 객체를 사용해야 한다.
작성코드
NOTE
public class _2870 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String[] s;
int N = Integer.parseInt(br.readLine());
ArrayList<BigInteger> list = new ArrayList<BigInteger>();
for (int i = 0; i < N; i++) {
String line = br.readLine();
for (char c : line.toCharArray()) {
if(Character.isDigit(c)) sb.append(c);
else sb.append(" ");
}
for(String n : sb.toString().split("\\s+")){
if(!n.isEmpty()) list.add(new BigInteger(n));
}
sb = new StringBuilder();
}
Collections.sort(list);
for(BigInteger i : list){
System.out.println(i);
}
}
}
Java
복사
BigInteger를 모른다면 상당히 까다로 문제유형 (실제 기업코테에서는 Long범위로 나올듯)
다른사람 풀이
NOTE
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
ArrayList<String> list = new ArrayList<>();
int N = Integer.parseInt(br.readLine());
while(N-->0) {
String s = br.readLine();
boolean isEmpty = true;
for(char c : s.toCharArray()) {
if(c>='0' && c<='9') {
sb.append(c);
isEmpty = false;
}
else {
if(!isEmpty) {
if(sb.length()!=1 && sb.charAt(0)=='0') {
for(int i=0; i<sb.length(); ++i) {
if(i==sb.length()-1 && sb.charAt(i)=='0') break;
if(sb.charAt(i)=='0') {
sb.deleteCharAt(i);
--i;
}
else break;
}
}
list.add(sb.toString());
sb.setLength(0);
isEmpty = true;
}
}
}
if(!isEmpty) {
if(sb.length()!=1 && sb.charAt(0)=='0') {
for(int i=0; i<sb.length(); ++i) {
if(i==sb.length()-1 && sb.charAt(i)=='0') break;
if(sb.charAt(i)=='0') {
sb.deleteCharAt(i);
--i;
}
else break;
}
}
list.add(sb.toString());
sb.setLength(0);
}
}
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1.length()==o2.length()) {
return o1.compareTo(o2);
}
return o1.length()-o2.length();
}
});
for(String a : list) sb.append(a).append("\n");
System.out.print(sb);
}
}
Java
복사
BigInteger없이 풀이한 코드
•
문자열로 숫자를 모두 받은뒤, 숫자처럼 정렬하도록 진행한 방법이다.
•
비교에서는 문자열의 길이부터 비교한 이후, 길이가 같다면 기존의 방식으로 비교하도록 한다.
•
0으로 시작하는 경우, 0의 값을 제거해준다.