본문 바로가기

백준/JavaScript

[JS] 백준 1차원 배열 - 마지막 이야기

728x90

 

 

드디어 마지막이다...

오늘은 꼭 끝내야지!!

(사실 어제 끝내려고 했는데 다른 할 일이 생겨서...)

 

 

문제 10811번

https://www.acmicpc.net/problem/10811

 

10811번: 바구니 뒤집기

도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀져 있다. 바구니는 일렬로 놓여져 있고, 가장 왼쪽 바구니를 1번째 바구니, 그 다음 바구니를 2

www.acmicpc.net

 

이 문제는 1차원 배열(바구니)을 만들어 순서대로 숫자를 초기화해주고, 역순으로 만들 숫자들을 따로 다른 1차원 배열(temp)에 저장하여 역순으로 바꾼 후 그 크기만큼 바구니 배열에 넣어주면 될 것 같다.

 

역순으로 바꿔주는 함수가 있을 것 같아서 찾아보니 reverse()라는 함수가 있었다. 그래서 temp 배열에 i번째부터 j번째까지의 숫자를 넣고 reverse()를 이용하여 역순으로 바꿔줬다. 그런데 basket 배열에서 어떻게 그 부분만 쏙 빼서 넣을지 고민하다가 다른 분의 풀이를 보니 splice()라는 함수를 사용한 것을 보았다. 기존 바구니 배열을 splice로 잘라내고 그 자리에 뒤집은 temp를 집어놓은 것이었다.

 

slice() 함수는 배열로부터 특정 범위를 복사한 값들을 담고 있는 새로운 배열을 만드는데 사용한다고 한다. 첫 번째 인자로 시작 인덱스, 두 번째 인자로 종료 인덱스를 받으며, 시작 인덱스부터 종료 인덱스까지 값을 복사하여 반환한다.

이번에 여기서 사용된 splice() 함수는 slice() 함수의 이름에서 알파벳 p가 하나 더 있다. 이 함수는 다목적으로 사용할 수 있는 함수인데, 배열로부터 특정 범위를 삭제하거나 새로운 값을 추가 또는 기존값을 대체할 수 있다. 첫 번째 인자로 시작 인덱스, 두 번째 인자로 몇 개의 값을 삭제할지, 그리고 세 번째 인자로부터는 추가할 값을 가변 인자로 넘길 수 있으며, 삭제된 값을 담고 있는 배열을 반환한다.

 

const fs = require('fs');
//백준에 제출할 때 써야하는 코드
const readFileSyncAdress = '/dev/stdin';
//테스트
//const readFileSyncAdress = 'input.txt';

const input = fs.readFileSync(readFileSyncAdress).toString().split('\n');

let [n,m] = input[0].split(' ');

let basket=[];

for(let k=1;k<=n;k++){
    basket[k-1]=k;
}
let i,j;
for(let k=1;k<=m;k++){
    [i,j]=input[k].split(' ');

    let temp = [];
    for(let w=i-1;w<j;w++){
        temp.push(basket[w]);
    }
    temp.reverse();
    basket.splice(i-1,j-(i-1),...temp);
}

console.log(basket.join(' '));

 

 

오호! 정말 유용한 것 같다 ㅎㅎ.

 

 

[참고] https://hianna.tistory.com/448
https://www.daleseo.com/js-array-slice-splice/
https://luminouswy.tistory.com/entry/%EB%B0%B1%EC%A4%80-10811%EB%B2%88-%EB%B0%94%EA%B5%AC%EB%8B%88-%EB%92%A4%EC%A7%91%EA%B8%B0-javascript-nodejs

 

 

 

 

그럼~ 다음 문제

 

문제 1546번

https://www.acmicpc.net/problem/1546

 

1546번: 평균

첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보

www.acmicpc.net

 

일단 최고점을 max() 함수를 이용하여 찾은 다음 입력받았던 점수들을 새로운 점수들(원래점수/최고점*100)로 계산해야겠다. 그리고 새로운 점수들을 다 합한 후 과목의 개수인 n으로 나눠주면 새로운 평균을 출력할 수 있다.

 

const fs = require('fs');
//백준에 제출할 때 써야하는 코드
const readFileSyncAdress = '/dev/stdin';
//테스트
//const readFileSyncAdress = 'input.txt';

const input = fs.readFileSync(readFileSyncAdress).toString().split('\n');

const n = Number(input[0]);
const score = input[1].split(' ').map(Number);
const maxScore = Math.max(...score);
const newscore = score.map(x => x/maxScore*100);
let sum=0;
for(let i=0;i<n;i++){
    sum+=newscore[i];
}
console.log(sum/n);

 

 

처음에 작성했을 때 출력값이 안 나와서 왜 그런가 했더니 sum을 0으로 초기화해주지 않아서 그랬다 ㅎㅎ.

그리고 Number(input[0]) 이것을 +input[0] 이런 식으로 '+'를 사용해도 된다. 왜냐하면 피연산자가 숫자 타입이 아니면 숫자로 변환을 시도해주기 때문이다.

 

다른 분의 풀이도 보니 이 분은 reduce 함수로 배열의 모든 값을 더하여 줬다. reduce 메서드는 배열의 메서드 중 강력한 기능을 가진 메서드 중 하나인데, 배열의 여러 개의 값을 하나의 값으로 축소해준다.

첫 번째 인수 자리에 콜백함수가 들어오고 두 번째 인수 자리(생략가능)에는 초기값이 들어온다. reduce 메서드는 자신을 호출한 배열의 모든 요소를 순회하며 인수로 전달받은 콜백함수를 반복 호출한다. 이때 원본 배열은 변경되지 않는다. 

 

 

[참고] https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Expressions_and_operators
https://velog.io/@wandakim/boj-node.js-%EB%B0%B1%EC%A4%80-1546%EB%B2%88-%ED%8F%89%EA%B7%A0-javascript
https://velog.io/@favorcho/%EB%B0%B0%EC%97%B4%EC%9D%98-reduce-%EB%A9%94%EC%84%9C%EB%93%9C

 

 

 

 

오늘 드디어 1차원 배열 단계가 마무리되었다...

내일부터는 문자열 단계이다.

그럼 앞으로도 파이팅~~!!

 

 

728x90