[JavaScript] 백준 1475번 방 번호

2023. 6. 27. 10:03나는 이렇게 학습한다/Data Structure

이 글은 백준 1475번 방 번호를 풀이한다. 코드는 JavaScript로 구현하였다.

문제

다솜이는 은진이의 옆집에 새로 이사왔다. 다솜이는 자기 방 번호를 예쁜 플라스틱 숫자로 문에 붙이려고 한다.

다솜이의 옆집에서는 플라스틱 숫자를 한 세트로 판다. 한 세트에는 0번부터 9번까지 숫자가 하나씩 들어있다. 다솜이의 방 번호가 주어졌을 때, 필요한 세트의 개수의 최솟값을 출력하시오. (6은 9를 뒤집어서 이용할 수 있고, 9는 6을 뒤집어서 이용할 수 있다.)

입력

첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수이다.

예제 입력 1

9999

예제 입력 2

122

예제 입력 3

12635

예제 입력 4

888888

출력

첫째 줄에 필요한 세트의 개수를 출력한다.

예제 출력 1

2

예제 출력 2

2

예제 출력 3

1

예제 출력 4

6

제한

  • 시간: 2초
  • 메모리: 128MB

풀이

접근

1. 입력값 각 숫자의 개수를 계산하고, 객체에 저장

2. 6과 9 처리

3. 저장된 객체의 값들을 배열로 변환한 후 내림차순 정렬

4. 배열의 첫 번째 요소(최댓값) 출력

구현

내가 구현한 코드

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const input = fs.readFileSync(filePath).toString();

const inputArr = Array.from(input);
let digitCount = {};

inputArr.forEach((digit) => {
  digitCount[digit] = digitCount[digit] + 1 || 1;
});

digitCount["6"] = digitCount["6"] || 0;
digitCount["9"] = digitCount["9"] || 0;
digitCount["6"] = Math.ceil(Number(digitCount["6"] + digitCount["9"]) / 2);
digitCount["9"] = 0;

sortedDigitArr = Object.values(digitCount).sort((a, b) => b - a);

console.log(sortedDigitArr[0]);

GPT 코드 리뷰

1. 숫자 개수 배열 활용

숫자의 개수를 세는 대신, 숫자 개수를 저장하는 배열을 사용해라.
배열의 인덱스는 숫자를 나타내고, 해당 인덱스의 값은 숫자의 개수를 나타낸다.
이렇게 하면 객체를 사용하는 것보다 메모리 사용량이 감소하고, 계산 과정도 간단해진다.

Q. 객체를 사용하면 가독성이 더 좋아지지 않나?
이 문제에서는 숫자의 개수를 세는 용도로는 배열을 사용하는 것이 더 직관적이고 명확한 방법이다. 이 문제에서는 숫자가 0부터 9까지로 제한되어 있다. 숫자의 범위가 작고 연속적이기 때문에 배열의 인덱스를 직접 활용하는 것이 직관적이다.
2. 6과 9 처리

6과 9는 서로 대체될 수 있기 때문에, 하나의 숫자로 통일하여 계산한다. 6과 9를 처리하는 단계를 제거하여 계산랑얄 줄일 수 있다.
3. 최댓값 계산

확산 연산자(...)를 사용하면 배열을 정렬할 필요 없이 바로 최댓값을 찾을 수 있다.
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const input = fs.readFileSync(filePath).toString().trim();

const digitCount = Array(10).fill(0); // 숫자 개수 배열 초기화

for (let i = 0; i < input.length; i++) {
  const digit = Number(input[i]);
  digitCount[digit]++;
}

// 6과 9 처리
const sum69 = digitCount[6] + digitCount[9];
const setCount = Math.ceil(sum69 / 2);
digitCount[6] = setCount;
digitCount[9] = setCount;

// 필요한 세트의 개수 계산
const maxCount = Math.max(...digitCount);
console.log(maxCount);

성능 비교

GPT가 짠 코드가 약 4ms 더 빠르게 실행된다.

반응형