728x90
https://school.programmers.co.kr/learn/courses/30/lessons/60057
- input.txt파일 만들었을 때 코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
import sys
sys.stdin = open('input.txt')
def solution(s):
# 문자열 s이 최솟값
answer = len(s)
result = []
#완전 탐색
#압축은 전체 문자열을 2로 나눈 몫까지만 가능
for steps in range(1, len(s)//2+1):
#1~몫까지 문자열 나누기.
lst = [s[j:j+steps] for j in range(0, len(s), steps)]
#문자열 넣을 빈리스트 생성
array = []
#중복생길때마다 2부터 시작하므로 1로 초기화
count = 1
#쪼개진 문자열에서 다음 문자열과 같은지 비교
for i in range(len(lst)):
#첫 인덱스를 저장
tmp = lst[i]
#중복이 생겼다면 그만큼 통과
if count != 1:
count -= 1
continue
count = 1
for j in range(len(lst)):
# 지금이 다음 문자열과 비교 or 지금이 마지막 문자열일때 다음것이 없으므로 추가.
if i < j or i == len(lst) -1:
if lst[i] != lst[j]: #다음 문자열이랑 비교해서 다르다면
if count == 1:
array.append(tmp)
else:
array.append(str(count)+tmp)
break
else: #다음 문자열과 같다면
count +=1
if j == len(lst)-1:
array.append(str(count)+tmp)
result.append("".join(array))
for idx in range(len(result)):
answer = min(len(result[idx]),answer)
return answer
for test in range(5):
s = input()
print(solution(s))
|
cs |
- 제출용 코드
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
32
33
34
35
36
37
38
39
|
def solution(s):
# 문자열 s이 최솟값
answer = len(s)
result = []
#완전 탐색
#압축은 전체 문자열을 2로 나눈 몫까지만 가능
for steps in range(1, len(s)//2+1):
#1~몫까지 문자열 나누기.
lst = [s[j:j+steps] for j in range(0, len(s), steps)]
#문자열 넣을 빈리스트 생성
array = []
#중복생길때마다 2부터 시작하므로 1로 초기화
count = 1
#쪼개진 문자열에서 다음 문자열과 같은지 비교
for i in range(len(lst)):
#첫 인덱스를 저장
tmp = lst[i]
#중복이 생겼다면 그만큼 통과
if count != 1:
count -= 1
continue
count = 1
for j in range(len(lst)):
# 지금이 다음 문자열과 비교 or 지금이 마지막 문자열일때 다음것이 없으므로 추가.
if i < j or i == len(lst) -1:
if lst[i] != lst[j]: #다음 문자열이랑 비교해서 다르다면
if count == 1:
array.append(tmp)
else:
array.append(str(count)+tmp)
break
else: #다음 문자열과 같다면
count +=1
if j == len(lst)-1:
array.append(str(count)+tmp)
result.append("".join(array))
for idx in range(len(result)):
answer = min(len(result[idx]),answer)
return answer
|
cs |
풀이: 문자열을 먼저 len(s)//2 +1로 차례대로 나눕니다. 그 후에 처음 인덱스부터 끝까지 중복인지 아닌지 찾고 문제에서 주어지는 대로 문자열로 나타내서 result에 추가시킵니다. 나눈 문자열을 전부 실행다시키면 result 중에서 문자열 길이의 최솟값을 다 구합니다.
배운점: 진짜 오래 걸려서 푼 문제다. 나누는 것까지는 했지만 중복된것을 찾고 테스트케이스에 맞는 모든 케이스를 해결한다고 오래걸렸다. 다른 사람들의 풀이를 보면 내것보다 훨씬 짧다. 그렇지만 내 코드는 그 대신에 직관전이라고 생각한다. 문자열의 길이를 나눌 때 컴프레션 표현으로 나타내는 것이 좋다고 생각한다.
728x90
'코딩테스트 > 구현' 카테고리의 다른 글
[python] Lv.2 프로그래머스: JadenCase 문자열 만들기 (0) | 2023.03.07 |
---|---|
<PART 3> 백준 1010번: 다리 놓기 (0) | 2022.11.17 |
<PART 3> Q8. 문자열 재정렬 (0) | 2022.11.15 |
<PART 3> Q7.백준 18406번: 럭키스트레이트 (0) | 2022.11.15 |
<PART 2> 구현(완전탐색,시뮬레이션) (0) | 2022.11.04 |
댓글