코딩/프로그래머스 코딩테스트

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

민쯔 2021. 12. 9. 17:21
728x90
반응형

안녕하세요. 민쯔입니다.😊

이번에는 "가운데 글자 가져오기"를 풀어보았습니다.
이번 문제는 쉬운 편에 속해서 빨리 풀었던 것 같아요.
쉬운 대신 어떻게 더 효율적으로 푸는지에 대한 문제인 것 같아요.

이번 해결방안에서는 제가 풀었던 방식과 프로그래머스에서 다른 사람 풀이에 대해 총 2가지에 대해 설명해 보겠습니다.

function solution(s) {
    // 버전 1
    return s.length % 2 === 0 ? s.substr(s.length / 2 - 1, 2) : s.substr(parseInt(s.length / 2), 1);
    
    // 버전 2
    return s.substr(Math.ceil(s.length / 2) - 1, s.length % 2 === 0 ? 2 : 1);    
}

둘 다 삼항연산자를 사용했는데요.
삼항연산자를 알면 이곳저곳 쓰기 편하니 꼭 알고 가시길 바랍니다.👍

  • 조건 ? true : false

 

버전 1

// 버전 1
return s.length % 2 === 0 ? s.substr(s.length / 2 - 1, 2) : s.substr(parseInt(s.length / 2), 1);

버전1을 제가 푼 방식인데 중복되는 코드가 많아서 비추합니다...
그래도 여기서 쓴 메서드를 알아가는 것도 좋을 것 같아서 설명해보려고 해요.

  • 문자열.length : 문자열 길이를 나타냅니다.
    • s= "abcde"일 경우, s.length // 5
  • s.length % 2 === 0 : 문자열 길이  / 2를 했을 때 나머지 값이 0인지
    • % : 나머지
    • === : ==보다 더 엄격하게 같음을 비교
      • ==보다 ===를 쓰는 게 좋아요.
  • substr() 메서드는 문자열에서 특정 위치에서 시작하여 특정 문자 수만큼의 문자들을 반환합니다.
    • str.substr(문자들의 시작 위치, 추출할 문자들의 총 숫자);
    • s= "abcde"일 경우
      • s.substr(2, 1) // c
      • s.substr(2, 2) // cd

 

조건 ? true : false

  • 조건 : s.length % 2 === 0
    • 문자열 길이  / 2를 했을 때 나머지 값이 0인지
  • true : s.substr(s.length / 2 - 1, 2)
    • 만약 나머지 값이 0일 경우
    • "단어의 길이가 짝수라면 가운데 두 글자를 반환하면 됩니다." 조건이 있으므로 substr() 뒷자리에 2를 넣어야 됩니다.
    • "현재 문자열 길이 / 2 - 1"로 쓴 이유는 substr()의 시작 자리는 index로 인식하기 때문에 -1을 해줘야지 알맞습니다.
    • s= "qwer"일 경우
      • s.substr(s.length / 2 - 1, 2) = s.substr(4 / 2 - 1, 2) = s.substr( 2 - 1, 2) = s.substr( 1, 2) = we
  • false : s.substr(parseInt(s.length / 2), 1)
    • 만약 나머지 값이 0이 아닐 경우
    • 홀수는 가운데 자리가 있으므로 substr() 뒷자리에 1를 넣어야 됩니다.
    • s= "abcde"일 경우, s.length / 2 = 2.5 가 나오기 때문에 정수로 바꾸어줘야 됩니다.
    • parseInt() 함수는 정수를 반환합니다.
      • 앞어 나온 2.5를 2로 바꾸어 줍니다.
    • s= "abcde"일 경우
      • s.substr(parseInt(s.length / 2), 1) = s.substr(parseInt(5 / 2), 1) = s.substr(parseInt(2.5), 1) = s.substr(2), 1) = c

 

버전 2

// 버전 2
return s.substr(Math.ceil(s.length / 2) - 1, s.length % 2 === 0 ? 2 : 1);

버전 2는 다른 사람 풀이 방법인데 알아가면 좋을 것 같아서 설명해보겠습니다.

버전 1에서 중복부분이 있는 거 보이시지 않으셨나요?
s.substr(s.length / 2 - 1, 2) 요 부분이 중복이면서 중복이 아닌 것 같은 느낌ㅋㅋ
버전 2에서는 이 부분을 합쳐서 했고, substr의 추출할 문자들의 총숫자만 비교를 해서 넣어 주었습니다.
역시 이 세상에 코드 잘 치는 사람이 너무 많은 것 같아요👏👏

 

버전 2에서 가장 중요한 포인트는

  • 짝수 / 2  = 정수
  • 홀수 / 2 = 정수. 5

홀수 / 2를 하면 무조건. 5가 나온다는 점이에요.

버전 1에서
짝수면 s.substr(s.length / 2 - 1, 2)
홀수면 s.substr(parseInt(s.length / 2), 1)
라고 썼는데, 짝수에서 굳이 -1을 했었죠. 이걸 안 써도 Math.ceil()로 충분해 해결이 됩니다.

Math.ceil() 함수는 반올림을 해주는 함수입니다.
뒷자리가. 5면 올림이 된다는 거 다들 아시죠?
그래서 짝수가 되든 홀수가 되든 s.length / 2를 하면 같은 수가 나오게 만들어주었습니다.

  • Math.ceil(s.length / 2) - 1
    • s= "qwer"일 경우 (짝수)
      • Math.ceil(4 / 2) - 1 = Math.ceil(2) - 1 = 2 - 1 = 1
      • 1이면 시작 위치 w
    • s= "abcde"일 경우 (홀수)
      • Math.ceil(5 / 2) - 1 = Math.ceil(2.5) - 1 = 3 - 1 = 2
      • 2이면 시작 위치 c

추출할 문자들의 총숫자를 삼항 연산자를 활용해서 구해주었는데요.
짝수일 경우 2, 홀수일 경우 1로 하여

  • s= "qwer"일 경우 (짝수)
    • s.substr(1, 2) // we
  • s= "abcde"일 경우 (홀수)
    • s.substr(2, 1) // c
728x90
반응형