티스토리 뷰

💡 문제

모의고사

 

🔍 분석 및 계획

 문제 이해

1~5의 자연수 내 일정한 규칙으로 반복되는 3개의 집합이 있다. 여기에 동일한 범위내 입력이 주어질 때 각 순서와 값이 일치하는 개수를 각각 카운트해서 많이 일치하는 순서대로 나열하라

  • 입력 값 : 숫자 배열
    - 숫자 배열의 길이 <= 10,000
    - 숫자 배열의 값은 1, 2, 3, 4, 5 중 하나
  • 출력 값 : 숫자 배열
    - 가장 일치하는 개수가 많은 집합 번호 (1, 2, 3중 하나)
    - 여럿 일 경우 오름차순으로 나타낸다 

 

1, 2, 3번 규칙
1 - [1, 2, 3, 4, 5] 반복 (주기 5)

2 - [2, 1, 2, 3, 2, 4, 2, 5]  반복 (주기 8)

3 - [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] 반복 (주기 10)

 

풀이순서

1. 반복문을 통해 입력배열을 순회한다

2. 나눗셈 연산을 이용해 나머지와 수를 비교한다

3. 비교하여 일치하면 +1

4. 각 개수를 비교하여 출력

 

 

 

 

 

 의사코드 작성

// 반복문을 통해 입력값(answer)을 순회한다
  // 나머지 값과 비교하며 일치하는 숫자를 각각 카운트한다
// 점수기준 내림차순
// if(가장 높은 점수와 두번째 점수 비교하여 다를 시) return 제일 높은 점수 번호
// else if(두번째 높은 점수와 세번째 점수 다를 시) return 1,2등 번호
// else return 3개 번호

 

 

📝 코드 구현

의사코드 + 코드

function solution(answers) {
  const routine = [
    [1, 2, 3, 4, 5],
    [2, 1, 2, 3, 2, 4, 2, 5],
    [3, 3, 1, 1, 2, 2, 4, 4, 5, 5],
  ];
  const score = [
    [1, 0],
    [2, 0],
    [3, 0],
  ];
  // 반복문을 통해 입력값(answers)을 순회한다
  answers.forEach((v, i) => {
    // 나머지 값과 비교하며 일치하는 숫자를 각각 카운트한다
    if (v === routine[0][i % 5]) score[0][1]++;
    if (v === routine[1][i % 8]) score[1][1]++;
    if (v === routine[2][i % 10]) score[2][1]++;
  });
  // 점수기준 내림차순
  score.sort((a, b) => b[1] - a[1]);
  // if(가장 높은 점수와 두번째 점수 비교하여 다를 시) return 제일 높은 점수 번호
  if (score[0][1] !== score[1][1]) return [score[0][0]];
  // else if(두번째 높은 점수와 세번째 점수 다를 시) return 1,2등 번호
  else if (score[1][1] !== score[2][1]) return [score[0][0], score[1][0]];
  // else return 3개 번호
  else return [score[0][0], score[1][0], score[2][0]];
}

 

최종 코드

function solution(answers) {
  const routine = [
    [1, 2, 3, 4, 5],
    [2, 1, 2, 3, 2, 4, 2, 5],
    [3, 3, 1, 1, 2, 2, 4, 4, 5, 5],
  ];
  const score = [
    [1, 0],
    [2, 0],
    [3, 0],
  ];
  answers.forEach((v, i) => {
    if (v === routine[0][i % 5]) score[0][1]++;
    if (v === routine[1][i % 8]) score[1][1]++;
    if (v === routine[2][i % 10]) score[2][1]++;
  });
  score.sort((a, b) => b[1] - a[1]);
  if (score[0][1] !== score[1][1]) return [score[0][0]];
  else if (score[1][1] !== score[2][1]) return [score[0][0], score[1][0]];
  else return [score[0][0], score[1][0], score[2][0]];
}

시간 복잡도 : O(n)

💭 되돌아 보기

 다른 사람 풀이

 

1.
비슷해보이면서도 다르게 표현된 식이다

  1. filter를 사용해서 추출한배열의 길이로 개수를 카운트 하기
  2. 오름차순할 필요없이 max를 저장하고 순서대로 push하기

1,2번은 다른 문제에서도 응용하기 좋은 아이디어다

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.
조건들을 걸러내기에 아주 직관적인 코드로 짜여진 풀이이다.
문자와 배열간 변환도 많고 실제 복잡도는 모르겠지만 O(n³)형태를 띄고 있는것 같다.
reduce
 +  for ( i< length)
    + includes
하지만 채점을 통과한것으로 보아 시간이 오래 걸리지 않은것같은데 이 부분은 아직 모르겠다
function solution(babbling) {
    const babblables = ["aya", "ye", "woo", "ma"];

    return babbling.reduce((possible, babbl, index) => {
        for (let i = 0; i < babblables.length; i += 1) {
            if (babbl.includes(babblables[i].repeat(2))) return possible;
        }

        for (let i = 0; i < babblables.length; i += 1) {
            babbl = babbl.split(babblables[i]).join(' ').trim();
        }

        if (babbl) return possible;

        return possible += 1;
    }, 0)
}

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함