풀고 자괴감을 느낀 문제다 ㅋㅋㅋ
내가 적은거 리뷰하고 최상단에 있는거 리뷰해보겠다
일단 속도차이 ^^;
후....
내가 적은 코드는 이와 같다
function solution(s) { return s.length % 2 === 0 ? s.split("").slice(s.length / 2 - 1, s.length / 2 + 1) .join("") : s[Math.floor(s.length / 2)]; }
일단 중간값을 알아야 하는게 우선이고, 그것으로 구분을 하기 때문에
문자열로 자르고, 슬라이스로 구역을 설정해서 가져왔다.
어떻게 봐도 복잡하다 만약에 글자수가 짝수면
배열로 분해해서 그 값만 땡겨오고 다시 문자열로 바꿔서 리턴이라서;
최상단의 코드는 이러하다
function solution(s) { return s.substr(Math.ceil(s.length / 2) - 1, s.length % 2 === 0 ? 2 : 1); }
일단 substr를 몰라서 한번 찾아와보면
substr() 메서드는 문자열에서 특정 위치에서 시작하여 특정 문자 수 만큼의 문자들을 반환합니다. 공식 MDN
라고 나와있다.
와 진짜 미쳤다 이걸 어떻게 생각해내는거지? 진짜 도랏다
substr()는 두개의 매개변수를 받을 수 있는데
앞에는 시작점의 인덱스 번호, 뒤에는 보여줄 갯수를 표기한다.
substr(3,4) 이렇게 적으면 인덱스 3번부터 4개 보여줘! 해서 인덱스 3,4,5,6 번이 나온다.
아무튼 코드를 해석해보면!
앞에 시작점은 Math.ceil(s.length / 2) - 1
만약에 s가 "abcd"면 4/2-1이라서 1이 된다.
또 s가 "abcdefghj"라면 9/2하고 ceil로 올림해서 4.5가 5으로 변하고 -1해서 4가 된다.
그리고 보여줄 갯수를 판별하는 식은 이거다
s.length % 2 === 0 ? 2 : 1
짝수면 2개 홀수면 1개를 보여준다는 의미다, 삼항연산자가 매개변수로 들어갈 수 있다는건 처음알았다;
아무튼 만약에 "abcde" 5자리의 문자열이 들어가면
Math.ceil(s.length / 2) - 1 = 5/2 -> 2.5 반올림 3.0 -> -1해서 2
5%2=1이니까 false라서 1해서
시작점은 2, 끝나는 점은 1 해가지고 "c"하나만 출력된다.
맨처음에는 콤마가 들어가있길래 삼항 연산자의 조건에 콤마가 들어갈 수 있는건가,,, 라고 검색을 계속 해봤는데 그런 내용이 없길래
substr()의 공식문서를 들어갔더니 시작과 끝을 콤마로 분리할 수 있다고 해서 머리치면서 해석을 할 수 있었다.
와... 너무.,, 너무 신기하다,,,,,, 나도 저렇게 풀 수 있는 날이 오는가,,,?