Skip to content

nuuco/coding-test

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

791 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ๋ฌธ์ œ ํ’€์ด

โšก๏ธ ๊ณต๋ถ€ ์ˆœ์„œ

  1. ๋ฐฑ์ค€ ๋‹จ๊ณ„๋ณ„๋กœ ํ’€์–ด๋ณด๊ธฐ 1 - 12 ๋‹จ๊ณ„(์ตœ์†Œ)
  2. solved.ac Class 1 - 3
  3. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ์ดˆ 1/2, 2/2

๐Ÿ’Ž ๋ฐฑ์ค€ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ

[ ๋ฐฑ์ค€ ๋‹จ๊ณ„ 1 - 12 ]

  1. ์ž…์ถœ๋ ฅ๊ณผ ์‚ฌ์น™์—ฐ์‚ฐ
  2. ์กฐ๊ฑด๋ฌธ
  3. ๋ฐ˜๋ณต๋ฌธ
  4. 1์ฐจ์› ๋ฐฐ์—ด
  5. ํ•จ์ˆ˜
  6. ๋ฌธ์ž์—ด
  7. ๊ธฐ๋ณธ ์ˆ˜ํ•™ 1
  8. ๊ธฐ๋ณธ ์ˆ˜ํ•™ 2
  9. ์žฌ๊ท€
  10. ๋ธŒ๋ฃจํŠธ ํฌ์Šค
  11. ์ •๋ ฌ
  12. ์ง‘ํ•ฉ๊ณผ ๋งต

[ solved.ac Class 1 - 3 ]

  1. Class 1
  2. Class 2
  3. Class 3

[ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ์ดˆ 1/2, 2/2 ]

  1. ์•Œ๊ณ ๋ฆฌ์ฆ˜ 1
  2. ์•Œ๊ณ ๋ฆฌ์ฆ˜ 2

๐Ÿ”ง ๋ฐฑ์ค€ ์ž…๋ ฅ๊ฐ’ ์ •์ œํ•˜๊ธฐ

์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚œ๋‹ค๋ฉด ๊ฒฐ๊ณผ๊ฐ’์— ๊ฐœํ–‰๋ฌธ์ž๋ฅผ ๋„ฃ์–ด ํ•œ ๋ฒˆ์— ์ถœ๋ ฅํ•˜๊ธฐ

/*๊ณตํ†ต ๋ถ€๋ถ„
1. fs ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜จ๋‹ค.
2. ํ”Œ๋žซํผ์ด linux๋ฉด '/dev/stdin'์—์„œ ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›์•„์˜ค๊ณ , ์•„๋‹ˆ๋ผ๋ฉด ํ˜„์žฌ ํด๋”์˜ './input.txt'์—์„œ ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›์•„์˜จ๋‹ค. 
    (/dev/stdin ๋Š” ๋ฐฑ์ค€ ์ œ์ถœ ํ›„ ์ฑ„์  ์‹œ ์ž…๋ ฅ๊ฐ’ ๋ฐ›์•„์˜ค๋Š” ๊ฒฝ๋กœ)
3. __dirname === ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํด๋”์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ 
*/
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : __dirname + '/input.txt';


// 1. ํ•˜๋‚˜์˜ ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ
const input = fs.readFileSync(filePath).toString().trim();


// 2. ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ํ•œ ์ค„์˜ ๊ฐ’๋“ค์„ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ
const input = fs.readFileSync(filePath).toString().trim().split(' ');


// 3. ์—ฌ๋Ÿฌ ์ค„์˜ ๊ฐ’๋“ค์„ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ
const input = fs.readFileSync(filePath).toString().trim().split('\n');


// 4. ์ฒซ ๋ฒˆ์งธ ์ค„์— ์ž์—ฐ์ˆ˜ n์„ ์ž…๋ ฅ๋ฐ›๊ณ , ๊ทธ ๋‹ค์Œ์ค„์— ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ n๊ฐœ์˜ ๊ฐ’๋“ค์„ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ
const [n, ...arr] = fs.readFileSync(filePath).toString().trim().split(/\s+/);


// 5. ์ฒซ ๋ฒˆ์งธ ์ค„์— ์ž์—ฐ์ˆ˜ n์„ ์ž…๋ ฅ๋ฐ›๊ณ , ๊ทธ ๋‹ค์Œ์ค„๋ถ€ํ„ฐ n๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ํ•œ ์ค„์— ํ•˜๋‚˜์˜ ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ
const [n, ...arr] = fs.readFileSync(filePath).toString().trim().split('\n');

โ€‹
// 6. ํ•˜๋‚˜์˜ ๊ฐ’ ๋˜๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ์—ฌ๋Ÿฌ ๊ฐ’๋“ค์„ ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ ๋’ค์ฃฝ๋ฐ•์ฃฝ ์„ž์—ฌ์„œ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ
// ex) n ์ž…๋ ฅ - ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ n๊ฐœ์˜ ๊ฐ’ ์ž…๋ ฅ - m ์ž…๋ ฅ - ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ m๊ฐœ์˜ ๊ฐ’ ์ž…๋ ฅ
const input = fs.readFileSync(filePath).toString().trim().split(/\s+/);
const n = input[0];
const n_arr = input.slice(1, n+1);
const [m, ...m_arr] = input.slice(n+1);

+) readline ์œผ๋กœ ์ž…๋ ฅ๋ฐ›๊ธฐ (์‹œ๊ฐ„ ์ดˆ๊ณผ & ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ)
์‹คํ–‰ํ•ด ๋ณด๋ ค๋ฉด, ํ„ฐ๋ฏธ๋„์—์„œ node [ํŒŒ์ผ๊ฒฝ๋กœ] ๋กœ ์‹คํ–‰ ํ›„, ํ•œ ์ค„์”ฉ ์ž…๋ ฅ

// readline ์€ fs ๊ณผ ๋‹ฌ๋ฆฌ ํ•œ ์ค„์”ฉ ์ž…๋ ฅ๋ฐ›์•„ ๋ฐ”๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

/* ๊ณตํ†ต ๋ถ€๋ถ„
1. readline ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜จ๋‹ค.
2. readline ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.(rl)
3. 'readline' ๋ชจ๋“ˆ์˜ 'rl' ๊ฐ์ฒด๋Š” event-driven ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
    "line" : ํ•œ ์ค„์ด ์ž…๋ ฅ๋˜๋Š” ์ด๋ฒคํŠธ. ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ์ด ์ค„ ๋ ์ž…๋ ฅ (\ n, \ r ๋˜๋Š” \ r \ n)์„ ์ˆ˜์‹  ํ•  ๋•Œ๋งˆ๋‹ค ๋ฐœ์ƒ.
    "close" : close() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค. ์ฆ‰ ์ž…๋ ฅ ๋ฐ›๊ธฐ๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.
4. line ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์‹คํ–‰ํ•  ์ฝ”๋“œ๋Š”
    rl.on("line", function(str){ ...์ด ์•ˆ์— ๋„ฃ๋Š”๋‹ค... })
    -> ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ str ์€ ์ฝ์–ด์˜จ ํ•œ ์ค„์˜ ๋ฌธ์ž์—ด์ด๋‹ค!
    -> ๋งŒ์•ฝ ํ•œ ์ค„๋งŒ ์ฝ๊ณ  ๋๋‚ด๋„ ๋œ๋‹ค๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜ ์•ˆ์—์„œ rl.close() ํ˜ธ์ถœ
5. close ์ด๋ฒคํŠธ ๋๋‚ฌ์„ ์‹œ ์‹คํ–‰ํ•  ์ฝ”๋“œ๋Š”
    rl.on("close", function(){ ...์ด ์•ˆ์— ๋„ฃ๋Š”๋‹ค... })
    -> ์ฝ”๋“œ ์™„์ „ ์ข…๋ฃŒ ์‹œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜ ์•ˆ์—์„œ process.exit() ํ˜ธ์ถœ (ํ•„์ˆ˜๋Š” ์•„๋‹˜)
6. rl.on("line", function(){...} ).on("close", function(){...}) 
    ์ด๋ ‡๊ฒŒ ์ด์–ด์„œ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.
*/
const readline = require("readline");

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});


// 1. ํ•œ์ค„ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ
rl.on('line', function(line) {
  solution(line); //solution์„ ํ˜ธ์ถœ ํ•œ ํ›„

  rl.close();
}).on("close", function() {
  process.exit(); //ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ
});


// 2. ์—ฌ๋Ÿฌ ์ค„ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ (ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ๊ฐฏ์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ)
let data = [];
rl.on('line', function (line) {
  data.push(line);
  // data = line.split('').map((el) => el);
  // data = line.split(' ').map((el) => el);
  // data = line.split('').map((el) => +el);

  rl.close();
}).on('close', function () {
  solution(data); //solution์„ ํ˜ธ์ถœ ํ•œ ํ›„
  process.exit(); //ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ
});


// 3. ์—ฌ๋Ÿฌ ์ค„ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ (ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ๊ฐฏ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ)
let T = null;
let count = 0;
const data = [];

rl.on('line', function (line) {
  if (!T) {
    // T์ด null์ด๋ฉด
    T = +line;
  } else {
    data.push(line);
    count += 1; // data๋ฅผ ์ž…๋ ฅ๋ฐ›์œผ๋ฉด count๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ์ฃผ๊ณ 
  }
  if (count === T) {
    // count๊ฐ€ T์ผ๋•Œ rl.close()๋ฅผ ํ˜ธ์ถœํ•ด์ค€๋‹ค.
    rl.close();
  }
}).on('close', function () {
  // rl.close()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ด ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ๋“ค์–ด์˜ค๊ณ 
  solution(data); // solution์„ ํ˜ธ์ถœ ํ•œ ํ›„
  process.exit(); // ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.
});

//-> ์ด ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์•„ ๋ฐ›์•„ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ
//-> line ์„ ๋ฐ›์ž๋งˆ์ž ์ฒ˜๋ฆฌํ•ด๋„ ๋œ๋‹ค.

About

๐ŸŽ“ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ๋ฌธ์ œ ํ’€์ด

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors