문제
strs은 단어가 담긴 배열이다.
공통된 시작 단어(prefix)를 반환해라.
예를 들어
strs = ['start', 'stair', 'step']
return은 'st'
strs = ['start', 'wework', 'today']
return은 ''
풀이
- 문제의 조건 정리
1) str형의 데이터가 담긴 배열을 인자로 받는다.
2) 데이터들의 공통된 시작 단어들(prefix)를 반환한다.
- 조건에 대한 코드 구현 방법 생각
1) 인자는 이중배열로 이루어져 있고 이중배열 내 요소를 하나 하나 검사하기 위해서는 이중 for문을 만들 수밖에 없다고 생각
for i in strs:
for j in strs:
if strs[j][i] == strs[j+1][i]
# 이런식으로..
-> 하지만 위와 같은 형식으로 했을 때 [j+1] 인덱싱은 indexOutofRange 오류를 발생시켜 구조적으로 문제가 있음을 발견.
2) 그럼 배열 내 모든 값을 검사하지 않더라도 배열 내 모든 값을 검사하는 것처럼 할 수 있는 코드를 생각해야 했다.
3) strs.sort()를 하면 strs는 ABC순으로 정렬된다.
4) 이후 strs의 가장 첫 번째 값(strs[0])과 마지막 값(str[-1])의 prefix 값을 for문을 돌려서 비교하면 될 것 같다.
5) for문을 돌려서 두 개의 값이 같다면 prefix 값을 변수에 저장하고, 그렇지 않다면 for문을 종료한다.
6) 변수에 저장된 값을 반환한다.
- 구현 코드
def get_prefix(strs):
if len(strs)==0:
return ''
strs.sort()
a=strs[0]
b=''
for i in range(len(a)):
if strs[-1][i] == a[i]:
b += strs[-1][i]
else:
break
return b
- 코드 리뷰
- strs 값으로 아무것도 없는 값이 들어 왔을 때를 대비하여 처음 if문을 추가 하였다.
- a=strs[0] 로 a를 선언한 이후 for문에서 iterator값으로 준다. 그 이유는 sort를 돌린 뒤 strs[0] 값은 가장 짧은 값이기 때문에 굳이 긴 range를 돌지 않는 효율적인 코드이기 때문이다.
- if문을 돌리고 strs[-1][i] == a[i] 가 True면 미리 선언한 b에 값을 저장하고 False면 break가 된다.