CODE KATA #12

YoungToMaturity·2021년 2월 5일
0

CODE KATA 🧗‍♂️

목록 보기
12/37
post-thumbnail

차량 10부제

서울시는 6월 1일부터 교통 혼잡을 막기 위해서 자동차 10부제를 시행한다. 자동차 10부제는 자동차 번호의 일의 자리 숫자와 날짜의 일의 자리 숫자가 일치하면 해당 자동차의 운행을 금 지하는 것이다. 예를 들어, 자동차 번호의 일의 자리 숫자가 7이면 7일, 17일, 27일에 운행하 지 못한다. 또한, 자동차 번호의 일의 자리 숫자가 0이면 10일, 20일, 30일에 운행하지 못한다.
여러분들은 일일 경찰관이 되어 10부제를 위반하는 자동차의 대수를 세는 봉사활동을 하려고 한다. 날짜의 일의 자리 숫자가 주어지고 7대의 자동차 번호의 끝 두 자리 수가 주어졌을 때 위반하는 자동차의 대수를 출력하는 프로그램을 작성하세요.

나의 풀이

            function solution(day, arr){
                let answer=0;
                for (let x of arr) {
                    if(x%10 === day) answer++;
                }
                return answer;
            }

정답 풀이와 정확하게 같다!


일곱 난쟁이

왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다.
아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해냈다.
아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오.

나의 풀이

            function solution(arr){
                let answer=arr;
                let sum = 0;
                for (let x of arr) sum+=x;
                for(i=0; i<arr.length; i++) {
                    for (j=i+1; j<arr.length; j++) {
                        if(sum - arr[i] - arr[j] === 100) {
                            if(i>j) {
                                answer.splice(i,1); 
                                answer.splice(j,1);
                            } else {
                                answer.splice(j,1); 
                                answer.splice(i,1);
                            }
                            break;
                        }
                    }
                }
                return answer;
            }
            
            let arr=[20, 7, 23, 19, 10, 15, 25, 8, 13];
            console.log(solution(arr));

정답 풀이

            function solution(arr){
                let answer=arr;
                let sum=answer.reduce((a, b)=>a+b, 0);
                for(let i=0; i<8; i++){
                    for(let j=i+1; j<9; j++){
                        if((sum-(answer[i]+answer[j]))==100){
                            answer.splice(j, 1);
                            answer.splice(i, 1);
                        }
                    }
                }
                return answer;
            }
            
            let arr=[20, 7, 23, 19, 10, 15, 25, 8, 13];
            console.log(solution(arr));

아쉬운 점

나의 일곱 난쟁이 문제 풀이에서의 아쉬운 점 세가지를 정리하면 다음과 같다.

얕은 복사

얕은 복사의 개념에 대한 이해가 부족했다. let answer = arr;이라는 선언을 통해 answer을 정의한 경우, 얕은 복사에 해당하기 때문에 arr을 추후에 수정한 경우에도 return을 하면 바뀐 arr의 값이 출력된다. 하지만 나는 해당 내용에 대한 개념이 부족하여, arr을 통해 sum을 계산하고, 두 가짜 난쟁이를 찾아낸 후, 그 난쟁이를 제외시킬때에는 answer을 수정하여, 코드의 통일성을 해치며 가독성을 떨어뜨렸다.

reduce()

크게 차이는 없을 수 있지만, 이런 방식도 있다는 것을 참고하기 위해 기록하였다. MDN Array.prototype.reduce() 문서에 따르면, reduce()는 array 내부의 각 원소에 대해 콜백 함수를 실행한 결과 값을 반환하는 함수이다. forEach()와 비슷한듯 다른데, forEach()의 경우 각 원소에 대한 실행 값을 각 원소의 갯수만큼 발생시키지만, reduce()의 경우는 최종 결과값 하나만을 발생시킨다. 또한 reduce() 내부의 콜백 함수는 완전한 함수 뿐만 아니라 화살표 함수도 사용 가능하다.

for문

첫 for문 (for(i=0; i<arr.length; i++)) 을 사용함에 있어서 정확한 표현을 사용하지 못한 점이 아쉽다. 그 이유는 for (j=i+1; j<arr.length; j++)가 해당 반복문 내부에 정의 되어있기 때문에, i<arr.length로 사용한다면, i가 8일때, j는 9가 되고, 9<arr.length에 해당하는 값이 없기 때문에 명확한 선언을 위해서는

for(i=0; i<(arr.length - 1); i++) {
  for(j=i+1; j<arr.length; j++) {
    ...
  }
}

위와 같이 선언이 되었어야 하기 때문이다.

또한, if(i>j)문을 사용한 점에 대한 아쉬움이 남는다. 사전에 정의하기를, for (j=i+1; j<arr.length; j++)를 통해 정의하였기 때문에 당연히 ji보다 항상 큰데, 본인의 코드를 본인이 이해하지 못해서 비효율적인 코드를 생산했다.

profile
iOS Developer

0개의 댓글