code-kata(Week1 - Day5)(TIL)

이해용·2022년 5월 13일
0
post-thumbnail
post-custom-banner

Code Kata

오늘의 문제는 풀릴 것도 같은 느낌인데 너무 어렵게 생각하느라 풀리지가 않았다... 1시간이 지나서 답을 보고 해석을 해야겠다.

문제

strs은 단어가 담긴 배열입니다. 공통된 시작 단어(prefix)를 반환해주세요.

예를 들어 strs = ['start', 'stair', 'step'] return은 'st'

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

나의 처음 생각

문자를 처음부터 slice 하면서 for문을 이용하여 하나씩 증가하여 같은 문자열이 나오지 않는다면 종료를 하는 방법을 생각했는데 구현이 안되었다...

풀이

  1. 빈 문자열 prefix를 선언한다.
    let prefix = ""

  2. if문을 사용하여 strs 의 값이 null이거나 배열에 담긴 문자 열이 없다면 prefix를 return 한다.

	if(strs === null || strs.length === 0) {
	  return prefix;
  }
  1. for 문을 사용하여 strs의 첫번째 문자열의 길이까지 i를 하나씩 증가시키는 값을 넣어주고 char 이라는 이름으로 str[0] 의 값을 i 로 증가 시킬 수 있도록 선언한다. (첫번째 문자열의 길이만큼만 비교하면 되기 때문이다.)
	for (let i = 0; i < str[0].length; i++) {
		const char = strs[0][i];
  1. 두번째 for 문을 이용하여 str 배열의 두번째 문자 부터 시작하여 배열의 길이만큼 j를 증가시켜준다.

for (let j = 1; j < str.length; j++)

  1. str[j][i] 의 값이 char 과 일치하지 않을 때 prefix로 return 을 한다.
	if(strs[j][i] !== char) {
		return prefix
	}
  1. if문에 해당되지 않는다면 char값을 prefix에 넣어주는 작업을 반복해주며 최종 prefix 를 return 한다.
		prefix = prefix + char`
	}
	return = prefix

ex1) strs = ['start', 'stair', 'step']

  1. strs의 값이 null도 아니고 str.length의 값이 0 이 아니기 때문에 for문으로 이동한다.

  2. s가 시작될 때 for문에서 char = strs[0][0] = "s" 이고 두번째 for문의 if문에서 (strs[1][0], strs[2][0] = "s") === char이므로 prefix를 리턴하지 않고 두번째 for문 바깥에 있는 prefix = prefix + char 로 진행한다.
    prefix = (prefix = "") + (char = "s")

  3. t가 시작될 때 for문에서 char = strs[0][1] = "t" 이고 두번째 for문의 if문에서 (strs[1][1], strs[2][1] = "t") === char이므로 prefix를 리턴하지 않고 두번째 for문 바깥에 있는 prefix = prefix + char 로 진행한다.
    prefix = (prefix = "s") + (char = "t")

  4. a가 시작될 때 for문에서 char = strs[0][2] = "a" 이고 두번째 for문의 if문에서 (strs[1][2] = 'a') === char이나 strs[2][1] = "e") !== char 이므로 prefix = "st"를 리턴한다.

ex2) strs = ['start', 'wework', 'today']

  1. strs의 값이 null도 아니고 str.length의 값이 0 이 아니기 때문에 for문으로 이동한다.

  2. s가 시작될 때 for문에서 char = strs[0][0] = "s" 이고 두번째 for문의 if문에서 (strs[1][0] = w), (strs[2][0] = "s") !== char이므로 prefix= ""를 리턴한다.

최종 답안

const getPrefix = strs => {
      let prefix = ""
    if(strs === null || strs.length === 0) return prefix

    for (let i = 0; i < strs[0].length; i++){ 
        const char = strs[0][i]
        
        for (let j = 1; j < strs.length; j++){ 
            if(strs[j][i] !== char) {
              return prefix
            }
        }
        prefix = prefix + char
    }
    return prefix
}

느낀점

오늘 문제는 어떻게 풀어야할지 생각하기가 너무 까다로웠다는 생각이 들었다.
처음 slice를 사용하려하였지만 너무 어렵게 생각하였고 좀 더 쉽게 풀 수 있는 생각을 해야겠다는 마음이 들었다.
다음에 풀 때는 뭔가 값을 먼저 들어가는 것보다 값을 안넣었을 때 결과 값이 편하게 나오는 것부터 생각하고 그 다음에 본격적으로 return 될 수 있는 값을 생각해야겠다.
또 다시 중복 for문을 사용하는 문제가 나왔으며 for 안에서 변수 선언하는 것과 다음 for문에서는 if 문안에 for문을 멈추고 싶을 때 return 하는 방법에 대한 기본적인 방법을 아는 흐름이 중요하다고 느꼈다.

참고 및 출처
https://dev.to/urfan/leetcode-longest-common-prefix-with-javascript-32ca

profile
프론트엔드 개발자입니다.
post-custom-banner

0개의 댓글