본문 바로가기

CS/알고리즘

완전탐색 모의고사 수포자 / '%'를 쓸줄아느냐.

내 접근 방식

사람마다 규칙에 따라 답이 반복되는데 이걸 계산식으로 표현할수 있나...?

어떻게 하지..? 생각이 안났다.

그래서 정답 리스트를 만들어버렸다.

while (per3.length < answers.length) {
	per3.concat(per3);
}

이렇게하면 정답 길이근처만큼 개인의 답이 확장되겠지? but 너무 메모리를 크게 사용한다.

 

이 문제의 핵심은 "%"

나머지 기호를 잘 쓸줄 아느냐.

function solution(answers) {
    var answer = [];
    const man1 = [1, 2, 3, 4, 5];
    const man2 = [2, 1, 2, 3, 2, 4, 2, 5];
    const man3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
    let count = [0, 0, 0];

    for(let i = 0; i < answers.length; i++) { // answers[] 를 한번 돌리게 하는 것도 포인트 !
        if(answers[i] == man1[i % man1.length]) count[0]++;
        if(answers[i] == man2[i % man2.length]) count[1]++;
        if(answers[i] == man3[i % man3.length]) count[2]++;
    }

    const max = Math.max(count[0], count[1], count[2]);
    for(let i = 0; i < count.length; i++) {
        if(max == count[i]) answer.push(i + 1);  // push도 포인트 !
    }

    return answer;
}

다른 답

function solution(answers) {
    var answer = [];
    var a1 = [1, 2, 3, 4, 5];
    var a2 = [2, 1, 2, 3, 2, 4, 2, 5]
    var a3 = [ 3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

	// filter((a,i) 이부분 !!
    var a1c = answers.filter((a,i)=> a === a1[i%a1.length]).length;
    var a2c = answers.filter((a,i)=> a === a2[i%a2.length]).length;
    var a3c = answers.filter((a,i)=> a === a3[i%a3.length]).length;
    var max = Math.max(a1c,a2c,a3c);

    if (a1c === max) {answer.push(1)};
    if (a2c === max) {answer.push(2)};
    if (a3c === max) {answer.push(3)};


    return answer;
}

filter 부분

filter의 callback function()의 첫번째 인자는 처리할 현재 요소, 두번째 인자는 처리할 요소의 인덱스

answers.filter(a, i) { function(a, i){
  return a === a1[i% a1.length].length;
  }
}

answers.filter((a, i) => a === a1[i% a1.length]).length;

 

array에 filter를 거는 것이기 때문에 array의 첫 요소, array의 첫 인덱스부터 필터링하게 된다.

'CS > 알고리즘' 카테고리의 다른 글

종이접기 [프로그래머스] 실패  (0) 2020.07.14
탑 _프로그래머스  (0) 2020.05.06
k번째수  (0) 2020.05.04
완주하지 못한 선수.  (0) 2020.05.04
크레인 인형뽑기 게임  (0) 2020.04.24