백준

[백준]11478: hashset 이란? , substring복습!!!!!!!!! 음하하음하하하하!!!

새우는 맛있새우 2025. 1. 17. 00:02

이번 문제는 풀고나서 아주 기분이 매우매우 새우새우 좋았던 문제였따.

11478번


이번 문제는 매우 운이 좋았다고 생각한다.

문제를 풀기 전에 지금까지 써왔던 HashMap은

key값과 value값을 무조건 동시에 받아야해서 불편했는데 한개만 받는것은 무엇이 있을까?하고 의문이 들었따.


Set

https://tosuccess.tistory.com/145

 

[자바/java] Set, HashSet 사용법 데이터 삽입, 삭제, 출력

Set이란? 자바 컬렉션에 HashSet은 Set 인터페이스의 구현 클래스다. Set은 한국말로는 "집합"이고, 따로 저장 순서를 유지하지는 않는다. 또한 중복 값을 허용하지 않는다는 특징을 갖고 있다. *순서

tosuccess.tistory.com

잘 정리가 되어있다.

말 그대로,

Set은 순서가 무작위로 저장이 되지만, 중복을 아예 저장시키지 않는다는 장점이 있다.

HasMap은 키값으로 같은 값이 들어오면 원래 있던 값이 업데이트가 되는것인데, Set은 아예 들어가지도 않는다는것!

 

1. 객체 선언 

Set<String> set = new HashSet<>();

2. 데이터 삽입

set.add(S.substring(j, j + cnt));

3. 데이터 출력

데이터를 출력하는 방식이 좀 특이한데, HashMap은 keyset(), entryset() 등등 값을 받아와서  get으로 출력해준다면,

set은 .toString으로 모든값을 그냥 단순히 가져오거나,

Iterator을 사용해서 값을 한개한개 다 받아올 수 있따.

Iterator 사용

4. contains, size 등등 나머지는 거의 비슷하다.


https://study-with-mini.tistory.com/2

 

프로그래머스(substring , toCharArray , valueOf) - 코딩 기초 트레이닝 - 문자열 겹쳐쓰기

이번에도 대가리 깨지는 문제였다.이딴게 어떻게 기초인가요; https://school.programmers.co.kr/learn/courses/30/lessons/181943 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스

study-with-mini.tistory.com

substring은 여기서 잘 정리해두었다. 필독하도록.


자 이제 필요한 개념들을 알았으니까, 설명 들어갈새우~


정답 코드

package map;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;

public class Q8 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String S = br.readLine();
        Set<String> set = new HashSet<>();
        int cnt = 1;
        for (int i = 0; i < S.length(); i++) {
            for (int j = 0; j < S.length() - i; j++) {
                set.add(S.substring(j, j + cnt));
            }
            cnt++;
        }
        System.out.println(set.size());
    }
}

후,,, 내가 원래 제출했던 코드는 이렇다.

더보기



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String S = br.readLine();
        String[] arr = new String[S.length()];
        for (int i = 0; i < S.length(); i++) {
            arr[i] = String.valueOf(S.charAt(i));
        }
        Set<String> set = new HashSet<>();
        int cnt = 1;
        while (cnt <= S.length()) {
            for (int j = 0; j < S.length() - cnt + 1; j++) {
                StringBuilder sb = new StringBuilder();
                int i = j;
                for (int k = 0; k < cnt; k++) {
                    sb.append(arr[i]);
                    i++;
                }
                set.add(sb.toString());
            }
            cnt++;
        }
        System.out.println(set.size());
    }
}

엄,,, 딱봐도 매우 시간초과가 날 것 처럼 생겼다.

비록 출력은 맞았지만, 시간초과를 해결해야겠다는 생각이 매우 들었다.


자자, 어떤가?

이중 포문 중에서 안쪽에 들어있는 포문은 

 주어진 문제가 만약 abcde라면,

a ->b ->c ->d ->e ->(여기서부터 !!!! 두개씩 세는거!!!!)ab ->bc ->cd ->de ->------....

이걸 반영해준 코드이다.

cnt또한 몇개를 넣어줄 것인지 개수를 세어주는 것이다.

하지만 내가 낸 코드도 매우, 새우, 아주 잘 돌아가긴 하지만, 약간 가독성이 떨어진다. 이것보다 더 나은 답은?


조금은 개선된 정답

 

package map;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;

public class Q8 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String S = br.readLine();
        Set<String> set = new HashSet<>();
        for (int i = 1; i <= S.length(); i++) {
            for (int j = 0; j <= S.length() - i; j++) {
                set.add(S.substring(j, j + i));
            }
        }
        System.out.println(set.size());
    }
}

 

후,,,,,이런식으로 cnt를 따로 세주지 않고 i를 증가시킴과 동시에 사이즈 더해주는 용도로도 쓴다면,,,더 완벽한 코드가 될 것 같다.. 다만 사이즈가 최소 1부터 시작해야 되기 때문에 조건값에 =를 붙여주는것이 키뽀인또~**

 

 


이렇게 해서 오늘도 열심히 해봤새우~

다들 파이팅하새우~