백준 1972 java : set 연습

magicdrill·2024년 11월 8일
0

백준 문제풀이

목록 보기
483/655

백준 1972 java : set 연습

처음에는 map을 사용해 보려다 map의 경우 메모리와 조건 연산이 더 많이 필요할 거 같아서 set으로 바꿔보았다.

  1. 일단 set에 다 넣고 크기 비교하기
import java.util.*;

public class bj1972 {
    static Scanner scanner = new Scanner(System.in);
    static Vector<String> data = new Vector<>();

    public static void main(String[] args) {
        inputData();
        findAnswer();

        scanner.close();
    }

    public static void inputData(){
        System.out.println("inputData()");
        String temp;

        while(true){
            temp = scanner.next();
            if(temp.equals("*")){
                break;
            }
            data.add(temp);
        }
    }

    public static void findAnswer(){
        System.out.println("findAnswer()");
        int i, j, D, N;
        String str;

        for(i = 0; i < data.size(); i++){
            boolean conti = true;
            str = data.get(i);
            System.out.println("검사할 str : " + str);
            N = str.length();

            for(D = 0; D <= N - 2; D++){
                conti = true;
                System.out.println("D쌍 : " + D + " / " + (N - D - 1) + "개가 나와야 함");
                Set<String> set = new HashSet<>();
                for(j = 0; j < N - D - 1; j++){
                    //map 말고 set을 사용하면 조건문을 줄일 수 있을거 같다.
                    String temp = String.valueOf(str.charAt(j)) + String.valueOf(str.charAt(j + D + 1));
                    System.out.print(temp + " ");

                    //1. 일단 다 집어 넣고 크기 비교
                    set.add(temp);
                }
                if(N - D - 1 != set.size()){
                    System.out.println("중복 요소 있음!");
                    conti = false;
                    break;
                }
                System.out.println();
            }
            if(conti){
                System.out.println(str + " is surprising.");
            }
            else{
                System.out.println(str + " is NOT surprising.");
            }
            System.out.println();
        }
    }
}

  1. set의 contains()을 사용해 조기에 반복 탈출하기
import java.util.*;

public class bj1972 {
    static Scanner scanner = new Scanner(System.in);
    static Vector<String> data = new Vector<>();

    public static void main(String[] args) {
        inputData();
        findAnswer();

        scanner.close();
    }

    public static void inputData(){
        System.out.println("inputData()");
        String temp;

        while(true){
            temp = scanner.next();
            if(temp.equals("*")){
                break;
            }
            data.add(temp);
        }
    }

    public static void findAnswer(){
        System.out.println("findAnswer()");
        int i, j, D, N;
        String str;

        for(i = 0; i < data.size(); i++){
            boolean conti = true;
            str = data.get(i);
            System.out.println("검사할 str : " + str);
            N = str.length();

            for(D = 0; D <= N - 2; D++){
                conti = true;
                System.out.println("D쌍 : " + D + " / " + (N - D - 1) + "개가 나와야 함");
                Set<String> set = new HashSet<>();
                for(j = 0; j < N - D - 1; j++){
                    //map 말고 set을 사용하면 조건문을 줄일 수 있을거 같다.
                    String temp = String.valueOf(str.charAt(j)) + String.valueOf(str.charAt(j + D + 1));
                    System.out.print(temp + " ");

                    //2. 중복요소가 있는지 매번 확인
                    if(set.isEmpty()){
                        set.add(temp);
                    }
                    else if(set.contains(temp)){
                        System.out.println("중복 요소 있음!");
                        conti = false;
                        break;
                    }
                    else{
                        set.add(temp);
                    }
                }
                if(!conti){
                    break;
                }
                System.out.println();
            }
            if(conti){
                System.out.println(str + " is surprising.");
            }
            else{
                System.out.println(str + " is NOT surprising.");
            }
            System.out.println();
        }
    }
}

조기에 탈출하는게 미세하게 메모리나 시간부분에서 효율적이다.
set에 대해 정리하고 다음에는 map을 연습해본다.

0개의 댓글