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 |
Tags
- vuejs
- 생성형 AI
- Docker
- Machine Learning
- 도커
- Redis
- 오픈시프트
- POD
- GPT
- 생성형
- 컨설턴트
- 컨설팅
- 리트코드
- 메세지큐
- 머신러닝
- Python
- fastapi
- vue.js
- 로깅
- SpringBoot
- fast api
- 솔루션조사
- k8s
- kubernetes
- 쿠버네티스
- OpenShift
- BFS
- jpa
- LLaMa
- LeetCode
Archives
- Today
- Total
수 많은 우문은 현답을 만든다
(Hard) Sherlock and Anagrams 본문
아나그램이란?
아나그램이란 한 단어의 철자를 분해해 다른 단어, 혹은 다른 문장으로 바꾸는 놀이
약간 수학적인 요소가 있어서 어렵지만 재미있는 훈련이 될 것이다.
문제:
https://www.hackerrank.com/challenges/sherlock-and-anagrams/problem
설계:
1. 애너그램 처럼 실제로 문자를 뒤집고 하려면 복잡하다. 어떻게 단순화 할 수 있을까?
-> 문자열 정렬
2. 문자열에 대한 모든 케이스를 조사해야되는데 삼중 포문이 필요하려나?
-> 이중 포문만 있어도 된다
ㄴ 역할 1: 문자열 시작위치를 한칸씩 이동
ㄴ 역할 2: 자르는 범위를 한칸씩 또 늘려야한다.
3. 반복되는 문자가 나오면 count 를 증가시킨다.
4. 같은 문자가 여러번 반복되면 시그마 합을 구해야한다 (ㄷㄷㄷㄷ)
나의 풀이:
1)
TOTAL = 0
dic = {}
for i in range(len(s)): #0, 1, 2, 3
for j in range(?): #0, 1, 2, 3
sub = ''.join(s[:]) #0~1, 1~2, 2~3, 3~4 이렇게 움직이면서 잘라야한다
2)
TOTAL = 0
dic = {}
for i in range(1, len(s)): #1, 2, 3
for j in range(?): #0, 1, 2, 3
sub = ''.join(s[j:j+i]) #0~1, 1~2, 2~3, 3~4
# j는 한개씩 느는데 그다음 사이클에서는 점차 간격을 늘려야하니 j:j+i로 잘라야겠네
# j:j+i를 하자니 i가 overflow날 수 있으니 첫번째 조건에 +1을 해버리자
3)
TOTAL = 0
dic = {}
for i in range(1, len(s)): #1, 2, 3
for j in range(len(s)-i+1): #0, 1, 2, 3
sub = ''.join(s[j:j+i]) #0~1, 1~2, 2~3, 3~4
# 프로그램을 실행하면 아래처럼 잘리긴 하겠는데
# 0-1, 1-2, 2-3, 3-4 -> k, k, k, k
# 0-2, 1-3, 2-4 -> kk, kk, kk
# 두번째 사이클에서는 3-5가 나오면 안되.. 반복할때마다 j 범위가 줄어야겠네 (-i+1)
4)
TOTAL = 0
dic = {}
for i in range(1, len(s)): #1, 2, 3
for j in range(len(s)-i+1): #0, 1, 2, 3
sub = ''.join(s[j:j+i]) #0~1, 1~2, 2~3, 3~4
if sub in ana_dict.keys() :
ana_dict[sub] += 1
else :
ana_dict[sub] = 1
return TOTAL
5) 왜 안되지?
함정 1 : 스키마 합을 빼먹음
TOTAL = 0
dic = {}
for i in range(1, len(s)):
for j in range(len(s)-i+1):
sub = ''.join(s[j:j+i])
if sub in ana_dict.keys() :
TOTAL += ana_dict[sub] #k,k,k,k 인 경우 총 3+2+1 = 7번이다.
ana_dict[sub] += 1
else :
ana_dict[sub] = 1
return TOTAL
6) 왜 안되지?
함정 2: 문자열 정렬을 빼먹음
TOTAL = 0
ana_dict = {}
for i in range(1, len(s)):
for j in range(len(s)-i+1):
sub = ''.join(sorted(s[j:j+i]))
if sub in ana_dict.keys() :
TOTAL += ana_dict[sub]
ana_dict[sub] += 1
else :
ana_dict[sub] = 1
return TOTAL
완료!
'코딩테스트 > Dictionaries' 카테고리의 다른 글
(Easy) Number of 1 Bits (0) | 2023.06.18 |
---|---|
(Easy) Single Number (0) | 2023.06.18 |
(Easy) 애너그램 유효성 검사 (0) | 2023.06.05 |