본문 바로가기

백준/JavaScript

[JS] 백준 반복문 - 세 번째 이야기

728x90

 

오늘은 눈오는거 누워서 구경하다가 시간이 너무 지나버렸다...

일어난 김에 빨리 오늘할거 해야지

 

 

반복문 세 번째 시간~~~

 

문제 25314번

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

 

25314번: 코딩은 체육과목 입니다

오늘은 혜아의 면접 날이다. 면접 준비를 열심히 해서 앞선 질문들을 잘 대답한 혜아는 이제 마지막으로 칠판에 직접 코딩하는 문제를 받았다. 혜아가 받은 문제는 두 수를 더하는 문제였다. C++

www.acmicpc.net

 

4로 나누었을 때 몫이 뭔지 확인하고 몫만큼 long을 붙여주면 될 것 같다.

 

그런데... 자바스크립트에서 console.log()로 데이터를 출력하면 개행문자가 포함되어 출력된다.

그래서 개행 없이 출력해주는 'process.stdout.write();' 를 사용하였다.

 

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

const input = fs.readFileSync(readFileSyncAdress).toString();
let num = parseInt(input)/4;
for(let i=0;i<num;i++){
    process.stdout.write("long ");
}
process.stdout.write("int");

 

 

 

 

어떤 분은 몫의 수만큼 반복문을 돌려 다른 변수에 long을 넣어주었다. 그리고 마지막에 넣어준 변수와 int를 같이 출력하였다.

const input = require('fs').readFileSync('/dev/stdin').toString();
const count = parseInt(input) / 4;
let printLong = '';

for (let i = 1; i <= count; i++) {
    printLong += 'long ';
}

console.log(printLong + 'int');

 

 

또 다른 분은 문자열을 주어진 횟수만큼 반복해 붙인 새로운 문자열을 반환하는 메서드인 repeat()을 사용했다고 한다.

const exc = () => {
  let n = Number(require("fs").readFileSync("/dev/stdin").toString().trim());
  console.log("long ".repeat(n / 4) + "int");
};

exc();

 

[참고] https://dygreen.tistory.com/entry/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B0%B1%EC%A4%80-25314%EB%B2%88-JavaScriptNodejs-%ED%92%80%EA%B8%B0

 

 

 

문제 15552번

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

 

15552번: 빠른 A+B

첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.

www.acmicpc.net

 

본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다. 

 

 

예전에 자바랑 C++을 하면서는 다음과 같이 사용했었는데, 자바스크립트에는 무엇이 있는지 알지 못했다.

자바는 Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter 사용
C++은 cin.tie(NULL)과 sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n) 사용

 

그래서 찾아보니 이 문제에서는 기존처럼 반복문에서 바로 console.log를 사용하면 안되어서 변수에 담아 한번에 출력해주면 된다고 한다.

 

오!! 이건 위에서 다른 분의 풀이와 유사하다ㅎㅎ. 연습할 수 있겠군.

 

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

const input = fs.readFileSync(readFileSyncAdress).toString().split('\n');
const T = Number(input[0]);
let result = "";

for(let i=1;i<=T;i++){
    let A = Number(input[i].split(" ")[0]);
    let B = Number(input[i].split(" ")[1]);

    result += A+B+'\n';
}

console.log(result);

 

 

 

[참고] https://luminouswy.tistory.com/entry/%EB%B0%B1%EC%A4%80-1552%EB%B2%88-%EB%B9%A0%EB%A5%B8AB-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%85%B8%EB%93%9Cjs

 

 

 

 

문제 11021번

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

 

11021번: A+B - 7

각 테스트 케이스마다 "Case #x: "를 출력한 다음, A+B를 출력한다. 테스트 케이스 번호는 1부터 시작한다.

www.acmicpc.net

 

이 문제를 보고 출력해줄 때 예전에 배웠던 방식을 사용해봐야겠다는 생각이 들었다.

그건 바로 문자열에 변수를 사용하는 것이다. 자바스크립트에서 템플릿 리터럴을 사용하기 위해서는 백틱(`)으로 문자열을 작성해줘야한다. 백틱으로 묶은 문자열에서 줄개행을 해주면 출력에서도 영향을 준다.

 

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

const input = fs.readFileSync(readFileSyncAdress).toString().split('\n');
const T = Number(input[0]);

for(let i=1;i<=T;i++){
    let A = Number(input[i].split(" ")[0]);
    let B = Number(input[i].split(" ")[1]);

    console.log(`Case #${i}: ${A+B}`);
}

 

 

 

ㅎㅎ 잘 된다.

 

 

문제 11022번

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

 

11022번: A+B - 8

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

www.acmicpc.net

 

위의 문제보다 더 아름답게 출력하는 문제라는데, 그냥 위의 코드를 조금만 수정해주면 될 것 같다.

 

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

const input = fs.readFileSync(readFileSyncAdress).toString().split('\n');
const T = Number(input[0]);
let A, B;
for(let i=1;i<=T;i++){
    A = Number(input[i].split(" ")[0]);
    B = Number(input[i].split(" ")[1]);

    console.log(`Case #${i}: ${A} + ${B} = ${A+B}`);
}

 

 

 

 

다음다음~~

 

문제 2438번

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

 

2438번: 별 찍기 - 1

첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제

www.acmicpc.net

 

1학년 때 별 찍기 과제를 했던 게 기억난다. 그때로 돌아가고 싶...지는 않다(현재 기억을 가지고 돌아간다면 괜찮을 것 같기도 하고).

 

오~ 이 문제는 많이 해봐서 잘 풀 수 있다 ㅎㅎ.

 

....

 

틀렸습니다가 떠서 당황했다.

그래서 다시 보니 줄바꿈이 마지막에도 포함된 것을 볼 수 있었다.

수정한 후 이제 자신만만하게 다시 제출했는데... 또 틀렸습니다가 나왔다.

알고보니... 입력값이 하나라 Number타입으로 바꿔줄 때도 input이라고 써야하는데 input[0]이라고 작성했던 것이다...(이마탁)

 

역시... 사람은 겸손해야한다.

 

 

휴... 이번에는 제대로 잘 나왔다 ㅎㅎ.

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

const input = fs.readFileSync(readFileSyncAdress).toString();
const N = Number(input);

for(let i=0;i<N;i++){
    for(let j=0;j<i+1;j++){
        process.stdout.write('*');
    }
    if(i!=N-1){
        process.stdout.write('\n');
    }
}

 

 

 

다른 분은 어떻게 풀었나보니까 정말 여러 가지 방법으로 풀었다.

// #1

const fs = require('fs');
const inputData = fs.readFileSync('/dev/stdin').toString();

const num = Number(inputData);
let result = '';

for(let i = 1; i <= num; i++){
	for(let j = 1; j <= i; j++){
    	result += '*';
    }
  // 개행 처리 문자를 넣어줌으로서 별 개수를 구분할 수 있다.
  result += '\n';
}

// 모든 문자열을 이어서 입력한 뒤 한번에 출력
console.log(result);

 

내가 푼 방법이랑 비슷한데, 여기서는 오늘했던 것처럼 result에 문자를 다 넣어주고 한번에 출력해줬다.

 

 

// #2

const fs = require('fs');
const inputData = fs.readFileSync('/dev/stdin').toString();

const num = Number(inputData);
let result = '';

// 누적합을 매 반복마다 출력
for(let i = 1; i <= num; i++){
	result += '*';
  	console.log(result);
}

 

이 방법은 문자를 계속 누적시키면서 반복할 때마다 출력해줬다. 이거보고 신박하다는 생각이 들었다...(난 왜 이런 생각을 못했지...) 아무래도 나는 원래 풀던 것처럼 하려고 하니 이 생각을 하지 못한 것 같다.

 

// #3

const fs = require('fs');
const inputData = fs.readFileSync('/dev/stdin').toString();

const num = Number(inputData);
let result = '';

// i번 문자열을 반복하는 것을 매 반복마다 출력
for(let i = 1; i <= num; i++){
	result = '*'.repeat(i);
  	console.log(result);
}

 

이 방법은 오늘 배웠던 repeat() 함수를 사용하였다. 저렇게 '문자열.repeat(개수)'를 하면 문자열을 해당 개수만큼 반복할 수 있는 것 같다.

 

[참고] https://velog.io/@rkio/%EB%B0%B1%EC%A4%80-Javascript-2438

 

 

 

 

더 풀려고 했는데... 배고파서 안되겠다...

오늘 침대에 누워서 눈구경하느라(사실 잠도 많이 자고) 먹은게 야채주스밖에 없다...

 

 

 

 

 

오늘은 여기서 그만...내일 이어서 해야지

 

 

728x90