[CodeKata] 5. get_prefix

그냥·2022년 6월 13일
0

CodeKata

목록 보기
4/18

문제

strs은 단어가 담긴 배열이다.

공통된 시작 단어(prefix)를 반환해라.

예를 들어

strs = ['start', 'stair', 'step']
return은 'st'

strs = ['start', 'wework', 'today']
return은 ''

풀이

  1. 문제의 조건 정리
1) str형의 데이터가 담긴 배열을 인자로 받는다.
2) 데이터들의 공통된 시작 단어들(prefix)를 반환한다.

  1. 조건에 대한 코드 구현 방법 생각
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) 변수에 저장된 값을 반환한다.

  1. 구현 코드
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

  1. 코드 리뷰
  • strs 값으로 아무것도 없는 값이 들어 왔을 때를 대비하여 처음 if문을 추가 하였다.
  • a=strs[0] 로 a를 선언한 이후 for문에서 iterator값으로 준다. 그 이유는 sort를 돌린 뒤 strs[0] 값은 가장 짧은 값이기 때문에 굳이 긴 range를 돌지 않는 효율적인 코드이기 때문이다.
  • if문을 돌리고 strs[-1][i] == a[i] 가 True면 미리 선언한 b에 값을 저장하고 False면 break가 된다.

0개의 댓글