올바른 배열

양동귀·2024년 7월 24일

자료구조

목록 보기
2/10
post-thumbnail

문제

올바른 배열이란 어떤 배열 속에 있는 원소 중 5개가 연속적인 것을 말한다. (연속적인 것이란 5개의 수를 정렬했을 때, 인접한 수의 차이가 1인 것을 말한다.)

예를 들어 배열 {6, 1, 9, 5, 7, 15, 8}은 올바른 배열이다. 왜냐하면 이 배열 속의 원소인 5, 6, 7, 8, 9가 연속이기 때문이다.

배열이 주어지면, 이 배열이 올바른 배열이 되게 하기 위해서 추가되어야 할 원소의 개수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 배열의 크기 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 배열의 원소가 한 줄에 하나씩 주어진다. 원소는 1,000,000,000보다 작거나 같은 음이 아닌 정수이다. 배열에 중복되는 수는 없다.

출력

첫째 줄에 입력으로 주어진 배열이 올바른 배열이 되게 하기 위해서 추가되어야할 원소의 최소 개수를 출력한다.

https://www.acmicpc.net/problem/1337 백준-올바른 배열

어떻게 풀면 좋을까?

  1. 오름차순으로 정렬
  2. 연속된 값이 5개가 되는지 체크할 카운트, 만약 5개가 연속 안되었을때 몇개까지 연속이었는지 확인할 카운트 변수 2개 선언
  3. 반복문으로 다음 인덱스 값이 1 더 큰 수인지 확인
  4. 맞다면 카운트 +1, max카운트 업데이트, 틀리면 카운트 1으로 초기화
  1. 오름차순 정렬
  2. 배열 생성
  3. 반복문으로 다음 인덱스 값이 1 더 큰 수인지 확인
  4. 맞다면 새로 생성한 배열에 넣는다 틀리다면 배열 초기화
  5. 배열의 길이가 5가 되면 => 결과 출력
  6. 5 - 배열의 길이 값을 결과로 출력
let input = require('fs').readFileSync('/dev/stdin').toString().split('\n');

let answer = 0;
let numberList = Array.from(input.map(Number).sort((a, b) => a - b));

let currentCnt = 1;
let maxCnt = 1;

numberList.forEach((num,index) => {
    if(typeof numberList[index+1] === 'undefined') return;

    if((num + 1) === numberList[index+1]){
        currentCnt += 1;
        if(currentCnt > maxCnt) {
            maxCnt = currentCnt;
            if(maxCnt >= 5) return;
        }
    }else{
       currentCnt = 1;
    }
})

answer = 5 - maxCnt;
console.log(answer);

갯수 체크로 배열을 쓰는것은 메모리 적으로 손해라고 생각하여 변수로 체크하는 1번 방식을 채용

문제점
연속되지 않은 숫자가 나타났을 때의 처리:
currentCnt를 1로 초기화하는 것은 올바른 접근이지만, 이 방법은 연속된 숫자가 끊겼을 때마다 maxCnt를 다시 계산하게 만들며, 최종 결과에서 마지막에 연속된 숫자들을 제대로 계산하지 못할 수 있습니다.
초기값 처리:
maxCnt의 초기값이 1로 설정되어 있지만, 코드에서 연속된 숫자를 올바르게 계산하지 못하면 이 값이 잘못된 결과를 초래할 수 있습니다.
예시
예를 들어, [1, 2, 3, 7, 8]이라는 입력이 주어지면, 이 코드에 따라 계산하면 최대 연속된 숫자의 수는 3이 됩니다. 하지만 실제로는 5개의 숫자를 연속되게 채울 수 없습니다. 따라서, answer는 2가 되어야 하지만, 이 코드로는 제대로 동작하지 않을 수 있습니다.

let input = require('fs').readFileSync('/dev/stdin').toString().split('\n');

let answer = 0;
let numberList = Array.from(input.map(Number).sort((a, b) => a - b));

let maxCnt = 1;

for (let i = 0; i < numberList.length; i++) {
    let count = 1;
    for (let j = i + 1; j < numberList.length; j++) {
        if (numberList[j] - numberList[i] < 5) {
            count++;
        } else {
            break;
        }
    }
    maxCnt = Math.max(maxCnt, count);
}

answer = 5 - maxCnt;
console.log(answer);

코드에서 if (numberList[j] - numberList[i] < 5)라는 조건을 사용하는 이유는, 두 숫자 numberList[i]와 numberList[j]가 연속된 숫자열에 포함될 수 있는지를 확인하기 위해서입니다.
numberList[j] - numberList[i] < 5는 i와 j 사이의 숫자들이 5개 이하의 연속된 숫자열을 형성할 수 있는지를 판단합니다.
-> 이부분 이해..

최대 연속된 숫자 갯수를 max를 사용하는 형태로 수정

0개의 댓글