본문 바로가기

백준/JavaScript

[JS] 백준 1차원 배열 - 세 번째 이야기

728x90

 

 

즐거운 토요일이 지나갔다...

저녁은 문제 풀기로 마무리해야지 ㅎㅎ

 

 

문제 2562번

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

 

2562번: 최댓값

9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오. 예를 들어, 서로 다른 9개의 자연수 3, 29, 38, 12, 57, 74, 40, 85, 61 이 주어

www.acmicpc.net

 

이 문제는 어제했던 코드와 비슷하게 해서 풀면 될 것 같다.

일단 입력값들을 담아주고, max 변수에 첫 번째 입력값을 넣어준다. 그리고 나머지 값들과 비교하여 max보다 크면 그 수를 max에 넣어주면 되겠다.

 

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

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

let index=1;
let max=Number(numbers[0]);
for(let i=1;i<9;i++){
    if(Number(numbers[i])>max){
        max=Number(numbers[i]);
        index = i+1;
    }

}
console.log(max+'\n'+index);

 

 

중간에 계속 '틀렸습니다'가 나와서 왜그러지했는데, 보니까 max에 초기값으로 첫 번째 입력값을 넣어줬으면 index에도 넣어줬어야 했는데 아무것도 넣어주지 않았다... 다음에는 그러지 말자...

 

 

문제 10810번

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

 

10810번: 공 넣기

도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 또, 1번부터 N번까지 번호가 적혀있는 공을 매우 많이 가지고 있다. 가장 처음 바구니에는 공이

www.acmicpc.net

 

음... 이 문제는 1차원 배열을 만들어 다 0으로 초기화시켜 준 후 들어온 입력값대로 배열에 넣어주면 될 것 같다.

 

 

그런데 자바스크립트에서 for문을 이용하는 것 말고 다른 방법으로 배열을 초기화할 수 없을지 찾아보니 

let 배열이름;
(배열 이름 = []).length = N;
배열 이름.fill(채울값);

 

이런 식으로 작성하면 된다고 한다.

 

 

 

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].split(' ')[0]);
const M = Number(input[0].split(' ')[1]);

let basket;
(basket=[]).length = N;
basket.fill(0);

let i,j,k;
for(let q=1;q<=M;q++){
    i=Number(input[q].split(' ')[0]);
    j=Number(input[q].split(' ')[1]);
    k=Number(input[q].split(' ')[2]);

    for(let w=i-1;w<=j-1;w++){
        basket[w]=k;
    }
}
console.log(basket.join(' '));

 

 

 

 

휴... 테스트하는데 이상한 값이 나와서 코드를 계속 쳐다봤다. basket에 넣어줄 때 i에서 j번째 바구니니까 인덱스로는 하나 뺀 값을 이용하여 for문을 돌렸다. 그런데 j번째까지 들어가야 하니까 '<=' 이렇게 써줘야 하는데 나는 그냥 '<' 이렇게 작성하였다 ㅎㅎ. (잘 생각해야지...)

 

 

다른 분 풀이는 어떨지 궁금해서 찾아봤다.

const file = process.platform === 'linux' ? '/dev/stdin' :'./input.txt'
const input = require('fs').readFileSync(file).toString().split('\n');
const [N, M] = input[0].split(' ').map(Number)
const baskets = new Array(N).fill(0)


for (let i =1 ; i<=M;i++){
    const [start,end, ball] = input[i].split(' ').map(Number)
    
    for(let j = start ; j <=end;j++){
        baskets[j-1] = ball
    }
}

console.log(baskets.join(" "))

 

이 분은 new Array(개수).fill(넣을값)을 사용해서 배열의 크기와 초기값을 지정해 줬다. 그리고 나와 다르게 저렇게 간단하게 정리하셨다. 나도 열심히 풀면서 저렇게 깔끔하게 정리해 봐야겠다.

 

[참고] https://velog.io/@goddls123/%EB%B0%B1%EC%A4%80-JavaScript-10810-%EA%B3%B5%EB%84%A3%EA%B8%B0

 

 

 

 

 

728x90