JavaScript/알고리즘

프로그래머스 가운데 글자 가져오기 JS

hihiha2 2023. 8. 19. 17:32

문제 설명

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

 

 

🙋‍♀️ 내 생각

s의 길이가 홀수인 경우와 짝수인 경우가 리턴되는 문자열의 길이가 다르다.

홀수인경우에는 가운데 하나의 문자열만을,

짝수인 경우에는 가운데 두개의 문자열을 리턴한다.

 

따라서 가장먼저 s가 홀수인지 짝수인지 경우를  나눠야겠다고 생각했다.

 

또한, 문자열도 배열처럼 index를 이용해서 값에 접근할 수 있는 성질을 이용해서 해당값을 추출하였다.

(접근만 가능하고 수정은 불가- 문자열은 불변한 데이터타입이므로)

 

 

 

✅ 내 코드

function solution(s) {
   if(s.length%2!==0){
       return s[Math.floor(s.length/2)]
   } else {
       return s[s.length/2-1] + s[s.length/2]
   }
}

홀수인 경우를 찾기 위해서 s.length%2!==0을 if문의 조건으로 넣었다.

 

그리고 if문의 안에서,

중간값의 인덱스를 구하기 위해서 s.length를 2로 나눈다 s.length/2

값이 홀수인 경우에는 2로 나누면 정수가 나오는 것이 아니라 소수점이 포함된 수가 나온다

(예를 들어 5를 2로 나누면 2.5가 나온다.)

➡️ 인덱스는 정수로 이루어져 있기 때문에 정수로 만들어줘야 한다.

이를 위해 Math.floor()를 이용한다.Math.floor(s.length/2)

 

인덱스는 0부터 시작하므로 2로 나눈수를 내림을 해주면 중앙에 위치하는 값의 인덱스가 나온다.

(2.5를 내림하면 2이다. 길이가 5이면 2가 중간인덱스이다.

예를 들면, "32456"이 있다고 하면 길이는 5이고 5/2=2.5, 가운데에 있는 값의 인덱스는 0,1,2,3,4중 2라고 할 수 있다.)

 

이렇게 길이가 홀수인 s의 중간인덱스를 구했으면 그 위치에 해당하는 값을 리턴하면 된다.

s[인덱스]를 통해서 해당 인덱스에 위치하고 있는 값만을 구해서 리턴한다. s[Math.floor(s.length/2)]

 

이제 같은 원리로 s의 길이가 짝수일 경우를 처리한다.

else문을 통해서 짝수일 경우로 분기처리한다.

짝수일 경우에는 가운데 2개의 문자열을 구해야한다. s.length/2를 하면 가운데 두개중 뒤에 있는 인덱스가 나온다. s[s.length/2]

여기에서 -1을 하면 바로 앞에 있는 인덱스이다. s[s.length/2-1]

 

이렇게 2개의 인덱스를 s.[인덱스]를 사용해서 접근하여 두개의 값을 구하고 문자열 2개를 이어주기위해서 +를 이용한다. 

(JS에서는 문자열+문자열 = 연결된 문자열이 나온다.)

 

 

 

 

✔️  개선할 점

일단 문제를 빨리 풀기위해서 위와 같은 코드를 짰는데, s.length/2라는 코드가 계속 반복되는 것을 볼 수 있다.

따라서 이렇게 반복되는 코드를 변수에 담아서 사용하면 더 가독성이 올라갈 것이다. 

function solution(s){
    const middleIndex = s.length/2
    if(s.length%2!==0){
        return s[Math.floor(middleIndex)]
    } else {
        return s[middleIndex-1]+s[middleIndex]
    }
}

계속 반복되는 s.lenght/2를 middleIndex라는 변수에 담아서 사용하였다.

 

 

 

 

 

💻  다른사람 코드중에 배울 것 

function solution(s) {
    const mid = Math.floor(s.length/2);
    return s.length %2 === 1 ? s[mid] : s[mid-1]+s[mid];
}

위에 내가 푼것과 원리는 동일하지만, 삼항연산자를 이용하여 코드가 더욱 간결하다.

 

우선, mid라는 변수에 중간위치의 인덱스를 담는다.

그리고 s.length%2 ===1? 를 통해 홀수인지 검사한다. 

 

만약 홀수라면 s[mid]를 통해 중앙값하나만 리턴하고, 홀수가 아닐경우(짝수)는 s[mid-1]+s[mid]를 통해서 가운데 2개의 값을 리턴한다.

 

 

 

 

🙋‍♀️ 내 생각

변수와 삼항연산자를 통해서 코드가 확실히 짧으면서도 가독성이 올라갈 수 있는 것을 확인했다.

위에 내가짠 코드와 아래의 코드는 원리는 100%동일하지만 가독성에서 차이가 있다. 

이렇게 변수에 담아서 활용하는 것을 계속 연습하면 좋을 것 같다.