JavaScript/알고리즘

프로그래머스 qr code JS ( for문, map() / filter() )

hihiha2 2023. 7. 1. 19:00

문제 설명

두 정수 qr과 문자열 code가 주어질 때, code의 각 인덱스를 q로 나누었을 때 나머지가 r인 위치의 문자를 앞에서부터 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.

 

 

 

🙋‍♀️ 내 생각

code를 순회하면서 인덱스/q의 나머지가 r인지 아닌지를 확인한 뒤, r인 문자열만 이어붙여야 한다.

 

code를 순회하기 위해서 for문과 map, forEach가 생각났다.

먼저 for문으로 순회하는 코드를 짜고나서 map과 forEach로도 바꾸어 보았다.

 

 

 

✅ 내 코드 1

function solution(q, r, code) {
    let result =''
    
    for(i=0; i<code.length; i++){
        if(i%q === r){
            result += code[i]
        }
    }
    return result
}

제일먼저 이어붙인 문자열을 담을 변수 result를 선언하고 ''로 빈문자열을 할당하여 초기화한다.

 

그런 다음, for문을 통해서 code를 순회해야하기때문에 0부터 code.length보다 작은값만큼으로 범위를 지정하고 1씩 더한다.

code의 인덱스를 q로 나눈 나머지가 r인 경우만 문자열을 더해야하기 때문에 if문을 통해서 해당하는 값만 통과하도록 조건문을 만든다.

 

만약 조건문에 적합하면 result += code[i]를 통해서 그 해당하는 값을 result에 더해서 축적해나가도록 한다.

 

이렇게 하면, 'jerry'와 같이 해당하는 값만 result에 더해진다.

 

 

for문을 이용하면 간단하게 풀 수 있는 문제였다.

하지만 리액트의 JSX에서는 반복문을 for문이 아니라 map을 사용하여 순회하는 코드를 주로 짜기때문에 map을 자주 짜면서 연습을 하면 좋을 것 같다는 생각이 들었다. 그래서 해당 코드를 map을 이용한 방법으로도 만들어보았다.

 

 

✅ 내 코드 2

function solution(q, r, code) {
    let result ='';
    [...code].map((v,i)=>i%q === r? result += v : result )
    return result
}

결괏값을 담을 result변수를 ''로 할당하여 초기화하는 것은 위와 동일하다.

 

map은 array에만 쓸 수 있는데, code는 문자열이기때문에 ...전개연산자를 통해서 풀어내고 []를 통해서 다시 배열에 담았다.

배열이기 때문에 map을 통해서 각 요소를 돌 수 있다.

요소를 돌면서 i%q ===r인지를 검사한다.

만약 해당되면 result += v를 수행하고 아니라면 result을 그대로 유지한다(result변수에 변화가 없다는 의미)

 

위의 코드를 forEach로 바꿔도 동작한다.

 

 

 

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

function solution(q, r, code) {
  return [...code].filter((_, i) => i % q === r).join('');
}

filter를 사용해서 간단하게 푼 코드이다.

순회하면서 특정값을 거르기 위해서는 filter값을 이용하는 것이 편한데 왜 생각이 안났을까..?🤔

 

...전개연산자를 이용해서 code를 풀어내고 []로 배열에 담는 과정은 똑같다. filter도 array타입에만 사용할 수 있기때문에 이렇게 배열타입으로 변환을 해주어야한다. 그런 다음, filter의 두번째 인자로 인덱스값이 들어간다는 것을 이용해서 풀었다. 이렇게 하면 i%q == r 인 값만 남는다. 요소값 자체는 사용할 필요가 없기 때문에 _(언더스코어)로 표기했다. 이렇게 하면 배열안에 해당하는 값만 남기때문에 다시 join('')을 이용해서 하나의 문자열로 만든다.

 

 

 

🙋‍♀️ 내 생각

요소를 돌면서 특정한 값만 남기는 기능을 하는 것은 for문이나 다른 메서드를 이용하는 것보다 filter를 이용하는 것이 편하다.

물론 다른 방법으로도 풀 수 있지만 굳이 그렇게 풀 필요는 없는것같다. filter는 자주 사용하는 메서드인데 왜 생각이 안났는지 모르겠다 😇

다음번에는 꼭 써야지!! 잊지말자 filter 🔥🔥