ν‹°μŠ€ν† λ¦¬ λ·°

(동기) node.js 배운 κ±°λ₯Ό μ’€ μ—°μŠ΅ν•˜λŠ” λͺ©μ μ—μ„œ λ°±μ€€ 문제λ₯Ό 풀어보렀고 ν–ˆλ‹€. 그런데 console 좜λ ₯만 ν•  쀄 μ•Œμ§€ console μž…λ ₯에 λŒ€ν•΄μ„œλŠ” λ³„λ„λ‘œ 배운게 μ—†λ‹€λŠ” 사싀을 깨달아 버렸닀!! γ…‹γ…‹γ…‹γ…‹γ…‹

 

κ·Έλž˜μ„œ 이번 κΈ°νšŒμ— console μž…λ ₯에 λŒ€ν•΄μ„œ 정리해본닀.

인터넷에 λͺ‡κ°€μ§€ 방법이 μ œμ‹œλ˜μ–΄ 있던데, λ‚΄ κΈ°μ€€μœΌλ‘œ κ·Έλ‚˜λ§ˆ μ’€ μ‰¬μ›Œλ³΄μ΄λŠ” 방법을 μ œμ‹œν•΄λ³΄λ €κ³  ν•œλ‹€.

 


μš°λ¦¬λŠ” JS의 λ‚΄μž₯ λͺ¨λ“ˆμΈ 'readline' λͺ¨λ“ˆμ„ μ‚¬μš©ν•  것이닀. 

μ²˜μŒμ—λŠ” μ•„λž˜μ˜ κ°€μž₯ 기본이 λ˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•œλ‹€.

const readline = require('readline');

// μΈν„°νŽ˜μ΄μŠ€ 객체λ₯Ό λ§Œλ“€μž.
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

μ΄ν›„μ—λŠ” 상황에 λ”°λΌμ„œ μ½”λ“œμ˜ λ‚΄μš©μ΄λ‚˜ λ””ν…ŒμΌμ΄ 달라진닀.

κ·Έλž˜μ„œ 본인이 μ–΄λ–€ μž…λ ₯값을 λ°›λŠ”μ§€μ— λ”°λΌμ„œ μ½”λ“œμ˜ λ‚΄μš©μ΄ λ‹¬λΌμ§ˆ 수 μžˆλ‹€.


  • μ •μˆ˜ ν•˜λ‚˜ μž…λ ₯ λ°›κΈ° (1회)
  • λ¬΄ν•œνžˆ μž…λ ₯ λ°›κΈ°
  • μ •μˆ˜ 두 개 μž…λ ₯ λ°›κΈ° (1회)
  • λ°°μ—΄μ˜ 크기 N을 μž…λ ₯ λ°›κ³ , N개 μ •μˆ˜ μž…λ ₯ λ°›κΈ°

μ—¬λŸ¬λΆ„μ΄ 처음 뢀뢄을 λ›°μ–΄λ„˜μ„ μˆ˜λ„ μžˆμœΌλ‹ˆ 미리 λ§ν•΄λ‘μžλ©΄, 'readline' λͺ¨λ“ˆμ˜ 'rl' κ°μ²΄λŠ” event-driven λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€. event-driven에 λŒ€ν•΄μ„œλŠ” λ³„λ„λ‘œ μ„€μ •ν•˜μ§€λŠ” μ•Šκ² λ‹€.

 

"line"은 ν•œ 쀄이 μž…λ ₯λ˜λŠ” 이벀트이고, "close"λŠ” EOF λ˜λŠ” 직접 close() ν•¨μˆ˜λ₯Ό 호좜 ν–ˆμ„ λ•Œ λ°œμƒν•˜λŠ” μ΄λ²€νŠΈμ΄λ‹€. 

'readline' λͺ¨λ“ˆμ„ 잘 μ“°λ €λ©΄, μ–΄λ–€ μ΄λ²€νŠΈλ“€μ΄ μžˆλŠ”μ§€ 잘 μ•Œκ³  μžˆλŠ” 것이 μ’‹κ² μ§€λ§Œ, κ°€μž₯ 기본이 λ˜λŠ” 것은 "line"와 "close"이닀. 


1. μ •μˆ˜ ν•˜λ‚˜ μž…λ ₯ λ°›κΈ°(1회)

let N; // μ •μˆ˜λ₯Ό μ €μž₯ν•  λ³€μˆ˜
rl.on("line", function(line){
    console.log(`print input string ${line}`);
    N = Number(line);
    console.log(`print input number ${N}`);
    rl.close();
})

말 κ·ΈλŒ€λ‘œ μ •μˆ˜ ν•˜λ‚˜λ₯Ό μž…λ ₯ λ°›μ•„μ„œ κ·ΈλŒ€λ‘œ 좜λ ₯ν•˜λŠ” μ½”λ“œλ‹€.

 

λ§ˆμ§€λ§‰μ— rl.close()κ°€ μžˆλ‹€λŠ” 점에 μ£Όλͺ©ν•˜μž. 이 ν•œμ€„μ΄ μž…λ ₯을 λ¬΄ν•œνžˆ λ°›λŠ”μ§€ μ•„λ‹Œμ§€λ₯Ό κ²°μ •ν•œλ‹€.

 

2. λ¬΄ν•œνžˆ μž…λ ₯ λ°›κΈ°

let N; // μ •μˆ˜λ₯Ό μ €μž₯ν•  λ³€μˆ˜
rl.on("line", function(line){
    console.log(`print input string ${line}`);
    N = Number(line);
    console.log(`print input number ${N}`);
})

μ •μˆ˜ ν•˜λ‚˜λ₯Ό μž…λ ₯ν•˜κ³  μ—”ν„°λ₯Ό 쳀더라도 ν”„λ‘œκ·Έλž¨μ΄ κ³„μ†ν•΄μ„œ μž…λ ₯을 κΈ°λ‹€λ¦°λ‹€.(λ˜λŠ” μž…λ ₯을 받을 수 μžˆλ„λ‘ μœ μ§€ν•œλ‹€.)

 

close() ν•¨μˆ˜λŠ” rl 객체의 "close" 이벀트λ₯Ό μ£ΌλŠ” 만큼 μ•„μ£Ό μ€‘μš”ν•œ ν•¨μˆ˜μ΄λ‹€.

 

3. μ •μˆ˜ 2개 μž…λ ₯λ°›κΈ°(1회)

let input = []
rl.on("line", function(line){
    input = line.split(' ').map((el) => parseInt(el));
    rl.close();
})

rl.on("close", function(){
    let A = input[0];
    let B = input[1];
    console.log(A+B);
})

λ°±μ€€ 1000번 A+Bλ₯Ό ν•΄κ²°ν•  수 μžˆλŠ” μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄μž.

 

두 μ •μˆ˜κ°€ 곡백을 κΈ°μ€€μœΌλ‘œ μž…λ ₯되기 λ•Œλ¬Έμ—, split(' ') 뢀뢄을 넣어쀬닀.

그리고 μž…λ ₯된 μ •μˆ˜λ₯Ό λ°”λ‘œ Int ν˜•μœΌλ‘œ λ³€ν™˜ν•˜κΈ° μœ„ν•΄μ„œ parseInt(el) 뢀뢄을 넣어쀬닀.

map(...)은 리슀트 μžλ£Œν˜•μΈ line.split(' ')의 각 μ›μ†Œμ— 콜백 ν•¨μˆ˜λ₯Ό μ μš©ν•΄μ£ΌλŠ” 역할을 ν•œλ‹€.

 

μ΄ν›„μ˜ κΈ°λŠ₯은 λͺ¨λ‘ rl.on("close", ....)μ—μ„œ μ²˜λ¦¬κ°€ λœλ‹€. 

참고둜 본인은 μ²˜μŒμ— μ•„λž˜μ˜ μ½”λ“œλ₯Ό κ΅¬μ„±ν•˜μ˜€λ‹€.

let input = []
rl.on("line", function(line){
    input = line.split(' ').map((el) => parseInt(el));
    rl.close();
})


let A = input[0];
let B = input[1];
console.log(A+B);

 

ν•˜μ§€λ§Œ, λ¬Έμ œλŠ” μ΄λ ‡κ²Œ μ½”λ“œλ₯Ό κ΅¬μ„±ν•˜λ©΄, A, B에 μ μ ˆν•œ 값이 듀어가지 μ•ŠκΈ° λ•Œλ¬Έμ— NaN을 좜λ ₯ν•˜κ²Œ λœλ‹€.

 

비단 console.log(A+B) 말고, κ·Έλƒ₯ console.log("test")둜 좜λ ₯을 해봐도, rl.on("line", ...) 이전에 μ½˜μ†” 좜λ ₯이 λ˜λŠ” 것을 μ•Œ 수 μžˆλ‹€.

 

이런 일이 μΌμ–΄λ‚˜λŠ” μ΄μœ λŠ” κΈ€μ˜ μ•žμ—μ„œ μ œμ‹œν•˜μ˜€λ“―μ΄ rl 객체가 event-driven λ°©μ‹μœΌλ‘œ μž‘λ™ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€!!

 

κ·Έλž˜μ„œ μš°λ¦¬κ°€ μž…λ ₯을 λ°›κ³  rl.close()λ₯Ό ν˜ΈμΆœν•˜μ—¬ μž…λ ₯이 λλ‚¬λ‹€λŠ” 것을 μ•Œλ €μ€˜μ•Ό ν•œλ‹€.

 


4. λ°°μ—΄μ˜ 크기 N을 μž…λ ₯ λ°›κ³ , N개 μ •μˆ˜ μž…λ ₯ λ°›κΈ°

λ°±μ€€ 10818번 μ΅œμ†Œ, μ΅œλŒ€ 문제의 μž…λ ₯을 node.js둜 μ–΄λ–»κ²Œ 받을 수 μžˆλŠ”μ§€ μ‚΄νŽ΄λ³΄μž.

 

λ¨Όμ € μž…λ ₯은 μ•„λž˜μ™€ κ°™λ‹€.

5
20 10 35 30 7

 

자, 이제 node.js μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄μž.

let N;

let count = 0; // λͺ‡λ²ˆμ§Έ 라인을 μž…λ ₯ λ°›λŠ”μ§€λ₯Ό μ €μž₯ν•˜λŠ” λ³€μˆ˜
rl.on("line", function(line){
    if(count == 0)
        N = Number(line.trim());
    else if(count == 1){
        get_Min_Max(line.trim());
        rl.close();
    }
    count++;
})

function get_Min_Max(input){
    let arr = input.split(' ').map((num) => parseInt(num));
    console.log(arr); // ν…ŒμŠ€νŠΈμš©

    // min, maxλ₯Ό 좜λ ₯은 슀슀둜 ν•΄λ³΄μ‹œκΈ° λ°”λžλ‹ˆλ‹€.
}

κ°„λ‹¨ν•œ νŠΈλ¦­μ„ μ΄μš©ν•΄μ„œ ν•œμ€„ ν•œμ€„ μž…λ ₯될 λ•Œλ§ˆλ‹€ λ‹€λ₯Έ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ„λ‘ μ½”λ“œλ₯Ό κ΅¬μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

μš°λ¦¬κ°€ 맀번 μž…λ ₯을 받을 λ•Œ, μš°λ¦¬λŠ” 항상 단 ν•˜λ‚˜μ˜ rl.on("line", ...)λ₯Ό 가지고, 그곳에 기둝된 λ‚΄μš©μ„ μˆ˜ν–‰ν•  수 밖에 μ—†μŠ΅λ‹ˆλ‹€. 즉, μ•„λž˜μ™€ 같은 μ½”λ“œλŠ” 우리의 λͺ©μ μ— λΆ€ν•©ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ±°μ£ .

/* 잘λͺ»λœ μ‚¬μš©μ˜ˆ 1 */
rl.on("line", function(line){
    N = Number(line.trim());
})

rl.on("line", function(line){
    get_Min_Max(line.trim());
    rl.close();
})

 

/* 잘λͺ»λœ μ‚¬μš©μ˜ˆ 2 */
rl.on("line", function(line){
    N = Number(line.trim());
    rl.on("line", function(line){
        get_Min_Max(line.trim());
        rl.close();
    })
})

κ·Έλž˜μ„œ μ €λŠ” μ•„μ˜ˆ ν˜„μž¬ λͺ‡λ²ˆμ§Έ μ€„μ˜ μž…λ ₯을 λ°›λŠ”μ§€λ₯Ό κΈ°λ‘ν•˜μ—¬ n-th 라인의 μž…λ ₯ λ•Œλ§ˆλ‹€ λ‹€λ₯Έ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ„λ‘ μ½”λ“œλ₯Ό κ΅¬μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

μ΄λΆ„μ˜ λΈ”λ‘œκ·Έ 글을 보면, 저와 λΉ„μŠ·ν•œ λ°©μ‹μœΌλ‘œ rl.on("line", ...)λ₯Ό μ‚¬μš©ν•˜κ³  κ³„μ‹­λ‹ˆλ‹€.

λ‹€λ§Œ, λ‹€λ₯Έ 점은 이뢄은 rl.on("line", ...)의 μž…λ ₯을 λͺ¨λ‘ 받은 후에, rl.on("close", ...) ν•¨μˆ˜μ—μ„œ μž‘μ—…μ„ μ²˜λ¦¬ν•œλ‹€λŠ” κ±°μ£ .

 

μ–΄λŠ 방법이 더 μ’‹μ€μ§€λŠ” 저도 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. (저도 아직 node.js PSλ₯Ό 많이 μ•ˆ ν•΄λ΄μ„œμš”)

 

κ·Έλž˜λ„ C/C++, python 문법에 μ΅μˆ™ν•œ μ €λŠ” μž…λ ₯을 λͺ¨λ‘ λ°›κ³ , μž‘μ—…μ„ μ²˜λ¦¬ν•˜λŠ” 것보닀 μž…λ ₯을 ν•œμ€„ν•œμ€„ 받을 λ•Œ μ²˜λ¦¬ν•˜λŠ” 것이 더 μ΅μˆ™ν•˜κΈ° λ•Œλ¬Έμ— μœ„μ™€ 같은 λ°©μ‹μœΌλ‘œ μ½”λ“œλ₯Ό κ΅¬μ„±ν•΄μ„œ PSλ₯Ό ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 


ν˜Ήμ‹œ 더 쒋은 μ½”λ“œκ°€ μžˆλ‹€λ©΄, μ œμ‹œν•΄μ£Όμ„Έμš”!! 

ν•¨κ»˜ λ°°μ›μ‹œλ‹€ γ…Žγ…Ž

 

 

λŒ“κΈ€
곡지사항
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€
Total
Today
Yesterday
링크
Β«   2024/04   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
κΈ€ 보관함