송민준의 개발노트

프로그래머스-level1-모의고사 본문

알고리즘/프로그래머스

프로그래머스-level1-모의고사

송민준 2019. 11. 3. 20:34

https://programmers.co.kr/learn/courses/30/lessons/42840

 

코딩테스트 연습 - 모의고사 | 프로그래머스

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ... 2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ... 3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3,

programmers.co.kr

예전에 풀었던 자바코드를 보니 참담하다...

자바스크립트로 풀어봤다... 조금은 짧아진거 같다.

function solution(answers) {
    const onePattern = [1, 2, 3, 4, 5];
    const twoPattern = [2, 1, 2, 3, 2, 4, 2, 5];
    const threePattern = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

    const oneCount = check(onePattern, answers);
    const target1 = {
        index: 1,
        count: oneCount
    };

    const twoCount = check(twoPattern, answers);
    const target2 = {
        index: 2,
        count: twoCount
    };
    const threeCount = check(threePattern, answers);
    const target3 = {
        index: 3,
        count: check(threePattern, answers)
    };
    const targetArray = [target1, target2, target3];
    const maxValue = Math.max(oneCount, twoCount, threeCount);

    return targetArray.sort((a, b) => a.count - b.count)
        .filter((v) => v.count === maxValue)
        .map(v => v.index);
}

function check(pattern, answer) {
    let count = 0;
    const patternLength = pattern.length;
    for(let i = 0; i < answer.length; i++) {
        const rem = (i % patternLength);
        if(answer[i] === pattern[rem]) {
            count++;
        }
    }
    
    return count;
}

결과

 

참고할 코드

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];

    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;
}

 

 

 

===========================오래 전 자바 풀이===================================

나의 풀이.

2차원 배열을 활용하였고 4번째(인덱스 3)에는 점수가 각각 들어가있다.

시간이 좀 들었던 문제...

평균 속도 : 15ms

class Solution {
    public int[] solution(int[] answers) {
       int[] answer = new int[3];
		int[][] player = {{1, 2, 3, 4, 5},{2, 1, 2, 3, 2, 4, 2, 5}, {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}, {0, 0, 0}};

		for(int i = 0; i < answers.length; i++) {
			if(answers[i] == player[0][i%5]) {
				player[3][0]++;
			}
			if(answers[i] == player[1][i%8]) {
				player[3][1]++;
			}
			if(answers[i] == player[2][i%10]) {
				player[3][2]++;
			}
		}
		// 1번이 2번보다 큰 경우
		if(player[3][0] > player[3][1]) {
			// 1번만 제일 클 경우
			if(player[3][0] > player[3][2]) {
				answer[0] = 1;
			} else if(player[3][0] == player[3][2]) { // 1번과 3번이 제일 클 경우
				answer[0] = 1;
				answer[1] = 3;
			} else {   // 3번이 제일 클 경우
				answer[0] = 3;
			}
		} else if(player[3][0] == player[3][1]) {   // 1번과 2번이 같은 경우
			if(player[3][0] > player[3][2]) { // 1,2 번이 제일 큼
				answer[0] = 1;
				answer[1] = 2;
			} else if(player[3][0] == player[3][2]) { // 1, 2, 3 번이 모두 같은 경우
				answer[0] = 1;
				answer[1] = 2;
				answer[2] = 3;
			} else {  // 3번이 제일 클 경우
				answer[0] = 3;
			}
		} else {
			if(player[3][1] > player[3][2]) {
				answer[0] = 2;
			} else if(player[3][1] == player[3][2]) {
				answer[0] = 2;
				answer[1] = 3;
			} else {
				answer[0] = 3;
			}
			
		}
		int length = 0;;
		for(int i = 0; i <answer.length; i++) {
			if(answer[i] == 0) {
				if(i == 0) {
					length = 3;
				} else {
					length = i;
				}
				System.out.println("0이 반환 : " + length);
				break;
			} else {
				length = answer.length;
			}
		}
		return Arrays.copyOfRange(answer, 0, length);
    }
}

참고할 코드 : Math.max를 활용하고 ArrayList에 추가하였다.