Programming/Coding Test

[BOJ] 1475번: 방 번호

gaing 2024. 9. 24. 15:36

✏️ 문제

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

다솜이의 옆집에서는 플라스틱 숫자를 한 세트로 판다. 한 세트에는 0번부터 9번까지 숫자가 하나씩 들어있다.

다솜이의 방 번호가 주어졌을 때, 필요한 세트의 개수의 최솟값을 출력하시오.

(6은 9를 뒤집어서 이용할 수 있고, 9는 6을 뒤집어서 이용할 수 있다.)


🖥️ 입출력 예시


🗒️ 풀이

/* 초기 세팅 */

// 파일 읽기 기능 사용
const fs = require("fs");

// 실행 환경에 따라 입력 경로 다르게 설정
const filepath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";

// 입력을 읽고, 문자열로 변환한 뒤, 공백을 제거하고, 각 문자를 배열로 나눔
const input = fs.readFileSync(filepath).toString().trim().split("");

/* 문제 풀기 */

// 숫자 빈도를 저장하는 배열
let count = Array(10).fill(0);

// 각 숫자의 빈도를 셈
input.forEach((num) => {
  count[parseInt(num)]++;
});

// 6과 9는 서로 교환 가능하므로 합쳐서 처리
let sixnineCount = Math.ceil((count[6] + count[9]) / 2);
count[6] = sixnineCount;
count[9] = sixnineCount;

// 가장 많이 필요한 숫자 세트 개수를 계산
const result = Math.max(...count);

// 결과 출력
console.log(result);

나를 위한 추가 풀이 (코드 뜯기)

let count = Array(10).fill(0);

//result
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]  // 길이가 10인 배열, 모든 칸에 0이 들어 있음

 

- 길이가 10인 배열을 만들고, 그 배열의 모든 자리를 숫자 0으로 채우는 코드이다.


input.forEach((num) => {
  count[parseInt(num)]++;
});
input.forEach((num) => { ... })

 

- input은 숫자들이 들어 있는 배열이다.

- forEach는 배열 input에 들어 있는 숫자 하나하나를 차례대로 꺼내서 num이라는 변수에 넣는다.

- 배열의 모든 숫자에 대해 코드가 실행된다.

parseInt(num)

 

- num은 배열에서 꺼낸 문자(예: '3', '7')인데, 이걸 숫자로 바꾸는 과정이다.

- ex. '3'이라는 문자를 parseInt('3')로 바꾸면 숫자 3이 된다.

 

count[parseInt(num)]++

 

- count라는 배열은 0부터 9까지 숫자가 각각 몇 번 나왔는지 기록하는 배열이다.

- ex. num이 '3'이라면 parseInt(num)은 숫자 3이 되고, count[3]을 1씩 증가시켜준다. 즉, 숫자 3이 등장했으니까 count[3]의 값을 1 올려준다.

- 이 과정을 통해서 각 숫자가 몇 번 나오는지를 셀 수 있다.


let sixnineCount = Math.ceil((count[6] + count[9]) / 2);
count[6] = sixnineCount;
count[9] = sixnineCount;
count[6] = sixnineCount;
count[9] = sixnineCount;

 

- 배열에서 숫자 6과 9가 몇 번 등장했는지를 나타낸다.

 

(count[6] + count[9])

 

- 6과 9의 등장 횟수를 더한 값.

- 숫자 6과 9는 뒤집어서 서로 바꿔쓸 수 있기 때문에 두 숫자를 하나로 묶어 계산할 수 있다.

 

/ 2

 

- 6과 9는 하나의 세트로 묶어 쓸 수 있으니, 합계를 2로 나눠서 한 세트에 6과 9가 몇 번 필요한지를 계산한다.

- ex. 6과 9가 총 5번 나왔다면, 최소한 3개의 세트가 필요하다. (5 / 2 = 2.5, 올림하면 3세트)

 

Math.ceil()

 

- 나누기 결과가 소수점일 경우, 올림을 해서 세트 개수를 정한다.

 

count[6] = sixnineCount;
count[9] = sixnineCount;

 

- 계산한 sixnineCount 값을 count[6]과 count[9]에 저장한다.

- 숫자 6과 숫자 9가 필요한 세트의 개수를 업데이트한 것이다.

- 숫자 6과 숫자 9가 하나의 세트로 취급되므로, 세트 수는 동일하다.


const result = Math.max(...count);
Math.max()

 

- 자바스크립트에서 가장 큰 값을 찾는 함수이다.

- 여러 개의 숫자를 입력받아 그 중 가장 큰 값을 반환한다.

- ex. Math.max(3, 7, 1)을 하면 7을 반환한다.

 

...count

 

- ...는 전개 연산자라고 불리며, 배열 안에 있는 값들을 하나씩 풀어서 전달해 준다.

- Math.max()는 배열을 입력받을 수 없기 때문에, ...count로 배열 count의 요소들을 풀어서 각각의 값으로 전달한다.

- ex. count 배열이 [3, 1, 7, 4]라면, ...count는 3, 1, 7, 4로 바뀌어서 Math.max(3, 1, 7, 4)처럼 작동한다.

 

result

 

- Math.max(...count)의 결과, 즉 count 배열에서 가장 큰 값을 찾아서 result 변수에 저장한다.

'Programming > Coding Test' 카테고리의 다른 글

[JAVA] 배열의 평균값  (0) 2024.06.04
[JAVA] 나이 출력  (0) 2024.06.04
[JAVA] 두 수의 차  (0) 2024.06.04