<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Homile</title>
    <link>https://homile.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 5 Aug 2026 09:58:25 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>호밀이</managingEditor>
    <item>
      <title>React(Vite) + TypeScript로 시리얼 통신 구현하기 </title>
      <link>https://homile.tistory.com/441</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ser.png&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWFvA5/btsL0VzvomZ/vOw7xsHUoWEipnWSV6Pib0/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWFvA5/btsL0VzvomZ/vOw7xsHUoWEipnWSV6Pib0/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWFvA5/btsL0VzvomZ/vOw7xsHUoWEipnWSV6Pib0/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWFvA5%2FbtsL0VzvomZ%2FvOw7xsHUoWEipnWSV6Pib0%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;402&quot; data-filename=&quot;ser.png&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;오늘은 React(Vite)와 TypeScript를 활용하여 시리얼 통신을 구현하는 방법에 대해 알아보도록 하겠습니다. 최근 웹 개발에서 시리얼 포트를 다루는 경우가 많아지고 있는데요, Web Serial API를 통해 이를 손쉽게 처리할 수 있습니다. 그럼 시작해볼까요? &lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Serialport?&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SerialPort는&amp;nbsp;시리얼&amp;nbsp;통신(Serial&amp;nbsp;Communication)을&amp;nbsp;통해&amp;nbsp;데이터를&amp;nbsp;주고받기&amp;nbsp;위한&amp;nbsp;소프트웨어&amp;nbsp;인터페이스로,&amp;nbsp;주로&amp;nbsp;하드웨어&amp;nbsp;장치(센서,&amp;nbsp;마이크로컨트롤러,&amp;nbsp;IoT&amp;nbsp;장치&amp;nbsp;등)와&amp;nbsp;컴퓨터&amp;nbsp;간의&amp;nbsp;데이터를&amp;nbsp;교환할&amp;nbsp;때&amp;nbsp;사용됩니다.&amp;nbsp;특히&amp;nbsp;임베디드&amp;nbsp;시스템,&amp;nbsp;하드웨어&amp;nbsp;제어&amp;nbsp;및&amp;nbsp;다양한&amp;nbsp;장치들과의&amp;nbsp;통신에&amp;nbsp;자주&amp;nbsp;활용됩니다.&amp;nbsp;이&amp;nbsp;과정에서&amp;nbsp;직렬&amp;nbsp;통신&amp;nbsp;포트(시리얼&amp;nbsp;포트)를&amp;nbsp;사용하여&amp;nbsp;바이트&amp;nbsp;단위의&amp;nbsp;데이터를&amp;nbsp;순차적으로&amp;nbsp;전송합니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;시리얼 통신(Serial Communication)?&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시리얼 통신(Serial Communication)&lt;/b&gt;이란 데이터를 한 번에 한 비트씩 순차적으로 전송하는 방식입니다. 이는 병렬 통신과 대비되며, 전송선이 적고 전송 거리가 길어도 안정적인 전송이 가능하다는 장점이 있습니다.&lt;br /&gt;시리얼&amp;nbsp;통신은&amp;nbsp;RS-232,&amp;nbsp;USB,&amp;nbsp;SPI,&amp;nbsp;I2C와&amp;nbsp;같은&amp;nbsp;여러&amp;nbsp;프로토콜을&amp;nbsp;통해&amp;nbsp;구현되며,&amp;nbsp;다양한&amp;nbsp;장치들과&amp;nbsp;통신할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Web Serial API&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Web&amp;nbsp;Serial&amp;nbsp;API&lt;/b&gt;는&amp;nbsp;브라우저가&amp;nbsp;직렬&amp;nbsp;장치에&amp;nbsp;접근할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;해주는&amp;nbsp;기능입니다.&amp;nbsp;이&amp;nbsp;API를&amp;nbsp;사용하면&amp;nbsp;웹&amp;nbsp;애플리케이션에서&amp;nbsp;직접&amp;nbsp;하드웨어&amp;nbsp;장치와&amp;nbsp;소통할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;됩니다.&lt;br /&gt;(Web Serial API는 보안상의 이유로 HTTPS에서만 사용할 수 있습니다.)&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;환경 설정하기&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;개발관련&amp;nbsp;세팅이&amp;nbsp;되어있다는&amp;nbsp;가정하에&amp;nbsp;진행하도록&amp;nbsp;하겠습니다.&amp;nbsp;(Node.js,&amp;nbsp;npm,&amp;nbsp;...)&lt;br /&gt;먼저, 프로젝트를 생성하고 필요한 패키지를 설치해야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1737880620501&quot; class=&quot;sql&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;npm create vite@latest serial-communication --template react-ts

✔ Select a framework: &amp;rsaquo; React
✔ Select a variant: &amp;rsaquo; TypeScript

cd serial-communication
npm install
npm run dev&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;위와&amp;nbsp;같이&amp;nbsp;명령어를&amp;nbsp;작성하면&amp;nbsp;vite로&amp;nbsp;구성된&amp;nbsp;기본&amp;nbsp;화면이&amp;nbsp;출력됩니다.&amp;nbsp;이후&amp;nbsp;시리얼&amp;nbsp;통신을&amp;nbsp;위해서&amp;nbsp;최소한의&amp;nbsp;파일만&amp;nbsp;남겨두고&amp;nbsp;삭제하도록&amp;nbsp;하겠습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;UI 구성하기&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;시리얼 통신에는 포트 연결, 포트 열기, 포트에 데이터 쓰기, 포트에서 데이터 읽기 등과 같은 기능을 사용해야 합니다. 필요한 버튼 및 연결된 것을 알 수 있게 UI를 구성하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1737880620501&quot; class=&quot;javascript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;// App.tsx
import &quot;./App.css&quot;;

function App() {
  return (
    &amp;lt;section&amp;gt;
      &amp;lt;h1&amp;gt;serial-communication&amp;lt;/h1&amp;gt;
      &amp;lt;p&amp;gt;Selected Port: &amp;lt;/p&amp;gt;
      &amp;lt;div className=&quot;wrapper&quot;&amp;gt;
        &amp;lt;button&amp;gt;Port select&amp;lt;/button&amp;gt;
        &amp;lt;button&amp;gt;Send Data&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/section&amp;gt;
  );
}
export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;display.png&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d36ga2/btsL1HmSG4Y/fMaZLKuoEYDSBrwj6OmIkk/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d36ga2/btsL1HmSG4Y/fMaZLKuoEYDSBrwj6OmIkk/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d36ga2/btsL1HmSG4Y/fMaZLKuoEYDSBrwj6OmIkk/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd36ga2%2FbtsL1HmSG4Y%2FfMaZLKuoEYDSBrwj6OmIkk%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1242&quot; height=&quot;532&quot; data-filename=&quot;display.png&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;Serial Communication 구현하기&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이제&amp;nbsp;본격적으로&amp;nbsp;시리얼&amp;nbsp;통신을&amp;nbsp;구현해보겠습니다!&amp;nbsp;아래&amp;nbsp;코드를&amp;nbsp;참고하세요:D&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;사용 가능한 포트 확인&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;시리얼&amp;nbsp;통신을&amp;nbsp;하기위해&amp;nbsp;사용&amp;nbsp;가능한&amp;nbsp;포트를&amp;nbsp;확인하여&amp;nbsp;연결하는&amp;nbsp;과정의&amp;nbsp;코드를&amp;nbsp;작성하겠습니다.&lt;br /&gt;먼저&amp;nbsp;재사용성&amp;nbsp;있게&amp;nbsp;컴포넌트를&amp;nbsp;구성하기&amp;nbsp;위해&amp;nbsp;custom&amp;nbsp;hook을&amp;nbsp;생성했습니다.&amp;nbsp;이때,&amp;nbsp;Web&amp;nbsp;Serial&amp;nbsp;API를&amp;nbsp;사용하기&amp;nbsp;위해서는&amp;nbsp;기본적으로&amp;nbsp;비동기&amp;nbsp;통신이&amp;nbsp;되어야하는&amp;nbsp;것을&amp;nbsp;주의해서&amp;nbsp;작성해주시면&amp;nbsp;됩니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;navigator.serial.requestPort()&lt;/b&gt;: 연결 가능한 포트 목록을 확인할 수 있도록 해주는 메서드입니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;port.open({ option })&lt;/b&gt;: 직렬 포트에 맞는 option을 설정해서 시리얼 통신을 할 수 있도록 포트를 웹브라우저와 연결하는 메서드입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1737880620503&quot; class=&quot;typescript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;// hooks/useSerialCommunication.tsx
import { useState } from &quot;react&quot;;

function useSerialCommunication() {
  const [port, setPort] = useState();

  const initialize = async () =&amp;gt; {
    try {
      // @ts-expect-error: navigator.serial is not yet supported in TypeScript
      const port = await navigator.serial.requestPort();
      setPort(port);
      await port.open({ baudRate: 9600 });
    } catch (err) {
      console.error(&quot;포트 연결 실패:&quot;, err);
    }
  };

  return { port, initialize };
}

export default useSerialCommunication;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1737880620504&quot; class=&quot;javascript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;typescript&quot;&gt;&lt;code&gt;// App.tsx
import &quot;./App.css&quot;;
import useSerialCommunication from &quot;./hooks/useSerialCommunication&quot;;

function App() {
  const { port, initialize } = useSerialCommunication();
  return (
    &amp;lt;section&amp;gt;
      &amp;lt;h1&amp;gt;serial-communication&amp;lt;/h1&amp;gt;
      &amp;lt;p&amp;gt;Selected Port: {port ? &quot;connect&quot; : &quot;&quot;}&amp;lt;/p&amp;gt;
      &amp;lt;div className=&quot;wrapper&quot;&amp;gt;
        &amp;lt;button onClick={initialize}&amp;gt;Port select&amp;lt;/button&amp;gt;
        &amp;lt;button&amp;gt;Send Data&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/section&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connect.png&quot; data-origin-width=&quot;2158&quot; data-origin-height=&quot;1306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cldcB4/btsL18EgoHI/8LdbLDa9vv6kVgBIPNgl00/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cldcB4/btsL18EgoHI/8LdbLDa9vv6kVgBIPNgl00/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cldcB4/btsL18EgoHI/8LdbLDa9vv6kVgBIPNgl00/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcldcB4%2FbtsL18EgoHI%2F8LdbLDa9vv6kVgBIPNgl00%2Ftfile.dat&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2158&quot; height=&quot;1306&quot; data-filename=&quot;connect.png&quot; data-origin-width=&quot;2158&quot; data-origin-height=&quot;1306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;포트에 데이터 쓰기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sendData 함수는 React 애플리케이션에서 Web Serial API를 사용하여 시리얼 포트로 데이터를 전송하는 로직을 처리합니다. 이 함수는 사용자가 입력한 문자열 데이터를 시리얼 포트에 인코딩하여 전송하고, 오류 발생 시 적절히 로그를 출력합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;포트 선택 확인&lt;/b&gt;&lt;br /&gt;port 객체가 없는 경우 에러를 던져 사용자가 시리얼 포트 연결을 먼저 설정하도록 요구합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Writable 스트림 가져오기&lt;/b&gt;&lt;br /&gt;port.writable.getWriter()를 호출해 데이터를 전송할 수 있는 Writable 스트림을 생성합니다. 스트림은 단일 작업을 수행하기 위해 잠금(lock) 상태가 되며, 작업이 완료된 후 releaseLock()으로 잠금을 해제해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 인코딩&lt;/b&gt;&lt;br /&gt;사용자가 전송하고자 하는 데이터(messageToSend)는 문자열이므로, 시리얼 포트가 이해할 수 있는 바이너리 형식으로 변환해야 합니다. 이를 위해 Web API의 TextEncoder를 사용하여 문자열을 Uint8Array로 인코딩합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 전송&lt;/b&gt;&lt;br /&gt;writer.write(data)를 호출하여 인코딩된 데이터를 시리얼 포트로 전송합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스트림 해제&lt;/b&gt;&lt;br /&gt;releaseLock()을 호출하여 스트림 잠금을 해제합니다. 이렇게 해야 다른 쓰기 작업이나 리소스 처리가 가능합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에러 처리&lt;/b&gt;&lt;br /&gt;데이터 전송 중 문제가 발생하면 catch 블록에서 에러를 캡처하고, 오류 메시지를 출력합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;디버깅 로그 출력&lt;/b&gt;&lt;br /&gt;console.log를 사용해 전송된 데이터(messageToSend)와 변환된 바이너리 데이터(data)를 확인할 수 있도록 로그를 출력합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738051140830&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const sendData = async (messageToSend: string) =&amp;gt; {
  if (!port) {
    throw new Error(&quot;Port is not selected&quot;);
  }

  try {
    // 시리얼 포트의 writable 스트림 가져오기
    // @ts-expect-error: navigator.serial은 TypeScript에서 아직 지원되지 않음
    const writer = port.writable.getWriter();

    // TextEncoder를 사용해 문자열 데이터를 Uint8Array 형식으로 인코딩
    const data = new TextEncoder().encode(messageToSend);

    // 데이터를 시리얼 포트로 쓰기
    await writer.write(data);

    // writer 객체의 락 해제 (다른 쓰기 작업 가능하도록)
    writer.releaseLock();

    console.log(&quot;Data sent:&quot;, messageToSend, data);
  } catch (error) {
    // 데이터 쓰기 중 오류 발생 시 로그 출력
    console.error(&quot;Error writing to serial port:&quot;, error);
  }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1262&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FBwrl/btsL26zn1Ze/I2BXzOOsvoNWLOU2oYvtzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FBwrl/btsL26zn1Ze/I2BXzOOsvoNWLOU2oYvtzk/img.png&quot; data-alt=&quot;요청한 데이터 값&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FBwrl/btsL26zn1Ze/I2BXzOOsvoNWLOU2oYvtzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFBwrl%2FbtsL26zn1Ze%2FI2BXzOOsvoNWLOU2oYvtzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1262&quot; height=&quot;112&quot; data-origin-width=&quot;1262&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;요청한 데이터 값&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;포트에서 데이터 읽기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;initialize 함수는 Web Serial API를 사용해 시리얼 포트를 초기화하고, 포트로부터 데이터를 읽는 로직을 구현합니다. 데이터는 TextDecoder를 사용해 문자열로 변환되며, React의 상태를 활용해 UI에서 확인할 수 있도록 처리됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;포트 요청 및 초기화&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;navigator.serial.requestPort()를 통해 사용자가 연결하려는 시리얼 포트를 선택합니다.&lt;/li&gt;
&lt;li&gt;선택된 포트는 port.open({ baudRate: 9600 })를 호출해 특정 전송 속도로 초기화합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Readable 스트림 가져오기&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;port.readable을 통해 포트의 Readable 스트림을 가져옵니다.&lt;/li&gt;
&lt;li&gt;getReader()를 호출해 데이터를 읽기 위한 Reader 객체를 생성합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 읽기&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;reader.read()를 통해 데이터를 읽습니다.&lt;/li&gt;
&lt;li&gt;반환값은 { value, done } 형식이며:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;value: Uint8Array 형식의 읽은 데이터&lt;/li&gt;
&lt;li&gt;done: 읽기가 종료되었는지 여부&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;value가 존재하면 TextDecoder를 사용해 Uint8Array 데이터를 문자열로 변환하고, 이전 데이터에 추가하여 상태로 저장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Reader 잠금 해제&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Reader는 단일 작업을 수행하기 위해 잠금(lock) 상태가 되므로, 작업이 끝나면 reader.releaseLock()을 호출해 잠금을 해제합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에러 처리&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;포트 요청 실패, 포트 해제, 권한 부족 등의 에러를 try...catch 블록에서 처리하여 디버깅 로그를 출력합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1738051158155&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const initialize = async () =&amp;gt; {
  try {
    // 시리얼 포트 요청 및 초기화
    // @ts-expect-error: navigator.serial은 TypeScript에서 아직 지원되지 않음
    const port = await navigator.serial.requestPort();
    setPort(port); // 선택한 포트를 상태로 저장
    await port.open({ baudRate: 9600 }); // 포트 열기

    // 데이터 읽기 설정
    const reader = port.readable?.getReader(); // 포트의 Readable 스트림 가져오기
    if (reader) {
      while (true) {
        const { value, done } = await reader.read(); // 데이터 읽기
        if (done) break; // 읽기가 종료되면 반복 종료
        if (value) {
          // Uint8Array 데이터를 문자열로 변환하고 상태 업데이트
          setReceivedData((prev) =&amp;gt; prev + new TextDecoder().decode(value));
        }
      }
      reader.releaseLock(); // Reader 잠금 해제
    }
  } catch (err) {
    console.error(&quot;포트 연결 실패:&quot;, err); // 에러 처리
  }
};&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Reference&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Web_Serial_API&quot;&gt;Web Serial API 공식문서&lt;/a&gt;&lt;br /&gt;-&amp;nbsp;&lt;a href=&quot;https://stackoverflow.com/questions/68806607/using-web-serial-with-reactjs&quot;&gt;https://stackoverflow.com/questions/68806607/using-web-serial-with-reactjs&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Coding/React &amp;amp; React-native</category>
      <author>호밀이</author>
      <guid isPermaLink="true">https://homile.tistory.com/441</guid>
      <comments>https://homile.tistory.com/441#entry441comment</comments>
      <pubDate>Sun, 26 Jan 2025 17:36:40 +0900</pubDate>
    </item>
    <item>
      <title>[Baekjoon]30970번 선택의 기로 - Javascript</title>
      <link>https://homile.tistory.com/435</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/30970&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/30970&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1710160740668&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;30970번: 선택의 기로&quot; data-og-description=&quot;첫 번째 줄에는 첫 번째 방법을 선택했을 때의 첫 번째로 고른 촉석루 미니어처의 품질과 가격, 두 번째로 고른 촉석루 미니어처의 품질과 가격을 공백으로 구분하여 순서대로 출력한다. 두 번&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/30970&quot; data-og-url=&quot;https://www.acmicpc.net/problem/30970&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bGHlMw/hyVxs7JCY0/yCZPKuUobjfHWbidc9oM6k/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/30970&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/30970&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bGHlMw/hyVxs7JCY0/yCZPKuUobjfHWbidc9oM6k/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;30970번: 선택의 기로&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 줄에는 첫 번째 방법을 선택했을 때의 첫 번째로 고른 촉석루 미니어처의 품질과 가격, 두 번째로 고른 촉석루 미니어처의 품질과 가격을 공백으로 구분하여 순서대로 출력한다. 두 번&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZivu3/btsFHrDApfY/LKRcZ69MVQfe3sKMVGmUf1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZivu3/btsFHrDApfY/LKRcZ69MVQfe3sKMVGmUf1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZivu3/btsFHrDApfY/LKRcZ69MVQfe3sKMVGmUf1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZivu3%2FbtsFHrDApfY%2FLKRcZ69MVQfe3sKMVGmUf1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;853&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;b&gt;[사진]&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;촉석루
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;품질이냐 가격이냐, 그것이 문제로다..&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;진주 나들이를 온 보선이는 기념품으로 촉석루 미니어처를 사기로 했다. 촉석루는 진주성에 있는 누각이며 경상남도 유형문화재 중 하나로, 진주성의 남쪽 지휘대로 사용됨과 동시에 논개가 촉석루 앞 의암에서 순국한 것으로 알려져 유명한 곳이다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;촉석루 미니어처를 사기 위해 기념품 가게에 들른 보선이는 놀라움을 금치 못했다. 왜냐하면, 가게에는 각양각색의 촉석루 미니어처가 진열되어 있었기 때문이다. 그리고 모든 촉석루 미니어처는 장인이 한 땀 한 땀 심혈을 기울여서 만들어서 그런지 품질과 가격이 천차만별이었고,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;품질과 가격이 전부 동일한 두 촉석루 미니어처는 없었다.&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;각양각색의 촉석루 미니어처를 본 보선이는 물욕이 폭발할 뻔했지만 가까스로 마음을 진정시키고, 촉석루 미니어처를 두 개만 사기로 했다. 보선이는 두 가지 방법으로 촉석루 미니어처를 골라보기로 했는데, 이는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;진열되어 있는 촉석루 미니어처 중에서 품질이 가장 높은 촉석루 미니어처를 골라 가져온다. 만약 그런 미니어처가 여러 개라면 가격이 가장 낮은 것을 골라 가져온다. 이 과정을 두 번 반복하는 것이 첫 번째 방법이다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;진열되어 있는 촉석루 미니어처 중에서 가격이 가장 낮은 촉석루 미니어처를 골라 가져온다. 만약 그런 미니어처가 여러 개라면 품질이 가장 높은 것을 골라 가져온다. 이 과정을 두 번 반복하는 것이 두 번째 방법이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;보선이가 각 방법에 따라 촉석루 미니어처들을 고르게 될 때 어떤 촉석루 미니어처들을 고르게 되는지 알아보자.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 줄에는 기념품 가게에 진열되어 있는 촉석루 미니어처의 개수&lt;span&gt; &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;N&lt;/span&gt;이 주어진다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;(2 &amp;le; N &amp;le; 100,000)&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;두 번째 줄부터&lt;span&gt; &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;N&lt;/span&gt;개의 줄에 걸쳐 가게에 진열되어 있는&lt;span&gt; &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;i&lt;/span&gt;번째 촉석루 미니어처 종류의 품질&lt;span&gt; &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;Q_i&lt;/span&gt;, 가격&lt;span&gt; &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;P_i&lt;/span&gt;가 공백으로 구분되어 주어진다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;(1&amp;le;Q_i,P_i&amp;le;10000)입력으로 주어지는 모든 수는 정수이다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 줄에는 첫 번째 방법을 선택했을 때의 첫 번째로 고른 촉석루 미니어처의 품질과 가격, 두 번째로 고른 촉석루 미니어처의 품질과 가격을 공백으로 구분하여 순서대로 출력한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;두 번째 줄에는 두 번째 방법을 선택했을 때의 첫 번째로 고른 촉석루 미니어처의 품질과 가격, 두 번째로 고른 촉석루 미니어처의 품질과 가격을 공백으로 구분하여 순서대로 출력한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;첫 번째 방법의 결과가 두 번째 방법의 결과에 영향을 미치지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;4
3 1
2 2
2 3
1 1
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;3 1 2 2
3 1 1 1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문제풀이(1)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;촉석루&amp;nbsp;미니어처&amp;nbsp;중&amp;nbsp;품질이&amp;nbsp;가장&amp;nbsp;높은&amp;nbsp;미니어처를&amp;nbsp;가져온다.&lt;br /&gt;2.&amp;nbsp;여러개일&amp;nbsp;경우&amp;nbsp;가격이&amp;nbsp;가장&amp;nbsp;낮은&amp;nbsp;것을&amp;nbsp;가져온다.&lt;br /&gt;3.&amp;nbsp;1-2를&amp;nbsp;1번더&amp;nbsp;반복한다.&lt;br /&gt;4.&amp;nbsp;촉석루&amp;nbsp;미니어처&amp;nbsp;중&amp;nbsp;가격이&amp;nbsp;가장&amp;nbsp;낮은&amp;nbsp;미니어처를&amp;nbsp;가져온다.&lt;br /&gt;5.&amp;nbsp;여러개일&amp;nbsp;경우&amp;nbsp;품질이&amp;nbsp;가장&amp;nbsp;높은&amp;nbsp;것을&amp;nbsp;가져온다.&lt;br /&gt;6.&amp;nbsp;4-5를&amp;nbsp;1번더&amp;nbsp;반복한다.&lt;br /&gt;&lt;br /&gt;1-3번을&amp;nbsp;반복했을&amp;nbsp;때의&amp;nbsp;결과를&amp;nbsp;추출하고,&amp;nbsp;4-6번을&amp;nbsp;반복한&amp;nbsp;결과를&amp;nbsp;추출한다.&lt;br /&gt;첫번째&amp;nbsp;output으로&amp;nbsp;1-3번을&amp;nbsp;반복했을&amp;nbsp;경우의&amp;nbsp;상위&amp;nbsp;2순위를&amp;nbsp;출력하고,&lt;br /&gt;두번째&amp;nbsp;output으로&amp;nbsp;4-6번을&amp;nbsp;반복했을&amp;nbsp;경우의&amp;nbsp;상위&amp;nbsp;2순위를&amp;nbsp;출력한다.&lt;br /&gt;정렬&amp;nbsp;문제기때문에&amp;nbsp;sort에&amp;nbsp;조건을&amp;nbsp;정확하게&amp;nbsp;달아주는&amp;nbsp;것이&amp;nbsp;중요하다.&lt;/p&gt;
&lt;pre id=&quot;code_1710160795128&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const filePath = process.platform === &quot;linux&quot; ? &quot;/dev/stdin&quot; : &quot;./input.txt&quot;;
const [N, ...input] = require(&quot;fs&quot;).readFileSync(filePath).toString().trim().split(&quot;\n&quot;);

const miniatures = input.map((el) =&amp;gt; el.split(&quot; &quot;).map(Number));

// 품질을 기준으로 내림차순, 가격 오름차순 정렬
const sortByQualityThenPrice = (a, b) =&amp;gt; {
  if (a[0] !== b[0]) return b[0] - a[0];
  return a[1] - b[1];
};

// 가격을 기준으로 오름차순, 품질 내림차순 정렬
const sortByPriceThenQuality = (a, b) =&amp;gt; {
  if (a[1] !== b[1]) return a[1] - b[1];
  return b[0] - a[0];
};

// 결과 출력 함수
const printTopTwo = (arr) =&amp;gt; {
  console.log(
    arr
      .slice(0, 2)
      .map((item) =&amp;gt; item.join(&quot; &quot;))
      .join(&quot; &quot;)
  );
};

// 첫 번째 정렬 및 출력
miniatures.sort(sortByQualityThenPrice);
printTopTwo(miniatures);

// 두 번째 정렬 및 출력
miniatures.sort(sortByPriceThenQuality);
printTopTwo(miniatures);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm</category>
      <author>호밀이</author>
      <guid isPermaLink="true">https://homile.tistory.com/435</guid>
      <comments>https://homile.tistory.com/435#entry435comment</comments>
      <pubDate>Mon, 11 Mar 2024 21:40:56 +0900</pubDate>
    </item>
    <item>
      <title>[Baekjoon]31474번 양갈래 짝 맞추기 - Javascript</title>
      <link>https://homile.tistory.com/434</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/31474&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/31474&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1710159491445&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;31474번: 양갈래 짝 맞추기&quot; data-og-description=&quot;첫째 줄에 양갈래 손님의 수 $N$이 주어진다. ($2 \leq N \leq 28$, $N$은 짝수)&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/31474&quot; data-og-url=&quot;https://www.acmicpc.net/problem/31474&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/be1l19/hyVxpwp67m/ZoOzkEVSXncW0Ku92O6eF1/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/31474&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/31474&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/be1l19/hyVxpwp67m/ZoOzkEVSXncW0Ku92O6eF1/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;31474번: 양갈래 짝 맞추기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 양갈래 손님의 수 $N$이 주어진다. ($2 \leq N \leq 28$, $N$은 짝수)&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;시현이 카페에 양갈래 손님들이 들어가려고 한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;양갈래 손님들은 양갈래를 너무 좋아하는 나머지 두 명씩 모여 있어 총 인원은 짝수이다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;시현이 카페에는 두 명씩 앉을 수 있는 테이블이 충분히 많이 있고, 양갈래 손님들은 한 테이블에 두 명씩 앉기로 하였다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;그런 양갈래 손님들을 맞이하게 된 시현이는 갑자기 궁금증이 생겼다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;손님들이 앉는 경우의 수를 세는 조건이 다음과 같을 때, 양갈래 손님들이 모두 앉을 수 있는 방법의 수는 몇 가지가 있을까?&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;테이블의 좌석을 구분하지 않는다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;한 테이블에서 손님 A와 손님 B가 앉는 경우, 손님 B와 손님 A가 앉는 경우는 같은 경우이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;각각의 테이블 또한 구분하지 않는다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1번 테이블에 손님 A, B가 앉고, 2번 테이블에 손님 C, D가 앉는 것과, 1번 테이블에 손님 C, D가 앉고, 2번 테이블에 손님 A, B가 앉는 것은 서로 같은 경우이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 양갈래 손님의 수&lt;span&gt;&amp;nbsp;&lt;/span&gt;�&lt;span aria-hidden=&quot;true&quot;&gt;$N$&lt;/span&gt;이 주어진다. (2&amp;le;�&amp;le;28&lt;span aria-hidden=&quot;true&quot;&gt;$2 \leq N \leq 28$&lt;/span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;�&lt;span aria-hidden=&quot;true&quot;&gt;$N$&lt;/span&gt;은 짝수)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 양갈래 손님들이 앉을 수 있는 경우의 수를 출력한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;연산 중 32비트 정수형 타입의 표현 범위를 초과할 수 있으므로 오버플로우에 주의한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;2
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;1
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 2&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-2&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;4
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 2&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-2&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문제풀이(1)&lt;/h4&gt;
&lt;pre id=&quot;code_1710159534068&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const filePath = process.platform === &quot;linux&quot; ? &quot;/dev/stdin&quot; : &quot;./input.txt&quot;;
const N = Number(require(&quot;fs&quot;).readFileSync(filePath).toString().trim());

let result = 1;

for (let i = N; i &amp;gt; 0; i -= 2) {
  result *= (i * (i - 1)) / 2;
  result /= i / 2;
}

console.log(result);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Algorithm</category>
      <author>호밀이</author>
      <guid isPermaLink="true">https://homile.tistory.com/434</guid>
      <comments>https://homile.tistory.com/434#entry434comment</comments>
      <pubDate>Mon, 11 Mar 2024 21:18:58 +0900</pubDate>
    </item>
    <item>
      <title>[React]React 19?</title>
      <link>https://homile.tistory.com/433</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;React 19&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React 공식 블로그에 24.02.15에 업데이트 진행사항이 올라왔습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주요 내용은 크게 &lt;b&gt;React Compiler, Actions, New Features in React Canary&lt;/b&gt;입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;React Compiler&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식블로그에 따르면 React를 위한 컴파일러가 개발중이며 오픈 소스 릴리즈를 준비하고 있다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React의 상태를 관리할 때 의도와는 달리 많은 리랜더링이 발생하는 경우가 있는데 이것을 해결하기 위해서는 useMemo, useCallback등과 같은 메모이제이션 방식을 통해 리랜더링을 줄이는 방법을 사용했는데 이를 자동화으로 최적화할 수 있도록 되어있다고 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Actions&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드에서 보이는 것과 같이 form에 action이 추가 되었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;action&lt;/b&gt;은 동기, 비동기식으로 모두 동작하며, 데이터를 제출할 때 &lt;b&gt;useFormStatus, useFormState&lt;/b&gt;를 사용하여 데이터의 응답 및 에러처리와 같은 작업을 처리하기 쉽도록 도와준다고 합니다.&lt;br /&gt;또, 한가지 추가되는 훅으로는 &lt;b&gt;useOptimistic&lt;/b&gt;가 있습니다. useOptimistic은 말그대로 낙관적인 상태를 가져올 때 사용할 수 있다고 되어있습니다. 실제로 완료되는데 시간이 걸리더라도 사용자에게 결과를 즉시 보여줄 수 있도록 도와준다고 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1709133282533&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useFormStatus } from &quot;react-dom&quot;;
import { submitForm } from &quot;./actions.js&quot;;

function Submit() {
  const { pending } = useFormStatus();
  return (
    &amp;lt;button type=&quot;submit&quot; disabled={pending}&amp;gt;
      {pending ? &quot;Submitting...&quot; : &quot;Submit&quot;}
    &amp;lt;/button&amp;gt;
  );
}

function Form({ action }) {
  return (
    &amp;lt;form action={action}&amp;gt;
      &amp;lt;Submit /&amp;gt;
    &amp;lt;/form&amp;gt;
  );
}

export default function App() {
  return &amp;lt;Form action={submitForm} /&amp;gt;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;New&amp;nbsp;Features&amp;nbsp;in&amp;nbsp;React&amp;nbsp;Canary&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Directives&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;use client&quot;와 &quot;use server&quot;를 사용하여 Next.js와 같이 서버, 클라이언트 어느 부분에서 동작하는지에 대한 지시자를 설정할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Document&amp;nbsp;Metadata&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;lt;title&amp;gt;, &amp;lt;meta&amp;gt;, and metadata &amp;lt;link&amp;gt;와 같은 태그를 컴포넌트에 추가할 수 있습니다. 이전에는 React Helmet을 사용하던 작업을 지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Asset&amp;nbsp;Loading&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Suspense를 &amp;lt;style&amp;gt;, &amp;lt;link&amp;gt;, &amp;lt;script&amp;gt; 태그의 요소들이 표시될 준비가 되어 있는지 판단할 수 있도록 하였으며, 리소스가 언제 로드되고 초기화될지에 대한 제어를 할 수 있도록 preload와 preinit와 같은 새로운 리소스 로딩 API를 추가하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Actions&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 작성한 Actions 파트의 부분과 같습니다. &amp;lt;form&amp;gt;태그에 action을 추가하고, useFormStatus를 사용하여 상태를 관리하며, useFormState로 결과를 처리합니다. 또한, useOptimistic으로 UI를 낙관적으로 업데이트할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한동안 취업준비를 하면서 이전에 프론트엔드 개발 공부를 하느라 기술 업데이트 관련 내용을 찾아보는 것을 못했던 것 같았다. 그래서 react 공식 문서와 블로그를 보니 24.2.15 날짜로 새로운 글이 올라온 것을 보았고 유튜브에는 이미 내용들이 정리되어 많이 올라와 있었다. 추후 react 19로 버전업을 하는 경우에 어떤점을 학습해야하는지 어떤점이 좋아지는지에 대해 알고 있다면 프로젝트에 적용하는데 많으 도움이 될 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 내용들을 봤을 때는 Next.js에서 사용하던 것들을 React에서도 사용할 수 있도록 많은 기능이 추가되는 것 같다. Next.js의 기능 뿐만 아니라 React Helmet, TanstackQuery등과 같은 일부 라이브러리의 기능을 사용할 수 있다면 라이브러리에 대한 의존성은 낮출 수 있을 거란 생각이 들었다. 하지만, 언제나 개발시장은 변화하고 있기 때문에 변화에 맞춰나가는 것이 가장 중요하다고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 거의 모든 웹 개발 시장이 React로 되어 있는데 이도 사실은 React에 많은 의존을 하고 있다는게 느껴지니 바닐라JS도 다시 학습해야겠다는 생각이 들었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- React 공식 블로그: &lt;a href=&quot;https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024&quot;&gt;https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024&lt;/a&gt;&lt;/p&gt;</description>
      <category>Coding/React &amp;amp; React-native</category>
      <author>호밀이</author>
      <guid isPermaLink="true">https://homile.tistory.com/433</guid>
      <comments>https://homile.tistory.com/433#entry433comment</comments>
      <pubDate>Thu, 29 Feb 2024 01:02:24 +0900</pubDate>
    </item>
    <item>
      <title>[Baekjoon]11899번 괄호 끼워넣기 - Javascript</title>
      <link>https://homile.tistory.com/432</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11899&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/11899&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1709131252885&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;11899번: 괄호 끼워넣기&quot; data-og-description=&quot;첫 번째 줄에 S를 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 출력합니다. 불가능한 경우는 주어지지 않습니다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/11899&quot; data-og-url=&quot;https://www.acmicpc.net/problem/11899&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Pu3f3/hyVuqHBsSl/ROV525LDmF0Kn6DVRBF3MK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11899&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/11899&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Pu3f3/hyVuqHBsSl/ROV525LDmF0Kn6DVRBF3MK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;11899번: 괄호 끼워넣기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 줄에 S를 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 출력합니다. 불가능한 경우는 주어지지 않습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;심심한 승현이는 너무 심심한 나머지 올바른 괄호열을 가지고 놀고 있었습니다.&lt;/p&gt;
&lt;pre class=&quot;clojure&quot; style=&quot;background-color: #f5f5f5; color: #333333;&quot;&gt;&lt;code&gt;(()(()))()()&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;그러다가 어쩌다 보니 괄호열을 부러뜨렸습니다.&lt;/p&gt;
&lt;pre class=&quot;clojure&quot; style=&quot;background-color: #f5f5f5; color: #333333;&quot;&gt;&lt;code&gt;(()    ((    )))()    ()&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;크게 낙담한 승현이는 노력해 보았지만, 대부분이 부러져 버려 단 한 부분만 재사용할 수 있다는 것을 깨닫게 되었습니다.&lt;/p&gt;
&lt;pre class=&quot;gcode&quot; style=&quot;background-color: #f5f5f5; color: #333333;&quot;&gt;&lt;code&gt;)))()&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;승현이는 이 괄호열을 가지고 놀려고 했으나 올바른 괄호열이 아니기 때문에 행복하지 않았습니다. 이를 보던 지학이는 승현이에게 &amp;ldquo;그러면 앞과 뒤에 적절하게 괄호를 붙이면 올바른 괄호열이 되지 않을까?&amp;rdquo;라고 했고, 승현이는 조금 생각한 뒤 그렇게 하기로 했습니다. 예를 들어, 위의 올바르지 않은 괄호열의 경우 앞에 여는 괄호 3개를 붙이면 올바른 괄호열이 됩니다.&lt;/p&gt;
&lt;pre class=&quot;clojure&quot; style=&quot;background-color: #f5f5f5; color: #333333;&quot;&gt;&lt;code&gt;((()))()&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;그러나 괄호열을 사서 붙이는 데에는 돈이 들고 많이 붙일수록 놀기가 불편해지기 때문에, 승현이는 가능한 한 괄호열을 적게 추가하려고 합니다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;승현이가 망가뜨리고 사용 가능한 올바르지 않은 괄호열이 주어질 때, 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 구하는 프로그램을 작성하세요.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 줄에 올바르지 않은 괄호열 S가 주어집니다. S의 길이는 1 이상 50 이하입니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 줄에 S를 올바른 괄호열으로 만들기 위해 앞과 뒤에 붙여야 할 괄호의 최소 개수를 출력합니다. 불가능한 경우는 주어지지 않습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;gcode&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;)))()
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;3
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 2&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-2&quot; class=&quot;gcode&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;)(()
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 2&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-2&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;2&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문제풀이(1)&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음생각은&amp;nbsp;단순하게&amp;nbsp;괄호의&amp;nbsp;갯수만&amp;nbsp;파악하여&amp;nbsp;다른것을&amp;nbsp;하면되지&amp;nbsp;않을까란&amp;nbsp;생각을&amp;nbsp;했지만&lt;br /&gt;예제&amp;nbsp;2번을&amp;nbsp;보고&amp;nbsp;괄호의&amp;nbsp;갯수로를&amp;nbsp;파악할&amp;nbsp;수&amp;nbsp;없다는&amp;nbsp;것을&amp;nbsp;알게&amp;nbsp;되었다.&lt;br /&gt;괄호가&amp;nbsp;맞는지&amp;nbsp;맞지&amp;nbsp;않는지&amp;nbsp;여부를&amp;nbsp;파악하는&amp;nbsp;것이&amp;nbsp;먼저라고&amp;nbsp;생각했다.&lt;br /&gt;&lt;br /&gt;입력받은&amp;nbsp;괄호를&amp;nbsp;순회하며&amp;nbsp;여는&amp;nbsp;괄호가&amp;nbsp;나올&amp;nbsp;경우&amp;nbsp;leftBracket에&amp;nbsp;괄호를&amp;nbsp;추가해주고&lt;br /&gt;닫는&amp;nbsp;괄호가&amp;nbsp;나올&amp;nbsp;경우&amp;nbsp;leftBracket이&amp;nbsp;빈&amp;nbsp;배열이&amp;nbsp;아니라면&amp;nbsp;짝이&amp;nbsp;맞다는&amp;nbsp;것이기&amp;nbsp;때문에&amp;nbsp;pop을&amp;nbsp;해준다.&lt;br /&gt;만약,&amp;nbsp;leftBracket이&amp;nbsp;빈&amp;nbsp;배열이라면&amp;nbsp;rigthBracket에&amp;nbsp;괄호를&amp;nbsp;추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1709131305460&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const filePath = process.platform === &quot;linux&quot; ? &quot;/dev/stdin&quot; : &quot;./input.txt&quot;;
const arr = require(&quot;fs&quot;).readFileSync(filePath).toString().trim().split(&quot;&quot;);

const leftBracket = [];
const rightBracket = [];

for (let bracket of arr) {
  if (bracket === &quot;(&quot;) {
    leftBracket.push(bracket);
  } else if (bracket === &quot;)&quot;) {
    if (leftBracket.length &amp;gt; 0) {
      leftBracket.pop();
    } else {
      rightBracket.push(bracket);
    }
  }
}

console.log(leftBracket.length + rightBracket.length);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm</category>
      <author>호밀이</author>
      <guid isPermaLink="true">https://homile.tistory.com/432</guid>
      <comments>https://homile.tistory.com/432#entry432comment</comments>
      <pubDate>Wed, 28 Feb 2024 23:41:50 +0900</pubDate>
    </item>
    <item>
      <title>[Baekjoon]17254번 키보드 이벤트 - Javascript</title>
      <link>https://homile.tistory.com/431</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/17254&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/17254&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1709018617414&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;17254번: 키보드 이벤트&quot; data-og-description=&quot;첫째 줄에 연결된 키보드의 개수&amp;nbsp;N과, 키보드를 누르게 될 횟수&amp;nbsp;M이 주어진다. (1 &amp;le; N,&amp;nbsp;M &amp;le; 1,000) 다음&amp;nbsp;M개의 줄에 정수 a,&amp;nbsp;b와 문자 c가 주어진다. 이는&amp;nbsp;a번 키보드로,&amp;nbsp;b초에 문자 c가 적힌 키를 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/17254&quot; data-og-url=&quot;https://www.acmicpc.net/problem/17254&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/S3ZQD/hyVqi47Gj7/IKltreQGgKgbGpPqxAu551/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/17254&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/17254&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/S3ZQD/hyVqi47Gj7/IKltreQGgKgbGpPqxAu551/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;17254번: 키보드 이벤트&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 연결된 키보드의 개수&amp;nbsp;N과, 키보드를 누르게 될 횟수&amp;nbsp;M이 주어진다. (1 &amp;le; N,&amp;nbsp;M &amp;le; 1,000) 다음&amp;nbsp;M개의 줄에 정수 a,&amp;nbsp;b와 문자 c가 주어진다. 이는&amp;nbsp;a번 키보드로,&amp;nbsp;b초에 문자 c가 적힌 키를&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;키보드에서 어떤 키를 누르면 어떤 키가 눌러졌는지 컴퓨터에 전송되고, 컴퓨터에서는 키가 눌러진 순서대로 화면에 출력된다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;승지는 팀 과제로 보고서 100장을 작성해야 하는 데, 마감 시간이 얼마 남지 않아서 팀원에게 도움을 요청하였다. 하지만 컴퓨터가 하나뿐이라 보고서를 동시에 작성할 수 없었다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;주변을 둘러보니 쓰지 않는 키보드 여러 개가 바닥에서 굴러다니는 것을 보았다. 급한 대로 컴퓨터에 키보드 여러 개를 연결해서 타자 속도를 올리기로 했다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;문제는 원하는 문장을 작성하기 위해서는 서로 호흡을 잘 맞춰야 하는데, 키보드의 동작 원리를 아직 알지 못했던 승지는 어떤 결과가 출력될지 알 수 없었다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;승지는 팀원&amp;nbsp;N명에게&amp;nbsp;N개의 키보드를 나눠주고 전부 컴퓨터에 연결했다. 각자 어느 시간에 어떤 키를 누를지를 미리 정한다면, 어떤 결과가 화면에 출력될 것인지 알아내고자 한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;키보드의 번호는 컴퓨터에 연결된 순서대로 1번 키보드, 2번 키보드, .... N번 키보드이다. 동시에 여러 키보드에서 키를 누른다면 번호가 작은 키보드에서 누른 키가 먼저 출력되지만, 하나의 키보드에서 여러 개의 키를 동시에 누를 수는 없다. 즉, 하나의 키보드에서 각 키를 누른 시간은 모두 다르다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 연결된 키보드의 개수&amp;nbsp;N과, 키보드를 누르게 될 횟수&amp;nbsp;M이 주어진다. (1 &amp;le; N,&amp;nbsp;M &amp;le; 1,000)&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;다음&amp;nbsp;M개의 줄에 정수 a,&amp;nbsp;b와 문자 c가 주어진다. 이는&amp;nbsp;a번 키보드로,&amp;nbsp;b초에 문자 c가 적힌 키를 누를 것이라는 의미이다. (1 &amp;le; a &amp;le; N,&amp;nbsp;0 &amp;le; b &amp;le; 1,000,000)&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;키보드에는 알파벳 대문자와 숫자키만 존재한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;모든 입력이 끝난 후에 화면에 출력될 결과를 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;3 5
1 0 A
2 1 P
1 2 L
2 4 E
3 0 P
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;ebnf&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;APPLE
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 2&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-2&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;2 7
1 6 B
1 1 A
1 0 L
1 3 D
2 8 G
2 6 U
2 3 Y
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 2&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-2&quot; class=&quot;ebnf&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;LADYBUG&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문제풀이(1)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a키보드,&amp;nbsp;b초,&amp;nbsp;c알파벳이다.&amp;nbsp;이때,&amp;nbsp;같은&amp;nbsp;시간에&amp;nbsp;입력했다면&amp;nbsp;키보드의&amp;nbsp;번호가&amp;nbsp;낮은&amp;nbsp;알파벳을&amp;nbsp;먼저&amp;nbsp;출력한다.&lt;br /&gt;sort에&amp;nbsp;조건을&amp;nbsp;추가하여&amp;nbsp;시간을&amp;nbsp;오름차순으로&amp;nbsp;정렬하고&amp;nbsp;같을&amp;nbsp;경우&amp;nbsp;키보드를&amp;nbsp;오름차순으로&amp;nbsp;정렬한&amp;nbsp;뒤&amp;nbsp;알파벳을&amp;nbsp;출력한다.&lt;/p&gt;
&lt;pre id=&quot;code_1709020741514&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const filePath = process.platform === &quot;linux&quot; ? &quot;/dev/stdin&quot; : &quot;./input.txt&quot;;
const input = require(&quot;fs&quot;).readFileSync(filePath).toString().trim().split(&quot;\n&quot;);

input.shift();

const keyboards = input.map((el) =&amp;gt; el.split(&quot; &quot;)).sort((a, b) =&amp;gt; +a[1] - +b[1] || +a[0] - +b[0]);

console.log(keyboards.map((el) =&amp;gt; el[2]).join(&quot;&quot;));&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm</category>
      <author>호밀이</author>
      <guid isPermaLink="true">https://homile.tistory.com/431</guid>
      <comments>https://homile.tistory.com/431#entry431comment</comments>
      <pubDate>Tue, 27 Feb 2024 16:59:08 +0900</pubDate>
    </item>
    <item>
      <title>[Baekjoon]1835번 카드 - Javascript</title>
      <link>https://homile.tistory.com/430</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1835&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1835&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1708956709585&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;1835번: 카드&quot; data-og-description=&quot;첫 번째 줄에 카드의 개수 N(1 &amp;le; N &amp;le; 1,000)이 주어진다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1835&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1835&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/27m56/hyVqnd2Kih/29uHyJElTQeaVbOZ48r2s0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1835&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1835&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/27m56/hyVqnd2Kih/29uHyJElTQeaVbOZ48r2s0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;1835번: 카드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 줄에 카드의 개수 N(1 &amp;le; N &amp;le; 1,000)이 주어진다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;1부터 N까지의 숫자가 적힌 카드가 있다. 찬유는 이 카드를 가지고 마술을 하려 한다. 마술을 하는 순서는 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;먼저 1부터 N까지의 숫자가 적힌 카드에서 첫 번째 카드를 가장 뒤로 옮긴다. 그러고 나서 첫 번째 카드를 책상 위에 올려놓는다. 그런데 그 카드는 1이 되어야 한다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;그리고 남은 카드 중에서 첫 번째 카드를 가장 뒤로 옮기고, 또 가장 앞에 있는 카드를 가장 뒤로 옮긴다.(2번 반복) 그리고 가장 앞에 있는 카드를 책상 위에 올려놓는다. 그런데 그 카드는 2가 되어야 한다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;또 남은 카드 중에서 첫 번째 카드를 가장 뒤로 옮기고... (3번 반복) 그리고 가장 앞에 있는 카드를 책상위에 올려놓는데 그것은 3이 된다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;또 남은 카드 중에서 첫 번째 카드를 가장 뒤로 옮기고.. (4번 반복) 그리고 가장 앞에 있는 카드를 책상 위에 올려놓는데 그것은 4이다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;위 과정을 계속 반복하여 N번 카드만 남을 때 까지 반복한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;위와 같은 카드를 하려면 미리 카드의 순서를 알고 있어야 한다. 카드의 개수 N이 주어져 있을 때 위의 마술을 하기 위한 카드의 초기 순서를 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 줄에 카드의 개수 N(1 &amp;le; N &amp;le; 1,000)이 주어진다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 줄부터 N번째 줄까지 차례로 카드의 순서를 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;4
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;2 1 4 3&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문제풀이(1)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제에 나와있는 방식을 반대로 진행하면 초기 카드의 세팅값을 찾을 수 있다.&lt;br /&gt;1.&amp;nbsp;N&amp;nbsp;번&amp;nbsp;카드가&amp;nbsp;있다.&amp;nbsp;(N&amp;nbsp;=&amp;nbsp;4)&lt;br /&gt;2.&amp;nbsp;N&amp;nbsp;-&amp;nbsp;1,&amp;nbsp;N번의&amp;nbsp;카드가&amp;nbsp;있다.&amp;nbsp;가장&amp;nbsp;뒤에&amp;nbsp;있는&amp;nbsp;카드를&amp;nbsp;가장&amp;nbsp;앞으로&amp;nbsp;옮긴다.(N회&amp;nbsp;반복)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[3,&amp;nbsp;4]&amp;nbsp;-&amp;gt;&amp;nbsp;[4,&amp;nbsp;3]&amp;nbsp;-&amp;gt;&amp;nbsp;[3,&amp;nbsp;4]&amp;nbsp;-&amp;gt;&amp;nbsp;[4,&amp;nbsp;3]&lt;br /&gt;3.&amp;nbsp;[4,&amp;nbsp;3]의&amp;nbsp;카드&amp;nbsp;배열에&amp;nbsp;N&amp;nbsp;-&amp;nbsp;2를&amp;nbsp;맨&amp;nbsp;앞에&amp;nbsp;추가한다.&amp;nbsp;가장&amp;nbsp;뒤에&amp;nbsp;있는&amp;nbsp;카드를&amp;nbsp;가장&amp;nbsp;앞으로&amp;nbsp;옮긴다.(N&amp;nbsp;-&amp;nbsp;1회&amp;nbsp;반복)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[2,&amp;nbsp;4,&amp;nbsp;3]&amp;nbsp;-&amp;gt;&amp;nbsp;[3,&amp;nbsp;2,&amp;nbsp;4]&amp;nbsp;-&amp;gt;&amp;nbsp;[4,&amp;nbsp;3,&amp;nbsp;2]&lt;br /&gt;4.&amp;nbsp;[4,&amp;nbsp;3,&amp;nbsp;2]의&amp;nbsp;카드&amp;nbsp;배열에&amp;nbsp;N&amp;nbsp;-&amp;nbsp;3을&amp;nbsp;맨&amp;nbsp;앞에&amp;nbsp;추가한다.&amp;nbsp;가장&amp;nbsp;뒤에&amp;nbsp;있는&amp;nbsp;카드를&amp;nbsp;가장&amp;nbsp;앞으로&amp;nbsp;옮긴다.(N&amp;nbsp;-&amp;nbsp;2회&amp;nbsp;반복)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[1,&amp;nbsp;4,&amp;nbsp;3,&amp;nbsp;2]&amp;nbsp;-&amp;gt;&amp;nbsp;[2,&amp;nbsp;1,&amp;nbsp;4,&amp;nbsp;3]&lt;br /&gt;5.&amp;nbsp;마지막으로&amp;nbsp;추가된&amp;nbsp;배열[2,&amp;nbsp;1,&amp;nbsp;4,&amp;nbsp;3]을&amp;nbsp;출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1708956766396&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const filePath = process.platform === &quot;linux&quot; ? &quot;/dev/stdin&quot; : &quot;./input.txt&quot;;
const N = Number(require(&quot;fs&quot;).readFileSync(filePath).toString().trim());

// N번 카드 추가
const arr = [N];

// N - 1부터 1까지 반복
for (let i = N - 1; i &amp;gt; 0; i--) {
  // i번째 값을 배열의 첫번째에 추가한다.
  arr.unshift(i);

  // i번 만큼 순회한다.
  for (let j = 0; j &amp;lt; i; j++) {
    // 마지막 카드를 추출한다.
    const lastCard = arr.pop();
    // 마지막 카드를 맨앞으로 옮긴다.
    arr.unshift(lastCard);
  }
}

console.log(arr.join(&quot; &quot;));&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm</category>
      <author>호밀이</author>
      <guid isPermaLink="true">https://homile.tistory.com/430</guid>
      <comments>https://homile.tistory.com/430#entry430comment</comments>
      <pubDate>Mon, 26 Feb 2024 23:12:51 +0900</pubDate>
    </item>
    <item>
      <title>[Baekjoon]1590번 캠프가는 영식 - Javascript</title>
      <link>https://homile.tistory.com/429</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1590&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1590&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1708694059445&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;1590번: 캠프가는 영식&quot; data-og-description=&quot;예제 1의 경우 150분, 200분, 250분, ..., 600분에 한 대씩 버스가 출발한다. 따라서 영식이는 300분에 버스를 타면 된다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1590&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1590&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dGAcFv/hyVmRUJvmv/tKJb2q1wwHa2YbB4GS5xd0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1590&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1590&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dGAcFv/hyVmRUJvmv/tKJb2q1wwHa2YbB4GS5xd0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;1590번: 캠프가는 영식&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;예제 1의 경우 150분, 200분, 250분, ..., 600분에 한 대씩 버스가 출발한다. 따라서 영식이는 300분에 버스를 타면 된다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;영식이는 민식이와 함게 고속버스를 타고 캠프를 가야 하지만, 민식이는 영식이를 깨우지 않고 혼자 버스를 타고 캠프에 가버렸다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;영식이는 혼자 고속버스터미널까지 가서 캠프에 오려고 한다. 터미널에는 캠프 장소까지 운행하는 N가지의 버스가 있다. 각각의 버스는 시작 시각, 간격, 대수의 정보를 가지고 있다. 예를 들어, 어떤 버스의 시작 시각이 특점 시점을 기준으로 10분 후이고, 간격은 10분이고, 대수가 5대이면, 이 버스는 10분, 20분, 30분, 40분, 50분에 한 대씩 출발한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;영식이는 버스터미널에 T분에 도착했다. 영식이가 버스를 타려면 최소 몇 분을 더 기다려야 하는지 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 버스의 개수 N과 영식이가 버스터미널에 도착하는 시간 T가 주어진다. 둘째 줄부터 총 N개의 줄에 각 버스의 시작 시각 Si, 간격 Ii, 대수 Ci가 공백을 사이에 두고 주어진다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 영식이가 기다려야 하는 시간을 출력한다. 영식이가 도착하는 동시에 버스가 출발하면 정답은 0이다. 만약 버스가 없어서 캠프에 갈 수 없으면 -1을 출력한다. 정답은 231보다 작다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;제한&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_limit&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1 &amp;le; N &amp;le; 50&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1 &amp;le; T &amp;le; 1,000,000&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1 &amp;le; Si&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;le; 1,000,000&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1 &amp;le; Ii&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;le; 10,000&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1 &amp;le; Ci&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;le; 100&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;1 285
150 50 10
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;15
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 2&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-2&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;1 123456
123456 10000 1
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 2&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-2&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;0
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 3&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-3&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;3 1
270758 196 67
904526 8930 66
121164 3160 56
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 3&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-3&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;121163
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 4&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-4&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;3 1000000
718571 2557 74
480573 9706 54
16511 6660 90
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 4&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-4&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;-1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문제풀이(1)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버스의&amp;nbsp;개수&amp;nbsp;N,&amp;nbsp;영식이가&amp;nbsp;버스터미널에&amp;nbsp;도착하는&amp;nbsp;시간&amp;nbsp;T&lt;br /&gt;버스의&amp;nbsp;시작&amp;nbsp;시각&amp;nbsp;S,&amp;nbsp;간격&amp;nbsp;I,&amp;nbsp;대수&amp;nbsp;C&lt;br /&gt;대수&amp;nbsp;만큼&amp;nbsp;반복순회를&amp;nbsp;하며&amp;nbsp;버스의&amp;nbsp;시작&amp;nbsp;시각&amp;nbsp;+&amp;nbsp;간격&amp;nbsp;*&amp;nbsp;반복횟수(j)를&amp;nbsp;하면&amp;nbsp;버스의&amp;nbsp;간격별&amp;nbsp;버스의&amp;nbsp;시간을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있다.&lt;br /&gt;버스의&amp;nbsp;간격별&amp;nbsp;시간이&amp;nbsp;영식이가&amp;nbsp;버스터미널에&amp;nbsp;도착하는&amp;nbsp;시간인&amp;nbsp;T&amp;nbsp;보다&amp;nbsp;크거나&amp;nbsp;같다면&amp;nbsp;반복순회를&amp;nbsp;종료한다.&lt;br /&gt;영식이가&amp;nbsp;버스터미널에&amp;nbsp;도착하는&amp;nbsp;시간과&amp;nbsp;마지막&amp;nbsp;버스의&amp;nbsp;간격별&amp;nbsp;시간중&amp;nbsp;작은&amp;nbsp;값을&amp;nbsp;찾는다.&lt;br /&gt;가장&amp;nbsp;작은&amp;nbsp;값을&amp;nbsp;찾았다면&amp;nbsp;가장&amp;nbsp;작은&amp;nbsp;값&amp;nbsp;-&amp;nbsp;영식이가&amp;nbsp;버스터미널에&amp;nbsp;도착하는&amp;nbsp;시간을&amp;nbsp;계산하면&amp;nbsp;기다려야하는&amp;nbsp;시간이&amp;nbsp;나온다.&lt;/p&gt;
&lt;pre id=&quot;code_1708694108937&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const filePath = process.platform === &quot;linux&quot; ? &quot;/dev/stdin&quot; : &quot;./input.txt&quot;;
const input = require(&quot;fs&quot;).readFileSync(filePath).toString().trim().split(&quot;\n&quot;);

const [N, T] = input.shift().split(&quot; &quot;).map(Number);
let answer = Infinity;

input.forEach((line) =&amp;gt; {
  const [S, I, C] = line.split(&quot; &quot;).map(Number);

  const busDispatches = Array.from({ length: C }, (_, i) =&amp;gt; S + I * i);
  const validDispatches = busDispatches.filter((busDispatch) =&amp;gt; busDispatch &amp;gt;= T);

  if (validDispatches.length) answer = Math.min(answer, ...validDispatches);
});

console.log(answer !== Infinity ? answer - T : -1);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm</category>
      <author>호밀이</author>
      <guid isPermaLink="true">https://homile.tistory.com/429</guid>
      <comments>https://homile.tistory.com/429#entry429comment</comments>
      <pubDate>Fri, 23 Feb 2024 22:15:14 +0900</pubDate>
    </item>
    <item>
      <title>[Baekjoon]14381번 숫자세는 양 (Small) - Javascript</title>
      <link>https://homile.tistory.com/428</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14381&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/14381&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1708610692071&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;14381번: 숫자세는 양 (Small)&quot; data-og-description=&quot;예제 입출력 1번에 대해서, 2 &amp;times; 0 = 0, 3 &amp;times; 0 = 0 등등으로 이어지므로, 블리트릭스는 0외에는 다른 숫자를 기록할 수 없을 것이며, 따라서 영원히 잠에 들 수 없다. 예제 입출력 2번의 경우, 1, 2, 3, 4, &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/14381&quot; data-og-url=&quot;https://www.acmicpc.net/problem/14381&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cvT72H/hyVmZdXyEh/hscRwZh3WFlWb2ED4oY8H1/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14381&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/14381&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cvT72H/hyVmZdXyEh/hscRwZh3WFlWb2ED4oY8H1/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;14381번: 숫자세는 양 (Small)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;예제 입출력 1번에 대해서, 2 &amp;times; 0 = 0, 3 &amp;times; 0 = 0 등등으로 이어지므로, 블리트릭스는 0외에는 다른 숫자를 기록할 수 없을 것이며, 따라서 영원히 잠에 들 수 없다. 예제 입출력 2번의 경우, 1, 2, 3, 4,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;블리트릭스라는 양은 더 빨리 잠을 들기 위한 전략을 세웠다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;먼저, 숫자 N을 뽑는다. 그리고 N, 2 &amp;times; N, 3 &amp;times; N 등을 떠올린다. 숫자를 떠올릴 때 마다, 그 숫자의 모든 자리수의 숫자들을 적어놓는데, 이미 적은 숫자는 또 적지 않는다. 0에서 9까지의 모든 숫자가 적히게 되면 잠이 든다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;블리트릭스는 N에서 시작해서 i &amp;times; N 후에는 (i + 1) &amp;times; N을 떠올리게 된다. 예를 들어 N = 1692 일 경우, 다음 과 같이 진행된다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;N = 1692. 1, 2, 6, 9가 기록된다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;2N = 3384. 1, 2, 3, 4, 6, 8, 9가 기록된다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;3N = 5076. 모든 수가 기록되고, 잠에 빠진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;블리트릭스가 잠에 빠지는 수는 무엇인가? 영원히 잠에 들 수 없다면 INSOMNIA라고 출력하라.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 행은 케이스의 개수, T이다. 다음 행부터는 T개의 케이스들이 나온다. 각 케이스는 블리트릭스가 고른 하나의 숫자 N으로 구성된다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;제한&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1 &amp;le;&amp;nbsp;T&amp;nbsp;&amp;le; 100.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;0 &amp;le;&amp;nbsp;N&amp;nbsp;&amp;le; 200.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;각 케이스에 대해서, 케이스 번호가 x이고 y가 정답일 때, Case #x: y라고 출력해야 한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;4
0
1
2
11
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;autoit&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;Case #1: INSOMNIA
Case #2: 10
Case #3: 90
Case #4: 110&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문제풀이(1)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력&amp;nbsp;받은&amp;nbsp;N을&amp;nbsp;한자리씩&amp;nbsp;나눠서&amp;nbsp;set에&amp;nbsp;저장하며&amp;nbsp;1회씩&amp;nbsp;카운트한다.&lt;br /&gt;0&amp;nbsp;~&amp;nbsp;9까지&amp;nbsp;모든&amp;nbsp;숫자를&amp;nbsp;set에&amp;nbsp;저장하고,&amp;nbsp;set의&amp;nbsp;size가&amp;nbsp;10이&amp;nbsp;된다면&lt;br /&gt;마지막에&amp;nbsp;완료되는&amp;nbsp;수를&amp;nbsp;출력하고,&amp;nbsp;만일&amp;nbsp;영원히&amp;nbsp;될&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;수라면&amp;nbsp;'INSOMNIA'을&amp;nbsp;출력한다.&lt;/p&gt;
&lt;pre id=&quot;code_1708613469168&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const filePath = process.platform === &quot;linux&quot; ? &quot;/dev/stdin&quot; : &quot;./input.txt&quot;;
const [testCase, ...numbers] = require(&quot;fs&quot;).readFileSync(filePath).toString().trim().split(&quot;\n&quot;).map(Number);

const check = (N) =&amp;gt; {
  const digitsSet = new Set();

  for (let i = 1; i &amp;lt;= 200; i++) {
    let current = i * N;
    String(current)
      .split(&quot;&quot;)
      .forEach((digit) =&amp;gt; digitsSet.add(digit));

    if (digitsSet.size === 10) return current;
  }

  return &quot;INSOMNIA&quot;;
};

numbers.forEach((N, index) =&amp;gt; {
  console.log(`Case #${index + 1}: ${check(N)}`);
});&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm</category>
      <author>호밀이</author>
      <guid isPermaLink="true">https://homile.tistory.com/428</guid>
      <comments>https://homile.tistory.com/428#entry428comment</comments>
      <pubDate>Thu, 22 Feb 2024 23:51:20 +0900</pubDate>
    </item>
    <item>
      <title>[Baekjoon]29700번 우당탕탕 영화예매 - Javascript</title>
      <link>https://homile.tistory.com/427</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/29700&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/29700&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1708426637871&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;29700번: 우당탕탕 영화예매&quot; data-og-description=&quot;첫째 줄에 영화관 세로줄의 개수 $N$($ 1 \leq N \leq 1\,000$)과 가로줄의 개수 $M$($ 1 \leq M \leq 5\,000$), 영화를 관람할 동아리원의 수 $K$($ 1 \leq K \leq 10$)가 주어진다. 둘째 줄부터 $N$ 개의 줄에 걸쳐 그중&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/29700&quot; data-og-url=&quot;https://www.acmicpc.net/problem/29700&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/maAKh/hyVmSedYVF/Vl7kOFvcUp2HAk2akNIgMK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/29700&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/29700&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/maAKh/hyVmSedYVF/Vl7kOFvcUp2HAk2akNIgMK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;29700번: 우당탕탕 영화예매&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 영화관 세로줄의 개수 $N$($ 1 \leq N \leq 1\,000$)과 가로줄의 개수 $M$($ 1 \leq M \leq 5\,000$), 영화를 관람할 동아리원의 수 $K$($ 1 \leq K \leq 10$)가 주어진다. 둘째 줄부터 $N$ 개의 줄에 걸쳐 그중&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;도은이는 동아리 문화의 날을 맞이하여 동아리원들과 함께 좌석이&lt;span&gt; &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;M&lt;/span&gt;행&lt;span&gt; &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;N&lt;/span&gt;열의 직사각형 모양으로 배치되어 있는 영화관에서 영화를 보기로 했다. 도은이는 동아리원의 유대감을 중요하게 생각하기 때문에 이미 예매가 완료된 좌석을 피해 동아리원들이 모두 가로로 이어서 앉을 수 있도록 자리를 예매하고 싶어 한다. 도은이를 도와 모든 동아리원들이 가로로 이어서 앉을 수 있도록 예매하는 경우의 수는 총 몇 가지가 있을지 구해보자. 단, 예매한 좌석은 동일하지만, 각 사람이 앉는 위치만 바뀌는 경우는 한 가지로 본다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 영화관 세로줄의 개수&lt;span&gt; &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;N&lt;/span&gt;(1&amp;le;N&amp;le;1000)과 가로줄의 개수&lt;span&gt; &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;M&lt;/span&gt;(1&amp;le;M&amp;le;5000), 영화를 관람할 동아리원의 수&lt;span&gt; &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;K&lt;/span&gt;(1&amp;le;K&amp;le;10)가 주어진다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;둘째 줄부터&lt;span&gt; &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;N&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;개의 줄에 걸쳐 그중&lt;span&gt; &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;i&lt;/span&gt;번째 줄에는&lt;span&gt; &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;i&lt;/span&gt;번째 열의 좌석 예매 현황이 길이&lt;span&gt; &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;M&lt;/span&gt;인 문자열&lt;span&gt; s&lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;i&lt;/span&gt;로 주어진다.&lt;span&gt; &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;si&lt;/span&gt;의&lt;span&gt; &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;j&lt;/span&gt;번째 문자는&lt;span&gt; &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;i&lt;/span&gt;열&lt;span&gt; &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;j&lt;/span&gt;번째 좌석의 예매 현황을 나타내는데, 이 문자가 '&lt;span aria-hidden=&quot;true&quot;&gt;0&lt;/span&gt;'이라면 예매 가능한 빈 좌석을, 이 문자가 '&lt;span aria-hidden=&quot;true&quot;&gt;1&lt;/span&gt;'이라면 예매가 완료되어 예매가 불가능한 좌석을 나타낸다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;동아리원들이 모두 가로로 이어서 앉을 수 있도록 영화를 예매하는 경우의 수를 출력한다. 단, 문제에서 주어진 조건에 맞게 영화를 예매할 수 있는 방법이 없다면&lt;span&gt;&amp;nbsp;&lt;/span&gt;0을 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;3 5 3
11000
01010
10000
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;3
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 2&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-2&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;3 4 3
1101
1001
0101
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 2&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-2&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333;&quot;&gt;&lt;code&gt;0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문제풀이(1)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N&amp;nbsp;x&amp;nbsp;M의&amp;nbsp;영화관&amp;nbsp;자리에서&amp;nbsp;이미&amp;nbsp;완료가&amp;nbsp;된&amp;nbsp;자리를&amp;nbsp;제외한&amp;nbsp;빈자리를&amp;nbsp;동아리원들이&amp;nbsp;가로로&amp;nbsp;연속되게&amp;nbsp;앉는&amp;nbsp;방법의&amp;nbsp;개수를&amp;nbsp;구하는&amp;nbsp;문제이다.&lt;/p&gt;
&lt;pre id=&quot;code_1708432575400&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const filePath = process.platform === &quot;linux&quot; ? &quot;/dev/stdin&quot; : &quot;./input.txt&quot;;
const input = require(&quot;fs&quot;).readFileSync(filePath).toString().trim().split(&quot;\n&quot;);

const [N, M, K] = input.shift().split(&quot; &quot;).map(Number);

let answer = 0;

for (let i = 0; i &amp;lt; N; i++) {
  for (let j = 0; j &amp;lt;= M - K; j++) {
    const seatList = input[i].slice(j, K + j).split(&quot;&quot;);

    if (seatList.filter((el) =&amp;gt; el === &quot;0&quot;).length === K) {
      answer++;
    }
  }
}

console.log(answer);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Algorithm</category>
      <author>호밀이</author>
      <guid isPermaLink="true">https://homile.tistory.com/427</guid>
      <comments>https://homile.tistory.com/427#entry427comment</comments>
      <pubDate>Tue, 20 Feb 2024 21:36:21 +0900</pubDate>
    </item>
  </channel>
</rss>