ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [알고리즘/자바스크립트] 홀수 짝수 판별하여 map()으로 배열 재구성하기 (WeIrD StRiNg CaSe)
    Algorithm 2019. 2. 19. 22:28

    -해당 문제는 codewars사이트의 level6 문제입니다. (1~8단계 중 8단계가 가장 쉬운 레벨)-




    [문제] Write a function toWeirdCase (weirdcase in Ruby) that accepts a string, and returns the same string with all even indexed characters in each word upper cased, and all odd indexed characters in each word lower cased. The indexing just explained is zero based, so the zero-ith index is even, therefore that character should be upper cased.


    The passed in string will only consist of alphabetical characters and spaces(' '). Spaces will only be present if there are multiple words. Words will be separated by a single space(' ').


    Examples:

    toWeirdCase( "String" );//=> returns "StRiNg"

    toWeirdCase( "Weird string case" );//=> returns "WeIrD StRiNg CaSe"




    [해석] 어떤 영어 문장이 주어졌을 때 그 문장의 짝수번째 index는 대문자로, 홀수번째 index는 소문자로 변환하여 return해라. 다만 index는 0부터 시작한다. 문장은 문자열과 빈 공백 ' '으로 이루어져있는데, 공백은 오로지 단어를 구분하는 용도이며 index번호와는 상관이 없다.




    흠 일단 문제를 잘 살펴보면 

    index번호가 0부터 시작하므로


    짝수번째 index = 홀수번째 글자 = 대문자

    홀수번째 index = 짝수번째 글자 = 소문자


    이렇게 된다.



    function toWeirdCase(string){
    	var arr = string.split(' ')
    	var fullName = ''
    	arr.forEach(function(v, i) {
    		var spl = arr[i].split('');
    		var newSpl = spl.map(function(al, j) {
    			if(j % 2 == 0) {
    				// 짝수번째 인덱스 -> 대문자
    				return al.toUpperCase()
    			} else {
    				return al.toLowerCase()
    			}
    		})
    		fullName += ' ' + newSpl.join('')
    	})
    	return fullName.trim()
    }


    일단 string이 한 단어만 주어질 수도 있지만 여러 개의 단어가 주어질 수도 있다.

    그리고 그 단어들이 공백으로 띄워져있으니 먼저 공백을 기준으로 split을 하였다.


    그리고 forEach문을 돌려서 다시 한 번 단어들을 split시키는데 이번엔

    공백을 기준으로 하지 않고 split('')이라고 넣었다.

    이렇게 넣으면 글자 하나 하나가 다 쪼개진다.

    그리고 그렇게 쪼개진 글자들이 각각 배열의 요소가 된다.


    이제 그 요소들을 짝수번째, 홀수번째 인덱스로 나눠서 

    각각 대문자/소문자로 변환한 후 새로운 배열을 만들어야 하는데

    배열을 새로 구성하는 데에는 map()을 쓰면 매우 유용하다.


    map(al, j)의 첫번째 파라미터 al은 배열의 각 요소를 가져오고 j는 그 요소의 index번호를 가져온다.

    index번호가 짝수냐 홀수냐를 파악해야 하니 if문으로 조건식을 세웠다.

    j를 2로 나눴을 때 0으로 떨어지면 그 수는 짝수라는 조건식이다.


    그리고 대소문자 변환 후 return시키면 변환된 요소들로 새 배열이 만들어지는데

    그 배열들을 join()함수를 사용하여 하나로 합친다.

    그리고 기존에 만들어 둔 fullName이란 변수에 공백과 함께 더했다.

    그러면 맨 앞에도 공백이 생기는데 이건 trim()으로 잘라냈다.





    이렇게 작성한 코드는 실행시키면 작동은 잘 된다.
    근데 문제는 코드가 너무 길다는거다.ㅠㅠ
    다 풀고 제출하고 다른 사람의 풀이를 언뜻 봤는데
    평균 2~4줄밖에 안하는 코드들을 보고 나도 최대한 코드를 줄여보기로 했다.


    function toWeirdCase(string) {
    	var full = string.split(' ').map((x, i) => {
    		var word = x.split('').map((y, j) => {
    			if (j % 2 == 0) return y.toUpperCase()
    				else return y.toLowerCase()
    		})
    		return word.join('')
    	})
    	return full.join(' ')
    }


    먼저 함수는 map()으로 통일시켰다.

    왜냐면 처음에 단어를 공백으로 쪼개서 반복시켜 새로운 요소들을 만들고

    그 요소들을 또 쪼개서 반복시켜서 새로운 배열을 만드는거니

    둘 다 map()을 사용할 수 있다.


    첨에 string을 공백 기준으로 쪼개서 만든 배열을 바로 map()함수로 돌리는데

    코드를 좀 더 간결하게 만들기 위해 화살표 함수를 사용하였다.

    공백으로 잘려진 단어배열의 각 단어는 x라는 변수로 받아올 수 있는데

    그 x를 다시 알파벳 단위로 split한 후 또 map()을 돌린다.

    그리고 index번호 j로 홀짝을 체크해서 대소문자를 return하고

    바로 join시켜 단어를 새로 만든다.


    그리고 새로 만들어진 단어를 다시 공백과 함께 join시켜 return하면

    아까같이 복잡하게 변수에 += 한 후 trim()으로 앞뒤 공백을 자를 필요 없이

    필요한 문장만 깔끔하게 return되어 출력된다.






    반응형

    COMMENT