본문 바로가기
Algorithm/BOJ

입출력과 사칙연산 편 - Node.js로 [백준/BOJ] 단계별로 풀어보기를 처음 풀어보았다.

by Muko 2020. 4. 11.

BOJ 단계별로 풀어보기 '입출력과 사칙연산'

 

 

단계별로 풀어보기는 윗 부분은 알고리즘이라고 하기에는 단순히 사용하는 언어의 문법을 아는가에 대한 문제가 많이 존재합니다. 새로운 언어로 프로그래밍을 하는 요즘, 제가 주로 사용하는 언어로 알고리즘을 풀어보고 싶다는 생각이 들어서 포스팅을 시작하려고 합니다.

1. BOJ 2557 - Hello World

이 문제는 Hello World! 를 출력하라는 문제로, 해당 언어로 문자열을 출력할 수 있느냐고 물어보는 문제입니다. 자바스크립트에서는 한 줄이면 되므로 아주 간단하게 풀었습니다.

코드 접기/펼치기
console.log('Hello World!');




2. BOJ 10718 - We love kriii

이 문제도 마찬가지로 주어진 문장을 출력할 수 있는가에 대한 문제이지만, 위와 달리 이번에는 "강한친구 대한육군"을 한 줄에 한 번씩 두 줄을 출력하라는 문제입니다.

코드 접기/펼치기
console.log('강한친구 대한육군');
console.log('강한친구 대한육군');




1번 풀이방법과 같이 출력하되, 그 출력 코드를 두 번 입력하면 풀 수 있는 문제입니다. 만약 1만 줄을 출력하는 문제일 경우는 이렇게 해결할 수 없게 되는데, 이럴 때는 반복문을 이용해서 해결하면 됩니다. 제가 자바스크립트에서 let이나 for를 사용하는 것을 별로 좋아하지 않으므로 배열과 map을 이용해서 해결했습니다.

코드 접기/펼치기
const N = 2;
[...Array(N).keys()].map(index => {
    console.log("강한친구 대한육군");
});




이렇게 쓰는 코드는 ES6을 이용한 풀이 방법인데, 이 방법말고도 배열을 생성해서 반복문을 만드는 방법을 여러가지가 있습니다.

// 예시
[...Array(N).keys()].map(i => i+1);
Array(N).fill().map((_, i) => i+1);
Array.from(Array(N), (_, i) => i+1);
Array.from({ length: N }, (_, i) => i+1);

// 만약 i*2, -i, i+2와 같은 동작을 하고 싶다면
const myLoop = (N, myOperator) => {
  const result = [...Array(N).keys()].map(myOperator);
  return result;
}
const result = myLoop(5, val => val*2 + 1);
console.log(result); // [1, 3, 5, 7, 9]




3. BOJ 10171 - 고양이

이 문제는 문자열을 출력할 때 특정 기호들이 출력이 되지 않음을 알고있고, 이를 출력하기 위해서는 어떻게 해야하는지 아느냐는 물어보는 문제입니다. 주어진 출력해야하는 문자열에는 백슬래시( \ )가 들어가 있는데, 이 백슬래시를 출력하기 위해서는 앞에 백슬래시 하나를 더 붙여주어야 합니다. \\ 이런식으로 말이죠. 이런 문제가 생기는 이유는 자바스크립트 뿐만 아니라 다른 다양한 프로그래밍언어에서 문자열안에서 다루는 특수한 문자들이 존재하기 때문입니다. 이러한 문자들을 '이스케이프 시퀀스'라고 하는데, 다음과 같은 것들이 해당됩니다.

종류 의미
\a 경고음 출력
\b 줄 바꿈, 개행(new line)
\t 수평 탭으로 일정한 간격 띄우기
\b 백스페이스로 뒤로 한 칸 이동
\r 동일한 줄의 맨 앞 칸으로 커서 이동 (carriage return)
\f 출력 용지를 한 페이지 넘김 (form feed)
\\ \ (역슬래시) 문자 출력
\" " (큰 따옴표) 문자 출력
\' ' (작은 따옴표) 문자 출력
\0 널문자 출력 (null)

그래서 제가 제출한 코드는 다음과 같습니다.

코드 접기/펼치기
const myStr = 
`\\    /\\
 )  ( ')
(  /  )
 \\(__)|`;
console.log(myStr);




4. BOJ 10172 - 개

고양이도 출력했으니, 이번에는 강아지도 출력해 봐야죠.

코드 접기/펼치기
const myStr = 
`|\\_/|
|q p|   /}
( 0 )\"\"\"\\
|\"^\"\`    |
||_/=\\\\__|`;
console.log(myStr);




5. BOJ 1000 - A+B

사실상 백준 홈페이지의 가장 첫 번째 문제라고 볼 수 있습니다. 모든 문제가 4자리 혹은 5자리의 문제번호를 가지고 있는데, 이 문제가 1000번으로 시작 번호를 가지고 있기 때문이죠. 혹시 자바스크립트로 코드를 처음 작성하시는 분들은 자바스크립트 입문 - 불리언과 연산자페이지를 참고하시기 바랍니다. 이 문제는 두 개의 숫자를 더한 결과를 출력하는 문제입니다.

코드 접기/펼치기
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split(' ');

console.log(Number(input[0]) + Number(input[1]));




백준에서는 코드를 제출했을 때 입력 문자열이 들어있는 파일을 실행시켜서 테스트합니다. 그래서 백준에서 자바스크립트로 알고리즘을 풀기위해서는 해당 팡리에 있는 문자열을 읽어와야 하는데요, 위의 두 줄은 파일에서 문자열을 읽어와서 공백을 기준으로 나눈 것입니다. 그래서 예제 입력인 1 2가 들어오면 input에는 ['1', '2']가 들어가게 됩니다. 그런데 우리는 이 입력을 숫자로서 더해야 하기 때문에 문자열로 들어온 '1'과 '2'를 연산 전에 숫자로 바꿔주어야 합니다. 그래서 결과를 출력하는 부분에서 input[0]과 input[1]을 Number로 감싼 것을 확인할 수 있습니다.

문자열에 Number를 감싸는 방법말고도 아래와 같은 방법으로도 해결할 수 있습니다.

코드 접기/펼치기
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split(' ');
const a = parseInt(input[0]);
const b = parseInt(input[1]);
console.log(a + b);




6. BOJ 1001 - A-B

코드 접기/펼치기
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split(' ');
const a = parseInt(input[0]);
const b = parseInt(input[1]);
console.log(a - b);




7. BOJ 10998 - AxB

코드 접기/펼치기
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split(' ');
const a = parseInt(input[0]);
const b = parseInt(input[1]);
console.log(a * b);




8. BOJ 1008 - A/B

코드 접기/펼치기
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split(' ');
const a = parseInt(input[0]);
const b = parseInt(input[1]);
console.log(a / b);




9. BOJ 10869 - 사칙연산

위에서 사칙연산을 출력하는 문제를 모두 해결했는데, 이 문제에서는 사칙연산 결과 모두를 출력하는 문제입니다. 동작 방식은 같아서 위의 문제를 해결하셨다면 간단하게 해결할 수 있습니다.

코드 접기/펼치기
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split(' ');
const a = parseInt(input[0]);
const b = parseInt(input[1]);
console.log(a + b);
console.log(a - b);
console.log(a * b);
console.log(parseInt(a / b));
console.log(a % b);




여기서 주의하셔야 할 점은 몫을 출력하는 부분입니다. 자바스크립트에서는 나누기 연산자를 이용해서 계산하면 소수점 까지 출력이 되는데, 위에서 문자열에서 숫자를 꺼내기 위해 사용한 parseInt를 이용하면 몫을 구할 수 있습니다. int라는 자료형은 정수를 의미해서 뒤에 소수점을 버리기 때문에 몫을 출력하는 것이 가능해집니다.

10. BOJ 10430 - 나머지

이 문제는 주어진 식을 계산한 결과를 출력하는 문제입니다. 지금까지 출력했을 때 사용한 연산식이 조금 더 복잡해졌을 뿐, 방법은 동일합니다.

코드 접기/펼치기
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split(' ');
const A = parseInt(input[0]);
const B = parseInt(input[1]);
const C = parseInt(input[2]);
console.log((A+B)%C);
console.log(((A%C)+(B%C))%C);
console.log((A*B)%C);
console.log(((A%C)*(B%C))%C);




11. BOJ 2588 - 곱셈

이 문제는 조금 더 복잡합니다. 이 문제부터는 조금 머리를 써야합니다. (세 자리 수) * (세 자리 수)의 결과를 계산할 때 첫번째 수를 두 번째 수의 각 자리수와 곱셈 연산을 하게 되는데, 그 결과를 출력하는 문제입니다. 또한 위에 문제들과 달리 이번에는 입력 예제가 공백이 아니라 개행으로 구분되어 있습니다. 이를 신경써서 코드를 작성하시면 해결하실 수 있습니다. 모르겠다고 바로 코드를 확인하지 마시고, 조금만 더 고민해보세요! 지금까지 사용한 방법을 이용해서 충분히 해결할 수 있는 문제입니다.

코드 접기/펼치기
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');
const A = parseInt(input[0]);
const B = input[1];

const res3 = A * parseInt(B[2]);
const res4 = A * parseInt(B[1]);
const res5 = A * parseInt(B[0]);

console.log(res3);
console.log(res4);
console.log(res5);
console.log(A*parseInt(B));




여기까지 따라오시느라 수고하셨습니다!
다음 포스팅에서 만나요~

댓글6