[백준] 1811번 - java

syeony·2025년 2월 2일
0

Java

목록 보기
1/5

문제 바로가기

열심히 풀었는데 시간초과가 떠서 슬펐다.
시간초과가 뜬 첫번째 풀이.

첫번째 풀이

// 시간초과
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함수로 중복제거 해주면 되는데...
배열에서도 인덱스삭제 되는데...
자바는 배열에서 인덱스 삭제도 안되고..무조건 리스트로 바꿔 인덱스 삭제할 수 있다니 여러모로 충격이었다.

profile
모바일 어플리케이션, cross platform과 iOS에 관심이 많은 개발자 오승연입니다

0개의 댓글