안녕하세요. 민쯔입니다.😊
이번에는 "가운데 글자 가져오기"를 풀어보았습니다.
이번 문제는 쉬운 편에 속해서 빨리 풀었던 것 같아요.
쉬운 대신 어떻게 더 효율적으로 푸는지에 대한 문제인 것 같아요.
이번 해결방안에서는 제가 풀었던 방식과 프로그래머스에서 다른 사람 풀이에 대해 총 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
- s= "qwer"일 경우 (짝수)
추출할 문자들의 총숫자를 삼항 연산자를 활용해서 구해주었는데요.
짝수일 경우 2, 홀수일 경우 1로 하여
- s= "qwer"일 경우 (짝수)
- s.substr(1, 2) // we
- s= "abcde"일 경우 (홀수)
- s.substr(2, 1) // c
'코딩 > 프로그래머스 코딩테스트' 카테고리의 다른 글
[프로그래머스] 나누어 떨어지는 숫자 배열 (0) | 2021.12.29 |
---|---|
[프로그래머스] 같은 숫자는 싫어 (0) | 2021.12.28 |
[프로그래머스] 비밀지도 (0) | 2021.12.08 |
[프로그래머스] 나머지가 1이 되는 수 찾기 (0) | 2021.11.20 |
[프로그래머스] 부족한 금액 계산하기 (0) | 2021.11.11 |