12933 오리문제 (파이썬)
문제
오리의 울음 소리는 "quack"이다. 올바른 오리의 울음 소리는 울음 소리를 한 번 또는 그 이상 연속해서 내는 것이다. 예를 들어, "quack", "quackquackquackquack", "quackquack"는 올바른 오리의 울음 소리이다.
영선이의 방에는 오리가 있는데, 문제를 너무 열심히 풀다가 몇 마리의 오리가 있는지 까먹었다.
갑자기 영선이의 방에 있는 오리가 울기 시작했고, 이 울음소리는 섞이기 시작했다. 영선이는 일단 울음소리를 녹음했고, 나중에 들어보면서 총 몇 마리의 오리가 있는지 구해보려고 한다.
녹음한 소리는 문자열로 나타낼 수 있는데, 한 문자는 한 오리가 낸 소리이다. 오리의 울음 소리는 연속될 필요는 없지만, 순서는 "quack"이어야 한다. "quqacukqauackck"과 같은 경우는 두 오리가 울었다고 볼 수 있다.
영선이가 녹음한 소리가 주어졌을 때, 영선이 방에 있을 수 있는 오리의 최소 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 영선이가 녹음한 소리가 주어진다. 소리의 길이는 5보다 크거나 같고, 2500보다 작거나 같은 자연수이고, 'q','u','a','c','k'로만 이루어져 있다.
출력
영선이 방에 있을 수 있는 오리의 최소 수를 구하는 프로그램을 작성하시오. 녹음한 소리가 올바르지 않은 경우에는 -1을 출력한다.
일단
처음에 생각이 든건 오리 울음소리를 파악할 때 한번 q부터 스캔 했을 때 나오는 여러 울음소리는 오리 1마리로 간주한다는 것이었다. 그래서 파악할 수 없을 때 까지 스캔해서 개수를 센다면 풀 수 있겠다 판단했다.
필요한 변수로
1 오리 문자열
2 오리 개수
3 오리 울음소리 배열
4 오리 울음소리 인덱스
5 방문한 문자배열
이정도를 생각했고, -1이 나오는 조건으로 문자열이 전부 채워지지 않았을 때만 고려하고
문자열에서 센 문자를 하나씩 줄이는 걸 생각했다.
하지만 del은 사용안되고, 길이가 변해서 안된다.
https://tmdrl5779.tistory.com/128
[백준] 12933번번 (python 파이썬)
구현 문제이다. 울음소리를 보고 최소한의 오리가 몇마리인지 찾는다. 오리의 울음소리는 quack이다. q -> u -> a -> c -> k 를 순서대로 찾는다. ex) 울음소리가 quqacukqauackck 라면 quack를 순서대로 찾는
tmdrl5779.tistory.com
시작이 반 님의 코드를 참고해 보았는데,
나는 None으로 방문 배열을 초기화하려 했고, while로 None일 때로 조건을 주려했는데,
False로 초기화하고 all()로 전부 True인지 판단하는게 더 좋았다.
그리고 내가 놓친 조건으로 문자열이 5의 배수여야 한다는 부분과
방문을 전부 못했을 때( not all(방문배열)일때) 2가지가 있었다.
내코드에서 변형해서 짜보았다. 함수로 모듈화하는게 더 좋은것 같다.
또 first라는 불변수를 주어서 중복된 울음소리를 처리하는 부분도 좋았다.
그리고 처음에 if문으로 줄줄이 했었는데, 1개의 if문으로 최적화할 수 있었다.
풀이
#문자열 입력 받기
duckvoice=input()
#오리 개수 변수
count=0
#오리 울음소리 배열
voice=['q','u','a','c','k']
#오리 울음소리 인덱스
now=0
array=[False for _ in range( len(duckvoice) )]
# 추가 : 문자열이 5의 배수가 아닌것 제거
if len(duckvoice)%5!=0:
print(-1)
exit()
for i in range(len(duckvoice)):
if duckvoice[i]=='q' and not array[i]:#첫시작을 q가 보이면 시작한다. 그리고 방문하지 않았어야한다.
first=True # 이걸 쓰는 이유는 한 오리가 여러번 운걸 구분하기 위해서 쓴다.
for j in range(i,len(duckvoice)): # 이건 다시 처음으로 돌아가서 조사할 필요없어서 i부터로 표현.
if not array[j] and duckvoice[j]==voice[now]: # 현재 울음소리와 오리울음소리 순서가 같고,방문안했을 때
array[j]=True #방문한걸로 표시
if duckvoice[j]=='k': # k까지 울음소리 포착했을 때
if first: #아직 안셌으면 센다.
count += 1
first = False # 한번 검사할 때 중복되서 찾은건 1번만 하려고
now = 0 #오리 울음소리 처음부터 다시 세기
continue #0번째로 초기화해서 +1안하려고
now += 1
if not all(array) or count==0: # 문자열을 다방문하지 않았거나 오리가 1마리도 없을 때
print(-1)
else:
print(count)