오늘은 눈오는거 누워서 구경하다가 시간이 너무 지나버렸다...
일어난 김에 빨리 오늘할거 해야지
반복문 세 번째 시간~~~
문제 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
더 풀려고 했는데... 배고파서 안되겠다...
오늘 침대에 누워서 눈구경하느라(사실 잠도 많이 자고) 먹은게 야채주스밖에 없다...
오늘은 여기서 그만...내일 이어서 해야지
'백준 > JavaScript' 카테고리의 다른 글
[JS] 백준 1차원 배열 - 첫 번째 이야기 (1) | 2024.01.11 |
---|---|
[JS] 백준 반복문 - 마지막 이야기 (1) | 2024.01.10 |
[JS] 백준 반복문 - 두 번째 이야기 (1) | 2024.01.08 |
[JS] 백준 반복문 - 첫 번째 이야기 (2) | 2024.01.07 |
[JS] 백준 조건문 - 마지막 이야기 (4) | 2024.01.06 |