안녕하세요
[node.js] 백준 1차원 배열 단계 (자바스크립트) 10818 ~ 본문
클론코딩을 하면서 부족한 자바스크립트 문법은 백준을 통해서 공부합시다.
초보입니다. 코드 설명은 "참고만" 해주세요.
https://www.acmicpc.net/step/6
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 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', '', '' ])는 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차원 배열 단계는 여기까지 입니다.
'백준 자바스크립트' 카테고리의 다른 글
[node.js] 문자열 단계 (자바스크립트) 11654 ~ (0) | 2022.05.10 |
---|---|
[node.js] 함수 단계 (자바스크립트) 4673 ~ (0) | 2022.05.08 |
[node.js] 백준 반복문 단계 (자바스크립트) 2739 ~ (0) | 2022.05.04 |
[node.js] 백준 조건문 단계 (자바스크립트) 1330 ~ (0) | 2022.05.03 |
[node.js] 백준 입출력과 사칙연산 단계 (자바스크립트) 2557 ~ (0) | 2022.04.30 |