📌문제
🎖️난이도
✔️풀이
sound = input()
def func(sound):
duck_list = []
quack_dict = {'q' : 0, 'u' : 1, 'a' : 2, 'c' : 3, 'k' : 4} # 현재 위치 체크용
recycle_cnt = 0 # 재사용 가능한 오리 몇 마리 있는지 체크
if sound[0] != 'q':
return -1
else:
duck_list.append('q')
for now in sound[1:]:
# 1. 현재 문자가 'q'인 경우
if now == 'q':
if not recycle_cnt: # 재활용 가능한 완성오리 없으면
duck_list.append('q')
continue
else: # 재활용 가능한 완성오리 있으면 pop하고 재사용
for i in range(len(duck_list)):
if duck_list[i] == "quack":
duck_list[i] = 'q' # 재사용
recycle_cnt -= 1
break
continue
# 2. 현재 문자가 'q'가 아닐 경우
isExist = False
for i in range(len(duck_list)):
if quack_dict[duck_list[i][-1]] == quack_dict[now] - 1:
duck_list[i] += now
isExist = True
if now == 'k':
recycle_cnt += 1
break
if not isExist: # 추가할 곳이 없으면 error sound
return -1
# 오리 수 출력
duck_num = duck_list.count("quack")
if duck_num != len(duck_list) or len(duck_list) == 0:
return -1
return duck_num
print(func(sound))
🧠노트
빡구현..
sound의 한 문자 한 문자 탐색하면서 2차원 배열("duck_list")의 올바른 위치에 추가해주면 된다.
이때, 올바른 위치를 체크하기 위해서 dictionary("quack_dict")의 key-value를 이용한다.
현재 문자("now")가 2차원 배열("duck_list")에 저장된 문자열 뒤에 붙을 수 있는 곳이 있는지 체크해주면 된다.
if quack_dict[duck_list[i][-1]] == quack_dict[now] - 1
또한 최소의 오리 수를 구하는 것이기 때문에,
2차원 배열에 차곡차곡 추가해가면서 "quack"을 완성한 줄이 있다면
"quack"을 빼고 다시 재활용을 하는 느낌으로 "q"로 바꿔서 새로 시작하고
"recycle_cnt"에 +1씩 해준다.
이런 방식으로 진행하면서,
중간중간에 error sound인 경우를 생각하며 예외처리를 해주고 바로 return -1 해주면 된다.
🔍참고
-
'[ 알고리즘 ] > Implementation' 카테고리의 다른 글
[백준] 20436. ZOAC 3 (0) | 2022.08.02 |
---|---|
[백준] 14467. 소가 길을 건너간 이유 (0) | 2022.08.02 |
[백준] 20918. 전구 (0) | 2022.08.01 |
[백준] 20546. 기적의 매매법 (0) | 2022.08.01 |
[백준] 2443. 별 찍기 - 6 (0) | 2022.06.30 |