반응형
https://www.acmicpc.net/problem/9933
StringBuilder에 대해 모르는 부분이 많아 정리해보았다.
- StringBuilder
- Java에서 String을 수정할 수 있는 가변 클래스
- String은 불변(immutable) 객체이므로 한번 생성된 문자열을 직접 변경할 수 없는데,
StringBuilder는 메모리 낭비 없이 문자열을 수정할 수 있는 기능을 제공 - StringBuilder는 문자열을 빈번하게 수정하는 경우 유리
- 특히 반복문에서 문자열을 계속 추가, 수정할 때 효율적
- String과 달리 StringBuilder는 mutable 하여 문자열의 변경이 가능함
- 동기화가 되어 있지 않으므로(Thread-safe하지 않음) 멀티스레드 환경에서 사용하려면 StringBuffer를 사용하는 것이 더 안전함
- 문자열의 추가 및 변경이 많을 때 String보다 효율적
- append(String str) : 문자열을 추가함
- insert(int offset, String str) : 특정 위치에 문자열을 삽입함
- delete(int start, int end) : 시작 위치부터 끝 위치 이전까지의 문자를 삭제함
- deleteCharAt(int index) : 특정 인덱스의 문자를 삭제함
- reverse() : StringBuilder에 저장된 문자열을 뒤집음
- toString() : StringBuilder 객체의 현재 내용을 String으로 변환함
- setCharAt(int index, char ch): 특정 위치의 문자를 변경함
- replace(int start, int end, String str) : 지정된 범위의 문자열을 새로운 문자열로 교체함
- capacity() : 현재 StringBuilder의 저장 공간(버퍼) 용량을 반환함
- ensureCapacity(int minimumCapacity) : StringBuilder의 최소 용량을 보장함
- 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
반응형
'coding_test' 카테고리의 다른 글
[99클럽 4기 코테 스터디 TIL 11일차] 완주하지 못한 선수 (feat. HashMap) (1) | 2024.11.08 |
---|---|
[99클럽 4기 코테 스터디 TIL 10일차] 폰켓몬 (feat. HashSet, Math.min()) (1) | 2024.11.06 |
[99클럽 4기 코테 스터디 TIL 8일차] 근무 지옥에 빠진 푸앙이 (Small) (feat. 해시맵) (3) | 2024.11.05 |
[99클럽 4기 코테 스터디 TIL 7일차] 전주 듣고 노래 맞히기 (feat. 해시맵) (1) | 2024.11.03 |
자바의 List 객체와 String 배열의 차이 및 출력하는법 (0) | 2024.11.02 |