coding_test

[99클럽 4기 코테 스터디 TIL 9일차] 민균이의 비밀번호 (feat. HashSet, StringBuilder)

jeri 2024. 11. 6. 06:27
반응형

https://www.acmicpc.net/problem/9933

 

 

 

StringBuilder에 대해 모르는 부분이 많아 정리해보았다.

  • StringBuilder
    • Java에서 String을 수정할 수 있는 가변 클래스
    • String은 불변(immutable) 객체이므로 한번 생성된 문자열을 직접 변경할 수 없는데,
      StringBuilder는 모리 낭비 없이 문자열을 수정할 수 있는 기능을 제공
    • StringBuilder는 문자열을 빈번하게 수정하는 경우 유리
    • 특히 반복문에서 문자열을 계속 추가, 수정할 때 효율적
    • String과 달리 StringBuilder는 mutable 하여 문자열의 변경이 가능함
    • 동기화가 되어 있지 않으므로(Thread-safe하지 않음) 멀티스레드 환경에서 사용하려면 StringBuffer를 사용하는 것이 더 안전함
    • 문자열의 추가 및 변경이 많을 때 String보다 효율적
  1. append(String str) : 문자열을 추가함
  2. insert(int offset, String str) : 특정 위치에 문자열을 삽입함
  3. delete(int start, int end) : 시작 위치부터 끝 위치 이전까지의 문자를 삭제함
  4. deleteCharAt(int index) : 특정 인덱스의 문자를 삭제함
  5. reverse() : StringBuilder에 저장된 문자열을 뒤집음
  6. toString() : StringBuilder 객체의 현재 내용을 String으로 변환함
  7. setCharAt(int index, char ch): 특정 위치의 문자를 변경함
  8. replace(int start, int end, String str) : 지정된 범위의 문자열을 새로운 문자열로 교체함
  9. capacity() : 현재 StringBuilder의 저장 공간(버퍼) 용량을 반환함
  10. ensureCapacity(int minimumCapacity) : StringBuilder의 최소 용량을 보장함
  11. length() : 현재 StringBuilder 객체의 길이(문자 수)를 반환함

1) 다른 사람의 코드 풀이

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine()); // 단어의 수를 입력 받음

        Set<String> set = new HashSet<>(); // 중복을 제거하기 위해 Set을 사용

        for (int i = 0; i < n; i++) {
            String s = br.readLine(); // 단어를 입력 받음

            set.add(s); // 입력 받은 단어를 Set에 추가

            StringBuilder sb = new StringBuilder(s);
            String reverse = sb.reverse().toString(); // 입력 받은 단어를 뒤집어서 새로운 문자열 만듦

            if (set.contains(reverse)) { // 뒤집은 문자열이 Set에 있는지 확인하여 비밀번호인지 검사
                System.out.println(reverse.length() + " " + reverse.charAt(reverse.length() / 2));
                // 비밀번호의 길이와 가운데 글자를 출력
                break; // 비밀번호를 찾았으므로 반복문을 종료
            }
        }
    }
}

 

 

2) 오늘의 학습 키워드

  • StringBuilder, HashSet, 문자열 뒤집기
  • StringBuilder는 문자열을 효율적으로 수정할 수 있는 클래스이며,
    특히 reverse() 메소드를 이용하면 문자열을 뒤집을 수 있었다.
  • HashSet은 중복을 허용하지 않고 빠른 검색이 가능한 자료구조로,
    이 문제에서는 비밀번호와 비밀번호의 뒤집힌 형태를 빠르게 찾기 위해 사용했다.

 

 

3) 오늘의 회고

문제점

  • 주어진 단어 목록에서 뒤집은 형태로도 존재하는 비밀번호를 찾아야 했다.
  • 단어를 입력받아 HashSet에 넣고, 그 단어의 뒤집힌 문자열이 이미 Set에 존재하는지를 확인하는 방법을 떠올렸다.

해결법

  • 문자열을 뒤집을 때 StringBuilder의 reverse() 메소드를 사용하면 매우 간단하게 해결 가능했다.
  • Set을 통해 뒤집힌 단어를 빠르게 검색함으로써 시간 복잡도를 줄였다.

새롭게 알게 된 점

  • StringBuilder의 reverse()는 뒤집힌 문자열을 반환하며, HashSet은 중복을 피하고 검색을 빠르게 해준다.
  • 이번에 문제에 맞는 자료구조와 메소드를 선택하는 중요성을 다시 한번 깨달았다.

내일 학습 목표

  • 다양한 자료구조(List, Map)와 그에 맞는 활용법을 익히고,
  • 코딩 테스트에서 자주 사용하는 알고리즘을 더 연습할 계획이다.

 

4) 추가 문제

미들러 - 나이트의 이동

https://www.acmicpc.net/problem/7562

챌린저 - 다단계 칫솔판매

https://school.programmers.co.kr/learn/courses/30/lessons/77486

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

반응형