[javscript][알고리즘] filter 함수 질문

조회수 709회

안녕하세요. 아래의 코드는

people과 tshirts 배열은 모두 오름차순으로 정렬되어있고

  1. people 배열의 원소 person이 tshirts 배열의 원소들보다 같거나 작으면 ,
  2. person과 대응된 tshirts 배열의 원소를 삭제하고
  3. 조건에 맞는 person을 fp라는 배열로 만든다음
  4. 배열의 길이를 리턴하는 함수입니다.
const fp = people.filter(person => {
        for(let item of tshirts){ // tshirt 배열에서 person을 찾는 경우 배열 값변경
            if(person <= item){
                tshirts.splice(tshirts.indexOf(item),1)
                return person <= item;
            }
        }
    });
    return fp.length;

사실 제가 찾고 싶은것은 tshirts 배열의 원소보다 작거나 같은 peson 배열의 원소들 인데요. 어떻게 찾을까 고민하던중에 1. 조건에 맞는 배열을 만들고 2. 배열의 길이를 리턴하자 라는 생각이 들었고, 조건에 맞는 배열을 만드려면 filter 메소드를 사용하는것이 가장 좋은 방법인것 같아 위와 같은 코드를 작성하였습니다.

그런데 filter 함수는 보통 아래와 같이 return 을 생략하고 조건에 맞는배열만 바로 뽑아낼때 가장 사용성이 좋은데

const result = words.filter(word => word.length > 6);

제가 짠 코드에서는

  1. return 생략이 되지 않고
  2. filter 함수 내부에서 tshirts 배열을 계속 변경해줍니다.

그래서 ... 원하는 동작은 하지만, 더 좋은 방법이 있지 않을까 해서 질문을 드립니다.

배열에서 조건에 맞는 배열을 뽑아내기 위해서 reduce , map ,filter 와 같은 함수들을 잘 써주어야하는것으로 알고있는데요. 이 경우에 filter 함수를 사용하는것이 최선일까요? 어떻게 하면 좀 더 깔끔하고 아름다운(?) 코드를 작성할 수 있을지 여쭤보고싶습니다.

질문 읽어주셔서 감사합니다! :)

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 답변은 아니지만, if (person <= item) 한칸띠고 return !!tshirts.splice(tshirts.indexOf(item),1) 최진우 2019.2.24 11:01
  • 덕분에 느낌표 두개라는게 있는지 처음 알게 되었습니다. 감사합니다! 알 수 없는 사용자 2019.2.24 20:14
  • filter 함수에서는 느낌표 2개를 붙여줘야할 경우가 종종 있겠네요. 알 수 없는 사용자 2019.2.24 20:22
  • 그리고 .. filter함수에서는 return 할 element ( 여기서는 person ) 를 return person <= item; 이렇게 명시적으로 표현하기보단 return !!tshirts.splice(tshirts.indexOf(item),1) 이렇게 조건을 참으로 만드는 것들을 리턴한다. 라고 써주면 훨씬더 간결하고 간지나게(?) 사용할 수 있겠네요.. 알 수 없는 사용자 2019.2.24 20:27
  • 음 그리고 ... 꼭 느낌표 2개를 붙여줄 필요가 있을까요? 어짜피 true 만 리턴하기떄문에 그냥 if(person <= item) return tshirts.splice(tshirts.indexOf(item),1)로 작성해도 되지않을까요..? 알 수 없는 사용자 2019.2.24 20:33
  • 네, 당연히 가능합니다! 두개는 truthy value를 true로 바꿀때 보다는 falsy value들을 false로 바꿀때 더 많이 쓰는것 같아요~ 최진우 2019.2.25 00:18

1 답변

  • 기법이 중요한 경우도 있고 해당 기법이 문제를 단순화 해 줄 수 있는 경우도 있지만

    제가 코드를 보기엔 filter라는 함정에 빠져서 주석이 아니면 의도를 파악하기 힘든 코드를 짜신건 아닌가 싶네요.

    그냥 이중 for문에 추가적으로 적절한 이름의 변수를 더 두더라도 코드 자체만 봐도 이해하기 쉬운 코드가 더 좋다고 생각합니다. 특히나 혼자 개발하는 상황이 아니라면 말이죠.

    • 정확하게 질문의 답이 아닌건 죄송합니다. 다만 마지막에 깔끔하고 아름다운 코드를 작성하는데 고심하시는 것 같아서 제가 아름다운 코드라고 생각하는 것에 대해 짧게 적어봤습니다. doodoji 2019.2.25 14:11
    • 아직 JS 문법에 익숙하지 않아 map , filter , reduce 를 잘 쓰고싶어서 웬만하면 코드를 짤때 단순 for문이 아닌방법을 생각해서 짜고있는데요 ㅎㅎ.. 저도 다른사람이 알아보기 좋은 코드가 제일 좋은 코드인것같네요 ㅎㅎ 답변감사합니다! 알 수 없는 사용자 2019.2.26 09:41

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)