열심히 풀었는데 시간초과가 떠서 슬펐다.
시간초과가 뜬 첫번째 풀이.
// 시간초과
import java.io.*;
import java.util.*;
public class s5_1181 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
ArrayList<String> li = new ArrayList<>();
for(int i=0;i<n;i++){
li.add(br.readLine());
}
// System.out.println(li);
for(int i=0;i<li.size();i++){
for(int j=i+1;j<li.size();j++){
if(li.get(i).equals(li.get(j))){
// System.out.println(li.get(i)+" "+li.get(j));
li.remove(j);
continue;
}
if(li.get(i).length()>li.get(j).length()){
String temp = li.get(i);
li.set(i, li.get(j));
li.set(j, temp);
}
else if(li.get(i).length()== li.get(j).length()){
String[] temp = {li.get(i), li.get(j)};
Arrays.sort(temp);
li.set(i, temp[0]);
li.set(j, temp[1]);
}
}
}
for(int i=0;i<li.size();i++){
System.out.println(li.get(i));
}
}
}
처음에 배열로 풀다가 겹치는 문자열 인덱스 삭제 함수가 리스트에밖에 없어서 리스트로 바꿔 풀었다.
그런데 for문을 너무 남발했는지 얄짤없이 시간초과
import java.io.*;
import java.util.*;
public class s5_1181_2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] arr = new String[n];
for(int i=0;i<n;i++){
arr[i]=br.readLine();
}
Arrays.sort(arr, new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
if(o1.length()==o2.length()){
return o1.compareTo(o2);
}
else{
return o1.length() - o2.length();
}
}
});
System.out.println(arr[0]);
for(int i=1;i<n;i++){
if(!arr[i].equals(arr[i-1])){
System.out.println(arr[i]);
}
}
}
}
훨씬 간결하고 깔끔해졌다.
sort함수를 람다식으로 다양하게 응용하여 쓸 수 있다는 사실을 알게되었다.
그리고 문자열 중복제거는 아래와 같이 첫번째는 무조건 먼저 출력해주고 나머지뒤에꺼는 앞에것과 같지 않으면 출력해주는 방식으로 풀었다.
근데 이 방식은 중복문자열이 앞뒤로 붙어있기에 가능한 풀이법이고...
참고로 문자열 중복제거만 하고싶을땐 아래와 같이 풀어주면 된다.
for(int i =0; i<str.length(); i++) {
if(str.indexOf(str.charAt(i))==i) answer +=str.charAt(i);
}
파이썬에서는...set함수로 중복제거 해주면 되는데...
배열에서도 인덱스삭제 되는데...
자바는 배열에서 인덱스 삭제도 안되고..무조건 리스트로 바꿔 인덱스 삭제할 수 있다니 여러모로 충격이었다.