안녕하세요

[node.js] 백준 1차원 배열 단계 (자바스크립트) 10818 ~ 본문

백준 자바스크립트

[node.js] 백준 1차원 배열 단계 (자바스크립트) 10818 ~

sakuraop 2022. 5. 5. 23:38

클론코딩을 하면서 부족한 자바스크립트 문법은 백준을 통해서 공부합시다.

초보입니다. 코드 설명은 "참고만" 해주세요.

https://www.acmicpc.net/step/6

 

1차원 배열 단계

각 숫자가 몇 번 나왔는지 저장하기 위해 일차원 배열을 만드는 문제

www.acmicpc.net


10818 최소, 최대

아래와 같이 첫째 줄에 정수의 개수 N, 둘째 줄에는 N개의 정수를 공백으로 구분해서 입력받습니다.

5
20 10 35 30 7

첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력하시오.

7 35

제출한 답 - Math.min(...arr)

const inputData = require("fs").readFileSync("dev/stdin").toString().split("\n");
const numberArrangement = inputData[1].split(" ").map(Number);

console.log(`${Math.min(...numberArrangement)} ${Math.max(...numberArrangement)}`);

 

풀이를 적으려니 코드가 길어보입니다. 변수 a, b 로 치환하겠습니다.

 

const a = require("fs").readFileSync("dev/stdin").toString().split("\n");
const b = a[1].split(" ").map(Number);

console.log(`${Math.min(...b)} ${Math.max(...b)}`);

 

  • Math.min(...b), Math.max(...b) : Math.min() Math.max() 함수는 배열의 최솟값(min)과 최댓값(max)을 리턴합니다. 
  • ...b : ES6 문법입니다. 변수에 저장된 배열을 펼쳐서 리턴해줍니다. > Math.min(20, 10, 35, 30, 7) 과 같습니다.

2562 최댓값

9개의 서로 다른 자연수를 입력받아 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.

3
29
38
12
57
74
40
85
61

결과 (최댓값, 위치)

85
8

제출한 답 1 - Math.max(...arr)

const numbers = require("fs").readFileSync("dev/stdin").toString().split("\n").map(Number);

const maxNumber = Math.max(...numbers);
let maxPlace = 1;

for (step = 0; step < numbers.length; step++) {
  if (maxNumber != numbers[step]) {
    maxPlace += 1;
  } else if (maxNumber == numbers[step]) {
    break;
  }
}
console.log(`${maxNumber}\n${maxPlace}`);

 

우선 최댓값을 Math.max() 함수를 통해 찾습니다.

> 반복문이 반복될 때마다 maxPlace의 값이 1 증가합니다.

> maxNumber와 일치하는 값을 찾을 찾을 때까지 반복을 합니다.

> 해당 값이 maxNumber의 자릿값입니다.

> break를 통해 반복문에서 탈출합니다.

 

  • numbers.length; : length 함수는 배열의 길이를 구합니다. 리스트의 길이만큼 반복을 실행합니다.
  • break; : 반복을 종료합니다.

+ 최댓값이 여러개라면 어떻게? (를 생각하고 코드를 만들었습니다.)

 

자릿값을 저장할 변수를 선언합니다. howManyMaxNumbers = []

> else if 에서 반복문을 탈출하지 않고 maxPlace 값을 howManyMaxNumbersList 리스트에 저장합니다.

> howManyMaxNumbersList 를 출력합니다.


 

제출한 답 2 - indexOf() : 찾고자 하는 인자의 위치 반환

const numbers = require("fs").readFileSync("dev/stdin").toString().split("\n").map(Number);

const maxNumber = Math.max(...numbers);
const maxPlace = numbers.indexOf(maxNumber);

console.log(`${maxNumber}\n${maxPlace + 1}`);

 

  • numbers.indexOf(maxNumber); : indexOf() 함수를 통해서 maxNumber가 몇 번째 자리에 위치하는지 찾아냅니다. 하지만 첫번째 자리는 0 으로부터 시작하기 때문에 출력 결과에 + 1 을 더해주었습니다.

2577 숫자의 개수

아래와 같이 세 개의 자연수 A, B, C를 입력받고, A × B × C를 계산한 결과에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오.

150
266
427

결과

3
1
0
2
0
0
0
2
0
0

제출한 답 - .split()

const [a, b, c] = require("fs").readFileSync("dev/stdin").toString().split("\n");

const multipliedNumber = a * b * c;

for (step = 0; step <= 9; step++) {
  console.log(multipliedNumber.toString().split(step).length - 1);
}

 

0, 1, 2, ..., 9 각각에 해당하는 숫자로 split 할 경우의 결과를 출력해보면 아래와 같이 나옵니다.

[ '17', '373', '', '' ]
[ '', '7037300' ]
[ '17037300' ]
[ '170', '7', '00' ]
[ '17037300' ]
[ '17037300' ]
[ '17037300' ]
[ '1', '03', '300' ]
[ '17037300' ]

첫번째 리스트([ '17', '373', '', '' ]) 0으로 split을 한 리스트입니다. 이를 살펴보면,

첫째 0 앞에서 '17'

둘째 0 앞에서 '373'

셋째 0은 연속되는 배열이 없어 ""

넷째 0도 마찬가지로 연속되는 배열이 없기 때문에 "" 이 출력됩니다.

 

그리고 세번째 리스트([ '17037300' ])는 2로 split을 한 리스트입니다.

2가 포함되어 있지 않은 리스트이기 때문에 문자열 전체('17037300')가 반환되었습니다.

length로 리스트의 길이 -1 을 반환하게 되면 원하는 값을 출력할 수 있습니다.


3052 나머지

아래와 같이 1,000보다 작거나 같고, 음이 아닌 정수 10개를 입력받은 뒤, 

1
2
3
4
5
6
7
8
9
10

이를 42로 나눈 나머지를 구합니다.

10

제출한 답 - new Set() 중복된 배열을 포함시키지 않는 객체

const inputData = require("fs").readFileSync("dev/stdin").toString().split("\n").map(Number);

let set = new Set();

for (step = 0; step < 10; step++) {
  set.add(inputData[step] % 42);
}

console.log(set.size);

 

  • new Set() : set 객체를 선언합니다. set는 중복된 값을 포함하지 않습니다. 3 ,1, 1, 1, 2 를 set 객체에 추가한다면 set 객체에는 {3, 1, 2} 만이 남게 됩니다.
  • add() : set 객체에 배열을 추가합니다.
  • set.size : 리스트의 length와 같은 역할을 합니다. 

1546 평균

첫째 줄에 아래와 같이 과목의 수와 점수를 입력받습니다. 최소 하나 이상의 점수는 0을 넘습니다. 

3
40 80 60

그리고 (점수의 합/최고점수*100)의 값을 구합니다.

75.0

 

제출한 답

const [n, scoreArr] = require("fs").readFileSync("dev/stdin").toString().split("\n");

const scores = scoreArr.toString().split(" ").map(Number);
const highScore = Math.max(...scores);
const newScores = scores.map((score) => (score / highScore) * 100);

let result = 0;

newScores.map((score) => (result += score));

console.log(result / n);

 

  • newScores.map((score) => (result += score)); : map 함수로 newScores의 인자들을 result의 값에 더해주었습니다.

8958 OX퀴즈

아래와 같이 테스트케이스의 숫자와 OX를 입력받습니다. 연속된 O의 개수만큼 1이 카운트됩니다.

5
OOXXOXXOOO
OOXXOOXXOO
OXOXOXOXOXOXOX
OOOOOOOOOO
OOOOXOOOOXOOOOX

카운트의 합을 아래와 같이 출력하시오.

10
9
7
55
30

제출한 답

const inputData = require("fs").readFileSync("dev/stdin").toString().split("\n");

for (i = 1; i <= inputData[0]; i++) {
  let score = 0;
  let serialNumber = 0;
  for (j = 0; j <= inputData[i].length; j++) {
    if (inputData[i][j] == "O") {
      serialNumber += 1;
      score += serialNumber;
    } else {
      serialNumber = 0;
    }
  }
  console.log(score);
}

 

  • serialNumber += 1;
    score += serialNumber; : "O"가 나타날 때마다 serialNumber의 값을 1 증가시키고, score에 현재 serialNumber 만큼을 더합니다.
  • serialNumber = 0; : "O"가 아닌 배열을 만났을 경우에는 serialNumber의 값을 0 으로 초기화 시킵니다.

4344 평균은 넘겠지

아래와 같이 테스트 케이스의 개수 C를 입력받은 뒤, 학생의 수가 첫 수로 주어집니다. 이어서 N명의 점수가 주어집니다.

5
5 50 50 70 80 100
7 100 95 90 80 70 60 50
3 70 90 80
3 70 90 81
9 100 99 98 97 96 95 94 93 91

각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력합니다.

40.000%
57.143%
33.333%
66.667%
55.556%

제출한 답

const inputData = require("fs").readFileSync("dev/stdin").toString().split("\n");

for (i = 1; i <= inputData[0]; i++) {
  const line = inputData[i].toString().split(" ").map(Number);
  const n = line[0];
  let sum = 0;
  for (j = 1; j <= n; j++) {
    sum += line[j];
  }
  let average = sum / n;
  let goodStudentCount = 0;
  for (k = 1; k <= n; k++) {
    if (line[k] > average) {
      goodStudentCount += 1;
    }
  }

  result = (goodStudentCount / n) * 100;

  console.log(result.toFixed(3) + "%");
}

 

합계(sum)를 구하는데 for 문을 한 번, 평균을 넘는 학생 수(average)를 구하는데 for 문을 한 번.

for 문이 총 세 번이나 나오니 반복되는 코드가 많아 보기 안타깝습니다. 방법이 있다면 줄이고 싶습니다.

 

  • .toFixed(N) : 소숫점 N 자리까지 표현할 수 있습니다.

1차원 배열 단계는 여기까지 입니다.