3. quack을 문자마다 0, 1, 2, 3, 4로 표기함. 즉, 오리가 quack을 완성할수록 하나의 인덱스의 값은 0에서 4까지 1씩 증가함
4. 리스트에서 제일먼저 k까지 울은 오리의 index를 따로 다른 리스트를 만들어서 오리를 순서대로 줄세워둠
5. 최근에 k까지 울은 오리를 먼저 뽑아서 (스택 스타일) q를 먼저 줌(해당 인덱스에 0으로 갱신) = 먼저 울게 해준다.
6. 정상적으로 울지 않는 것에 대해서는 예외처리를 통해 처리하고, -1을 출력함.
코드 구현
# 울음 소리를 한 번 또는 그 이상 연속해서 내는 것
# quack이 끝나기전에 q가 나오면 다른 마리인 것.
# quack이 완벽하게 끝나고 또 quack이 완벽하게 끝나면 한마리로 침
tmp = []
s = input()
waitList=[]
check = 0
for i in s:
if i == 'q':
if waitList:
where = waitList.pop()
tmp[where] = 0
else:
tmp.append(0)
elif i == 'u':
try:
where = tmp.index(0)
except ValueError:
check = 1
break
tmp[where]+=1
elif i == 'a':
try:
where = tmp.index(1)
except ValueError:
check = 1
break
tmp[where]+=1
elif i == 'c':
try:
where = tmp.index(2)
except ValueError:
check = 1
break
tmp[where]+=1
elif i == 'k':
try:
where = tmp.index(3)
except ValueError:
check = 1
break
tmp[where]+=1
waitList.append(where)
result = 0
if check ==1:
print(-1)
else:
for i in tmp:
if i == 4:
result +=1
else:
print(-1)
check = 1
break
if check !=1:
print(result)
시간/공간 복잡도
O(N)
최적화 및 개선
따로 하지 않음.
어려웠던 점
리스트에서 특정 값을 통해 index를 구할때, index()함수만 쓸 줄 알았다. 그리고 그 함수가 찾고자 하는 값을 못찾을때 -1을 반환하기 보다는 ValueError를 발생시킬줄 몰랐다. 찾아보니 find()함수가 문자열에서 찾고자 하는 값을 못찾을때 -1을 반환했다.
하지만 find()함수를 사용하지 않았다. quack 우는 것을 숫자로 표기해서 문제푸는게 넘 편한데 다시 문자열로 변환할 필요를 못느꼈다.
처음에 문제의 감을 못잡아서 문자열 앞에서부터 quack을 지워갈 생각을 했다. ㅎ;
코딩테스트 문제 풀면서 예외처리문을 처음 사용해본것 같다. 사용법에 대해서 잘 숙지하고 있어야겠다.
코드에 중복되는 부분이 많아서 함수로 표현을 하면 좋을것 같았다. 함수로 코드를 짜버릇 해야겠다.
기본 키에만 의존하지 않는 불필요한 데이터를 제거한다는 말은 데이터베이스에서부분 함수 종속과 관련된 문제를 해결하는 것을 의미해. 이것은 데이터를 저장할 때 정보가 중복되지 않도록 테이블을 잘 설계하는 방법 중 하나야. 쉽게 말해서, 데이터를 효율적으로 정리하는 방법이라고 생각하면 돼.
기본 키(Primary Key): 데이터베이스에서 각 줄(row)을 고유하게 식별하는 값이야. 예를 들어, 학생 명단에서는 학생마다 고유한 학생 번호가 기본 키가 될 수 있어. 학생 번호가 같으면 같은 학생이라고 보면 돼.
부분 함수 종속: 테이블의 어떤 칼럼(열)의 값이 기본 키의 일부분에 의해서만 결정되는 상황을 말해. 예를 들어, "수업" 테이블이 있다고 해보자. 여기에는 학생 번호, 수업 코드, 학생 이름, 수업 이름 같은 칼럼이 있어.
문제 상황:
만약 학생 번호와 수업 코드를 합쳐서 기본 키로 삼는다면, 각 줄은 한 학생이 특정 수업을 듣고 있다는 것을 나타내.
여기서 학생 이름은 학생 번호에만 의존하고, 수업 이름은 수업 코드에만 의존해.
이런 상황에서 한 학생이 여러 수업을 들으면 학생 이름이 여러 줄에 반복돼서 저장될 수 있어. 마찬가지로 여러 학생이 같은 수업을 들으면 수업 이름도 반복돼서 저장돼.
해결 방법:
이런 불필요한 중복을 피하기 위해 테이블을 나누는 거야:
학생 테이블: 학생 번호, 학생 이름
수업 테이블: 수업 코드, 수업 이름
수강 테이블: 학생 번호, 수업 코드
이렇게 테이블을 나누면, 각 테이블의 정보가 기본 키에만 의존하게 돼. 따라서 데이터의 중복을 줄이고, 정보가 변경될 때 모든 관련 데이터를 일일이 수정하지 않아도 돼.
이것이 바로 기본 키에만 의존하지 않는 불필요한 데이터를 제거하는 이유야. 이렇게 하면 데이터베이스가 더 효율적으로 관리되고, 오류도 줄일 수 있어.