Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 웹개발
- 백준
- 리액트쿼리
- NextJs
- 웹프로토콜
- 알고리즘
- 개발공부
- 프론트엔드
- 그룹단어
- 모음의개수
- 코드개선
- 개발
- react
- React Query
- Design system
- Next.js
- securitypatch
- 리액트
- TypeScript
- 개발자성장
- 개발블로그
- 디자인 시스템
- Nest.js
- prettier
- WebDev
- 백준1264
- jotai
- nextjsmiddleware
- 알고리즘스터디
- frontend
Archives
- Today
- Total
한땀한땀
백준 1316번 - 그룹 단어 체커 본문
오늘은 백준 1316번 "그룹 단어 체커" 문제를 풀면서, 코드 개선 과정까지 함께 살펴보겠습니다.
문제 파악
- 주어진 단어가 그룹 단어인지 판별
- 그룹 단어란, 같은 알파벳이 연속해서 나타나기만 하는 단어
- i.g 1) "happy" -> p가 연속해서 나오므로 그룹단어
- i.g 2) "aba" -> a가 떨어져서 나오므로 그룹단어가 아님
접근 방법
단어를 한 글자씩 확인하며 그룹 단어 여부를 판단
- 등장한 문자를 저장할 자료구조 활용
- 현재 문자와 이전 문자를 비교하여 연속 여부 확인
- 이미 나온 문자가 다시 나오면 그룹 단어가 아님
첫 번째 풀이
- dict를 활용하여 문자의 등장 여부를 체크하는 방식
mport sys
fast_input = sys.stdin.readline
N = int(fast_input())
cnt = 0
for _ in range(N):
word = fast_input().rstrip()
visited = {} # 등장한 문자를 저장할 딕셔너리
prev_char = ""
is_group_word = True
for char in word:
if char != prev_char: # 이전 문자와 다르면 체크
if visited.get(char): # 이미 등장했던 문자라면 그룹 단어 아님
is_group_word = False
break
visited[char] = True # 새로운 문자 저장
prev_char = char
if is_group_word:
cnt += 1
print(cnt)
첫 번째 풀이의 문제점
- 딕셔너리 사용으로 인한 메모리 낭비
- 불필요한 조건문이 많아 가독성이 떨어진다
두 번째 풀이
- dict 자료구조 대신, set 자료구조를 활용하여 메모리를 절약
- 여러 조건문을 all을 활용하여 간결한 코드 유지
import sys
fast_input = sys.stdin.readline
N = int(fast_input())
cnt = 0
for _ in range(N):
word = fast_input().strip()
seen = set() # 등장한 문자 저장
prev_char = None
if all(char == prev_char or char not in seen and not seen.add(char) for char in word):
cnt += 1
print(cnt)
이번 문제는 그룹 단어 판별이라는 간단한 문제여씨만, 해시 테이블을 사용하는 딕셔너리 대신
메모리 사용량이 더 적은 집합 자료구조를 활용하여 더 효율적인 코드를 작성할 수 있었고, 메모리 성능 최적화를 고려해 볼 수 있는 문제였습니다.
'Computer Science > Algorithm' 카테고리의 다른 글
백준 1264번 - 모음의 개수 (0) | 2025.03.29 |
---|---|
선형 탐색과 배열, 문자열의 관계 (0) | 2025.03.29 |