영진닷컴의 퍼즐로 배우는 알고리즘 with 파이썬에서 첫번째 퍼즐 '모두 똑같이 만들기'!!
여기에서 연습문제 3번을 나름 낑낑거리면서 풀었는데 적절한지는 모르겠다.
연습문제 3) 모자를 쓰고 있지 않은 'H'들을 제외한 'F', 'B'에게만 적용되는 모자 정렬 규칙을 완성하라.
cap3 = ['F', 'F', 'B', 'H', 'B', 'F', 'B', 'B', 'B', 'F', 'H', 'F', 'F']
출력결과
Person in position 2 flip your cap!
Persion in position 4 flip your cap!
People in positions 6 through 8 flip your caps!
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
|
def pleaseConformOnepass(caps):
c_list = ['F', 'B', 'H']
F_list = []
B_list = []
H_list = []
list_list = [F_list, B_list, H_list]
i = 0
while(i<3):
for j in range(len(caps)):
if caps[j] == c_list[i]:
list_list[i].append(j)
i+=1
if len(F_list) > len(B_list):
flip = 1
else:
flip = 0
list_list[flip].append(-1)
start = list_list[flip][0]
end = list_list[flip][0]
intervals = []
for i in range(len(list_list[flip])-1):
if end + 1 == list_list[flip][i+1]:
end = list_list[flip][i+1]
else:
intervals.append((start, end))
end = list_list[flip][i+1]
start = end
for j in intervals:
if j[0] == j[1]:
print(f"Person in position {j[0]} flips your cap!" )
else:
print(f"People in positions {j[0]} through {j[1]} flip your caps!")
|
cs |
구별해야 하는 특성의 종류가 2 이상이므로 각 특성에 해당하는 인덱스를 먼저 뽑아서 비교하는게 낫겠다는 생각이 들었다. 그리하여 list_list와 list_list[flip]이 난무하는 코드가 되어버리고 말았는데... 사실 고치기 좀 귀찮아서....
list_list[flip].append(-1)은 모자를 뒤집어야 하는 대상이 되는 집단(F or B)의 인덱스를 뽑은 리스트 내에서 마지막 구간도 intervals에 반드시 포함되도록 하기 위해서 추가했다. 없으면 마지막 구간이 비교대상이 없어서 intervals에 들어가지 않고 그냥 끝나버린다!
연습문제 4) 문자열 BWWWWWBWWWW가 주어지면 이를 줄여서 1B5W1B4W로 변환해서 출력하는 코드와, 디코딩하여 원래 문자열로 복원하는 코드를 작성하라.
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
|
def runlength(target):
intervals = []
target = target + '1'
times = 0
for i in range(len(target)-1):
if target[i] == target[i+1]:
times += 1
else:
if target[i]=='B':
intervals.append(('B', times+1))
else:
intervals.append(('W', times+1))
times = 0
after = ""
for j in intervals:
after = after + j[0] + str(j[1])
return after
def derunlength(target):
intervals = []
while(len(target)>=2):
if target[0]== 'B':
intervals.append(('B', target[1]))
target = target[2:]
else:
intervals.append(('W', target[1]))
target = target[2:]
original = ""
for j in intervals:
original = original + j[0]*int(j[1])
return original
|
cs |
'개발공부' 카테고리의 다른 글
[Python] 다른 사람 마음읽기 알고리즘 (0) | 2020.07.13 |
---|---|
[Python] '파티에 참석하기 가장 좋은 시간' 알고리즘 연습문제 (0) | 2020.07.02 |
[Python] '파티에 참석하기 가장 좋은 시간' 알고리즘 (1) | 2020.07.01 |
[Python] '모두 똑같이 만들기' 알고리즘 (1) | 2020.07.01 |
[Java] 끝말잇기 게임 만들기 (0) | 2020.06.30 |