'Programing'에 해당되는 글 79건

  1. 2022.02.28 11022번 A+B - 8
  2. 2022.02.25 2577번 숫자의 개수
  3. 2022.02.25 11021번 A+B - 7
  4. 2022.02.25 1110번 더하기 사이클
  5. 2022.02.25 10952번 A+B - 5
  6. 2022.02.25 2884번 알람 시계
  7. 2022.02.25 2588번 곱셈
  8. 2022.02.25 10871번 X보다 작은 수
  9. 2022.02.25 10950번 A+B - 3
  10. 2022.02.24 2753번 윤년

문제 : https://www.acmicpc.net/problem/11022

 

11022번: A+B - 8

각 테스트 케이스마다 "Case #x: A + B = C" 형식으로 출력한다. x는 테스트 케이스 번호이고 1부터 시작하며, C는 A+B이다.

www.acmicpc.net

성공한 코드

10950번 문제 풀이 코드에서 출력형태만 바꿔주면 됩니다. 앞에서도 말씀드렸지만 i를 정수형태로 변환해야 한다는 것을 잊지 말아야 합니다.

 

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

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

2577번 숫자의 개수  (0) 2022.02.25
11021번 A+B - 7  (0) 2022.02.25
1110번 더하기 사이클  (0) 2022.02.25
10952번 A+B - 5  (0) 2022.02.25
2884번 알람 시계  (0) 2022.02.25
Posted by englishmath
,

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

성공한 코드

얼핏 보면 코드을 되게 길게 작성해야 할 것 같지만 각 숫자 개수가 저장될 변수를 배열의 인덱스로 사용하면 코드 길이를 줄일 수 있습니다.

 

let strMul = (A*B*C).toString();

 

A*B*C를 자릿수로 처리하기 위해 문자열로 저장합니다. 

 

let stdoutArr = Array.from(new Array(10), e => { return 0;})

 

0~9 숫자의 개수가 저장될 배열을 선언 후 0으로 초기화합니다. 크기가 10인 배열은 0~9까지의 인덱스를 가지므로 배열의 각 요소에는 0~9 숫자의 개수가 저장될 수 있습니다.
    
for(let i in strMul){

 

A*B*C 문자열의 자릿수만큼 코드를 반복 수행합니다.

 

stdoutArr[strMul[i]] = stdoutArr[strMul[i]]+1;

 

strMul의 인덱스에 속한 값에 해당하는 stdoutArr의 인덱스에 속한 값을 1 증가시킵니다. 말이 좀 어려운데 쉽게 정리하면 다음과 같습니다.

 

-> strMul -> "17037300"
    strMul[0] -> 1

    stdoutArr[1] = stdoutArr[1]+1

    stdoutArr[1] -> 1

 

    strMul[1] -> 7

    stdoutArr[7] = stdoutArr[7]+1

    stdoutArr[7] -> 1

 

    strMul[2] -> 0

    stdoutArr[0] = stdoutArr[0]+1

    stdoutArr[0] -> 1

 

    strMul[3] -> 3

    stdoutArr[3] = stdoutArr[3]+1

    stdoutArr[3] -> 1

 

    strMul[4] -> 7

    stdoutArr[7] = stdoutArr[7]+1

    stdoutArr[7] -> 2

 

    ...

 

이해가 되시나요?  즉 strMul 각 자릿수와 동일한 인덱스 번호를 가지는 stdoutArr 요소에 값이 1추가되는 것입니다.

 

for(let i in stdoutArr)
        console.log(stdoutArr[i]);

 

자릿수 체크가 전부 끝났다면 for문을 돌려 stdoutArr의 각 요소를 출력합니다. 즉 stdoutArr에서 0~9인덱스들의 카운트 값들이 출력되는 것입니다.

 

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

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

11022번 A+B - 8  (0) 2022.02.28
11021번 A+B - 7  (0) 2022.02.25
1110번 더하기 사이클  (0) 2022.02.25
10952번 A+B - 5  (0) 2022.02.25
2884번 알람 시계  (0) 2022.02.25
Posted by englishmath
,

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

성공한 코드

이번 문제는 10950번 문제 풀이 코드에 문자열만 덧붙이면 되는 것이므로 특별한 설명은 하지 않겠습니다. 단 javascript에서 for문의 in은 객체의 속성을 String으로 가져오기 때문에 덧셈 연산을 하실 때 정수로 변환해주셔야 합니다.

 

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

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

11022번 A+B - 8  (0) 2022.02.28
2577번 숫자의 개수  (0) 2022.02.25
1110번 더하기 사이클  (0) 2022.02.25
10952번 A+B - 5  (0) 2022.02.25
2884번 알람 시계  (0) 2022.02.25
Posted by englishmath
,

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

성공한 코드

코드 설명하겟습니다.

 

let sum = null;
let cycle = 0;
let sumStr = N.toString();

 

입력받은 수와 비교할 새로운 수인 sum, 사이클 수, 자릿수 연산을 위해 사용할 sum의 문자열 변수를 선언합니다. 이 때 sum은 null로 초기화하였는데 이는 초기값과 입력값이 겹쳐 for문이 실행되지 않는 것을 방지하기 위해 null로 선언하였습니다. 만약 0으로 초기화한다면 입력값이 0일 때 for문이 수행되지 않습니다. 첫 for문에서 검사할 N의 자릿수를 계산하기 위해 sum 문자열 변수의 초기값은 N의 문자열 형태입니다.


for(;sum!=N;cycle++)

 

사이클로 만들어진 새로운 수가 입력받은 수와 같아질 때까지 반복합니다. 한 사이클이 끝날 때마다 사이클 값은 증가됩니다.

 

if(sumStr.length < 2){
    sumStr = "0".concat(sumStr);
}
        

sumStr 변수의 자릿수가 1이라면 앞에 0을 붙여 2자릿수로 만듭니다. 첫 사이클에는 N의 자릿수를 검사하며 그다음 사이클에는 새로 만들어진 숫자의 자릿수를 검사합니다.

 

let newSum = parseInt(sumStr[0])+parseInt(sumStr[1]);

 

sumStr 변수의 자릿수가 2라면 십의자리와 1의자리 숫자를 더해 정수 형태로 저장합니다.


if(newSum < 10){
    sumStr = sumStr[1].concat(newSum.toString());

 

만들어진 정수값의 자릿수가 1개라면 sumStr의 일의자리수와 만들어진 값을 연결하여 새로운 숫자 문자열을 만들어 sumStr 에 저장합니다.

 

}else{
sumStr = sumStr[1].concat(newSum.toString()[1]);
}

 

만들어진 정수값의 자릿수가 2개라면 sumStr의 일의자리수와 만들어진 값의 일의 자리수를 연결하여 새로운 숫자 문자열을 만들어 sumStr 에 저장합니다.


sum = parseInt(sumStr);

 

새로운 숫자를 만들었으면 입력받은 N값과 비교하기 위해 정수형태로 sum에 저장합니다.

console.log(cycle);

사이클로 만들어진 새로운 수가 입력받은 수와 동일해져서 for문을 탈출하면 cycle 횟수를 출력합니다.

 

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

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

2577번 숫자의 개수  (0) 2022.02.25
11021번 A+B - 7  (0) 2022.02.25
10952번 A+B - 5  (0) 2022.02.25
2884번 알람 시계  (0) 2022.02.25
2588번 곱셈  (0) 2022.02.25
Posted by englishmath
,

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

성공한 코드

A+B와 동일하나 맨 마지막 요소 연산은 출력하지 않습니다. 코드를 살펴봅시다.   

 

for(let i in stdinline){

 

읽어들인 표준 입력 스트림 줄 수 만큼 반복합니다.


if(i == stdinline.length-1)
            break;

 

현재 처리할려는 줄이 표준 입력 스트림 마지막 줄인 경우 for문을 탈출합니다. 맨 마지막 줄은 연산 출력을 하지 않기 때문입니다.

 

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

 

현재 처리할려는 줄이 마지막 줄이 아니라면 "A B" 형태의 인자를 공백 기준으로 나누고 정수로 변환하여 A과 B에 저장한 후 A+B를 출력합니다.

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

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

11021번 A+B - 7  (0) 2022.02.25
1110번 더하기 사이클  (0) 2022.02.25
2884번 알람 시계  (0) 2022.02.25
2588번 곱셈  (0) 2022.02.25
10871번 X보다 작은 수  (0) 2022.02.25
Posted by englishmath
,

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

성공한 코드

한 줄 입력이므로 기존에 사용했던 한줄 입력 코드를 사용했습니다. 코드를 살펴봅시다.

 

M = M-45;

 

45분 일찍 설정하는 것이 문제이므로 입력받은 M분에서 45를 뻅니다.
    
if(M >= 0){

 

45분을 뺀 값이 0 이상이라면 아무런 처리를 해 줄 필요가 없으니 코드를 생략합니다.

 

else if(H == 0){
        H = 23;
        M = 60+M
}

 

45분을 뺀 값이 음수라면 시간을 1 감소시킨 후 M값에 60분을 더해주어야 합니다. 단 이 때 시간이 자정을 나타내는 0이라면 1을 감소시킬 때 음수로 지정되므로 직접 23이라고 입력해줍니다.


else{
        H--;
        M = 60+M
}

 

45분을 뺀 값이 음수고 현재 시간이 자정이 아니라면 시간을 1 감소시킨 후 M값에 60분을 더해줍니다.

 

console.log(`${H} ${M}`);

 

시간을 한 줄로 출력하면 됩니다.

 

이상 2884번 문제 풀이를 마치겠습니다.

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

1110번 더하기 사이클  (0) 2022.02.25
10952번 A+B - 5  (0) 2022.02.25
2588번 곱셈  (0) 2022.02.25
10871번 X보다 작은 수  (0) 2022.02.25
10950번 A+B - 3  (0) 2022.02.25
Posted by englishmath
,

출처 : 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
,

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

성공한 코드

윤년이면 1, 아니면 0을 출력하는 코드입니다. 일단 윤년은 400의 배수이면 무조건 윤년입니다. 그런데 400의 배수는 아니지만 4의 배수인 동시에 100의 배수가 아니면 윤년입니다. 그 외의 연도는 윤년이 아닙니다. 이것을 if문으로 짜면 위와 같은 코드가 나옵니다.

 

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

10871번 X보다 작은 수  (0) 2022.02.25
10950번 A+B - 3  (0) 2022.02.25
2742번 기찍 N  (0) 2022.02.24
8393번 합  (0) 2022.02.24
2439번 별 찍기 - 2  (0) 2022.02.24
Posted by englishmath
,