출처 : https://www.acmicpc.net/problem/2588 (백준 온라인 저지)

성공한 코드

크게 어렵진 않습니다. 코드를 살펴봅시다.

 

let [number1, number2] = stdinline;

 

2줄로 입력받은 인자들을 number1, number2에 넣어줍니다.


number1 = parseInt(number1);

 

number1을 정수로 변환합니다. number2는 자릿수연산을 해야 하므로 변환시키지 않았습니다.


for(let i=number2.length-1; i>=0; i--){

 

number2 문자열 길이만큼 for문을 반복합니다. 이 때 곱셈연산은 끝자리수부터 수행해야하니 i값을 number2 마지막 인덱스값으로 초기화합니다. 

 

let number2i = parseInt(number2[i]);
console.log(number1*number2i);

 

number2의 일의 자리부터 백의 자리까지 number1과 곱셈한 결과를 출력합니다.
    
console.log(number1*parseInt(number2));

 

곱셈 연산이 끝났으면 최종 곱셈 연산 결과를 출력합니다. for문에서 출력한 값들을 다 더해서 출력해도 되지만 이번 코드는 이렇게 작성하였습니다.

이상으로 2588번 문제 풀이를 마치겠습니다.

'Programing > Baekjoon 문제 알고리즘(node.js)' 카테고리의 다른 글

10952번 A+B - 5  (0) 2022.02.25
2884번 알람 시계  (0) 2022.02.25
10871번 X보다 작은 수  (0) 2022.02.25
10950번 A+B - 3  (0) 2022.02.25
2753번 윤년  (0) 2022.02.24
Posted by englishmath
,

문제 : https://www.acmicpc.net/problem/10871 (백준 온라인 저지)

성공한 코드

여러 줄 입력받는 코드는 10950번 문제에서 설명하였으므로 생략하겠습니다.

 

let [N, X] = stdinline[0].split(" ").map(input => { return parseInt(input);});

 

첫 번째 줄의 인자를 N과 X에 저장합니다. 이 부분은 앞에서 설명드렸으니 깊게 설명하진 않겠습니다.

 

let arrA = stdinline[1].split(" ").map(input => { return parseInt(input);});

 

두 번째 줄의 인자들을 공백을 기준으로 나누어 배열에 저장하였습니다. 즉 arrA는 수열 A입니다.

 

let stdoutArr = [];

 

console.log 사용을 피하기 위해 출력에 사용할 버퍼를 초기화합니다.


for(let i in arrA){
        if(arrA[i] < X)
            stdoutArr.push(`${arrA[i]} `);
}

수열 A의 값을 하나씩 검사하여 값이 X보다 작으면 출력 버퍼에 값과 공백을 삽입합니다.

 

stdout.write(stdoutArr.join("").trimEnd());

 

모든 검사를 마쳤으면 출력 버퍼를 문자열로 변환한 후 마지막 요소에 삽입되었던 공백을 제거하여 표준 출력 스트림에 작성합니다.

 

이상으로 10871번 문제 풀이를 마치겠습니다.

'Programing > Baekjoon 문제 알고리즘(node.js)' 카테고리의 다른 글

2884번 알람 시계  (0) 2022.02.25
2588번 곱셈  (0) 2022.02.25
10950번 A+B - 3  (0) 2022.02.25
2753번 윤년  (0) 2022.02.24
2742번 기찍 N  (0) 2022.02.24
Posted by englishmath
,

출처 : https://www.acmicpc.net/problem/10950 (백준 온라인 저지)

성공한 코드

이번 문제는 난이도 자체는 낮지만 입력을 여러줄로 받기 때문에 코드를 수정할 수밖에 없었습니다. 코드 설명 들어갑니다.

 

let stdinline = stdinBuffer.toString().trimEnd().split("\n");

 

이번 문제는 여러 줄의 값을 입력받기 때문에 이전처럼 표준입력스트림을 공백으로 구분하면 입력값을 제대로 받아올 수 없습니다. 표준스트림에 CR과 LF가 여러 개 삽입되었기 때문이지요. 이것을 간단하게 설명해보겠습니다.

 

-> 한 줄 표준스트림 : 1 2 3

     버퍼 : 0 : 0x31

             1 : 0x20

             2 : 0x32

             3 : 0x20

             4 : 0x33

             5 : 0x0D

             6 : 0x0A

     toString() -> "1 2 3\r\n"

     split(" ") -> 0 : "1"

                     1 : "2"

                     2 : "3\r\n"

 

     map(input => { return parseInt(input); }) -> 0 : 1

                                                              1 : 2

                                                              2 : 3

한 줄 입력에서는 이런 형태로 처리가 되었기 때문에 공백만을 기준으로 나누어도 크게 문제가 되지 않았습니다. 하지만 이번 문제는 입력을 여러줄로 받기 때문에 위와 같이 작성하면 다음과 같은 문제가 생기게 됩니다.

 

-> 여러 줄 표준스트림 : 2

                                1 2

                                3 4      

     버퍼 : 0 : 0x32

             1 : 0x0D

             2 : 0x0A

             3 : 0x31

             4 : 0x20

             5 : 0x32

             6 : 0x0D

             7 : 0x0A

             8 : 0x33

             9 : 0x20

             10 : 0x34

             11 : 0x0D

             12 : 0x0A

     toString() -> "2\r\n1 2\r\n3 4\r\n"

     split(" ") -> 0 : "2\r\n1"

                     1 : "2\r\n3"

                     2 : "4\r\n"

 

     map(input => { return parseInt(input); }) -> 0 : 2

                                                              1 : 2

                                                              2 : 4

즉 입력값은 2 1 2 3 4이지만 실제로 처리된 입력값은 2 2 4 가 되서 입력값을 제대로 받아오지 못하는 경우가 생깁니다. 이를 방지하기 위해 다음과 같은 처리방법을 순서대로 시도했습니다.

 

1. 구분자를 \r\n으로 구분

 

공백이 아닌 \r\n을 이용해 구분하면 될 것 같아서 시도해보았습니다만 다음과 같은 문제가 발생했습니다.

 

-> 여러 줄 표준스트림 : 2

                                1 2

                                3 4      

     버퍼 : 0 : 0x32

             1 : 0x0D

             2 : 0x0A

             3 : 0x31

             4 : 0x20

             5 : 0x32

             6 : 0x0D

             7 : 0x0A

             8 : 0x33

             9 : 0x20

             10 : 0x34

             11 : 0x0D

             12 : 0x0A

     toString() -> "2\r\n1 2\r\n3 4\r\n"

     split("\r\n") -> 0 : "2"

                          1 : "1 2"

                          2 : "3 4"

                          3 : ""

 

놀랍게도 배열 끝에 ""(빈 문자열)이 새롭게 추가되는 것을 보았습니다. 이유를 알아내기 위해 몇 번의 테스트를 거친 결과 javascript의 split 메소드가 문자열이 구분자로 끝날 경우 반환할 배열 끝에 빈 문자열을 추가하는 기능을 가지고 있다고 추측하였습니다. 그래서 이를 해결하기 위해 다음의 2번 방법을 시도하였습니다.

 

2.  split을 쓰기 전에 문자열 끝의 구분자를 제거.

 

구분자를 "\r\n" 으로 사용해야하니 문자열 끝의 \r\n 부분을 제거해주면 될 것 같았습니다. javascript에서는 문자열 끝에 있는 공백 및 CR, LF 등을 제거해주는 trimEnd() 메소드를 제공해주니 이 메소드를 사용하면 될 것 같습니다. 실제로 문자열 끝의 제어문자들이 사라진 것을 확인할 수 있었습니다.

 

-> 여러 줄 표준스트림 : 2

                                1 2

                                3 4      

     버퍼 : 0 : 0x32

             1 : 0x0D

             2 : 0x0A

             3 : 0x31

             4 : 0x20

             5 : 0x32

             6 : 0x0D

             7 : 0x0A

             8 : 0x33

             9 : 0x20

             10 : 0x34

             11 : 0x0D

             12 : 0x0A

     toString() -> "2\r\n1 2\r\n3 4\r\n"

     trimEmd() -> "2\r\n1 2\r\n3 4"

     split("\r\n") -> 0 : "2"

                          1 : "1 2"

                          2 : "3 4"

 

하지만 왜인지 이방법또한 제대로 실행되지 못했습니다. 그래서 계속 찾아보다가 다음과 같은 3번 해결책을 찾았습니다.

 

3. split을 쓰기 전에 문자열 끝의 구분자를 제거한 후 구분자를 \n으로 구분.

 

\r과 \n에 대해 알아보는 도중 Windows는 \r\n, Linux는 \n을 개행으로 사용한다는 정보를 얻었습니다. 백준 온라인에서 테스트하는 node.js는 웹서버에서 동작하고 웹 서버는 Linux일 확률이 높으니 표준 입력 스트림이 \r\n이 아닌 \n을 사용할 가능성이 높아보였습니다. 즉 실제로는 다음과 같이 동작할 확률이 높았습니다.

 

-> 여러 줄 표준스트림 : 2

                                1 2

                                3 4      

     버퍼 : 0 : 0x32

             1 : 0x0A

             2 : 0x31

             3 : 0x20

             4 : 0x32

             5 : 0x0A

             6 : 0x33

             7 : 0x20

             8 : 0x34

             9 : 0x0A

 

     toString() -> "2\n1 2\n3 4\n"

     trimEmd() -> "2\n1 2\n3 4"

     split("\n") -> 0 : "2"

                       1 : "1 2"

                       2 : "3 4"

 

이렇게 짜니 실제로 코드가 잘 처리되었습니다. 이제 다음 코드를 살펴봅시다.

 

let [T, ...inputArr] = stdinline;

 

줄별로 인자가 들어있는 배열을 변수 T와 inputArr에 저장합니다. 이 때 T는 stdinline[0], inputArr은 stdinline의 나머지 요소가 저장됩니다.

 

-> stdinline = ["2", "1 2", "3 4"]

    T = "2"

    inputArr = ["1 2", "3 4"]

 

for(let i in inputArr)
{
     let [A, B] = inputArr[i].split(" ").map(input => { return parseInt(input);});
     console.log(A+B);
}

 

inputArr 배열의 각 요소는 "A B" 형태의 문자열을 각각 담고 있습니다. 그래서 공백을 기준으로 문자열을 분리한다음 정수로 변환하여 A과 B에 저장하였습니다. for문은 T를 사용해 돌려도 되지만 in을 사용하면 더 간편할 거 같아서 in을 사용했습니다. (T를 사용하지 않았으니 메모리 낭비이긴 합니다.) 처리 과정은 다음과 같습니다.

 

-> inputArr = ["1 2", "3 4"]

    split -> ["1","2"]

    map -> [1,2]

    A = 1

    B = 2

    log -> A+B

    split -> ["3","4"]

    map -> [3,4]

    A = 3

    B = 4

    log -> A+B

                                                         

이상으로 10950번 문제 풀이를 마치겠습니다.

'Programing > Baekjoon 문제 알고리즘(node.js)' 카테고리의 다른 글

2588번 곱셈  (0) 2022.02.25
10871번 X보다 작은 수  (0) 2022.02.25
2753번 윤년  (0) 2022.02.24
2742번 기찍 N  (0) 2022.02.24
8393번 합  (0) 2022.02.24
Posted by englishmath
,