<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>꿈을 현실로</title>
    <link>https://sukvvon.tistory.com/</link>
    <description>꿈을 현실로 만드는 개발자 sukvvon입니다</description>
    <language>ko</language>
    <pubDate>Mon, 13 Apr 2026 01:22:47 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>sukvvon</managingEditor>
    <image>
      <title>꿈을 현실로</title>
      <url>https://tistory1.daumcdn.net/tistory/4189167/attach/4471cc7218f34231bd498aeed3b7ac45</url>
      <link>https://sukvvon.tistory.com</link>
    </image>
    <item>
      <title>2023년 10월 회고 (프론트엔드 데브코스 회고)</title>
      <link>https://sukvvon.tistory.com/90</link>
      <description>&lt;h2&gt;백엔드와 함께하는 첫 프로젝트&lt;/h2&gt;
&lt;h3&gt;기획과 디자인&lt;/h3&gt;
&lt;p&gt;10월에는 백엔드와 함께하는 최종 프로젝트가 시작되는 달이었다. 백엔드와 소통을 한 번도 해보지 않아서 어떻게 소통을 해야 잘 할 수 있을까 개발 외적으로 고민을 했던 것 같다. 기획자와 디자이너 없이 프론트엔드와 백엔드가 해야해서 막막했다... 그래서 기획도 엎어지고 다시 하는 경험도 하면서 처음 하는 것이기에 당연하지만 쉽지 않았다.&lt;/p&gt;
&lt;p&gt;기획과 디자인을 할 수 있는 경험을 가질 수 있다는 생각으로 긍정적으로 임했다. 거기에다가 프론트엔드 팀장을 맡아서 어깨가 좀 무거웠지만 팀의 분위기를 쳐지지 않고 증진시킬 수 있도록 노력을 했다. 다행히 팀원들과 지향점도 일치하고 잘 맞아서 힘들었지만 즐거웠다. 어떻게든 기획도 괜찮게 만들어진 것 같아서 여기서 기능도 기능이지만 어떻게 하면 모두가 얻어갈 수 있는 프로젝트를 만들 수 있을까를 고민했던 것 같다.&lt;/p&gt;
&lt;p&gt;프론트엔드 팀원들 모두가 함께 디자인을 피그마로 만들었다. 기획이 엎어지는 과정을 반복해서 팀 내부적으로 지치기도 했고, 시간도 촉박했지만 2-3일만에 완전하게 완성하였다. 개인적으로 피그마로 만드러진 것을 보기만 했지 스스로 피그마를 활용하여 디자인을 만들어본 경험은 없었다. 개발하는 것과 비슷하게 컴포넌트 단위로 잘게 쪼개서 디자인을 하고 쪼개진 다자인을 붙이는 과정을 하면서 재미있었다. 또한 피그마에 대해 일가견이 있는 팀원이 있어서 많이 배우고 배우 것을 활용도 잘 한 것 같고, 최종적으로 피그마에 대해 전문가까지는 아니지만 활용법를 얻어간 것 같아서 힘들었지만 만족하였다. 나중에 다자이너와 소통할 때 큰 도움이 될 것 같아. 평소 피그마 더 나아가 디자인에 관심이 있기도 했고 만들어보고 싶었어서 너무 좋은 경험이었다.&lt;/p&gt;
&lt;h2&gt;얻어가고 싶은 점&lt;/h2&gt;
&lt;p&gt;tanstack-react-query를 제대로 깊게 활용을 못해본 것 같아서 이번 기회에 집중해서 파보려고 한다. css가 많이 부족하다고 생각하고 있었는데 러닝커브가 적기도 하니깐 이번 기회에 제대로 잡고싶다. msw를 들어는 봤지 써보지는 않았다. 현업에서 정말 많이 사용한다고 하니깐 잘 활용하고 싶다. suspense, error-boundary를 알고는 있지만 넣어보지는 않아서 잘 잡고 가고싶다. 구현은 내가 원하는 것을 다 구현해내고 싶다. 마지막으로 팀원들과 소통을 끝까지 잘 해내고 싶다.&lt;/p&gt;</description>
      <category>Etc</category>
      <category>국비지원교육</category>
      <category>코딩부트캠프</category>
      <category>프로그래머스 데브코스</category>
      <category>프론트앤드 데브코스</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/90</guid>
      <comments>https://sukvvon.tistory.com/90#entry90comment</comments>
      <pubDate>Thu, 9 Nov 2023 23:45:56 +0900</pubDate>
    </item>
    <item>
      <title>2023년 9월 회고 (프론트엔드 데브코스 회고)</title>
      <link>https://sukvvon.tistory.com/89</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://github.com/prgrms-fe-devcourse/FEDC4_Campers_Jaeho&quot;&gt;https://github.com/prgrms-fe-devcourse/FEDC4_Campers_Jaeho&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;9월은 팀 프로젝트를 하는 달이었다. 인생을 살면서 첫 프로젝트이기도 하고, 팀장도 처음으로 맡아서 하게 되었다. 개발 더 나아가 인생을 살면서 잊지 못하는 순간 중 하나라는 생각이 든다. 다사다난했던 한 달이었기 때문이다. 기술적인 측면보다는 경험적인 측면에서 회고를 해보려고 한다.&lt;/p&gt;
&lt;h2&gt;개발에 대한 회고&lt;/h2&gt;
&lt;h3&gt;좋았던 점&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;초기 설정 (husky, prettier, eslint, lint-staged, commitlint, github)&lt;/li&gt;
&lt;li&gt;axios (auth)&lt;/li&gt;
&lt;li&gt;auth page 및 회원가입&lt;/li&gt;
&lt;li&gt;컴포넌트 공통화, alert-dialog 창, tabs 창&lt;/li&gt;
&lt;li&gt;context API (userInfo)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;크게 위와 같이 나누어진 task를 수행했다. 맡은 부분에서 책임지고 해내고 싶었는데 그 기대에 맞게 잘 동작하게 해낸 것 같아 다행이었다.&lt;/p&gt;
&lt;h3&gt;아쉬웠던 점&lt;/h3&gt;
&lt;p&gt;추가 구현사항인 채팅 기능을 구현하고 싶었는데 일정상 하지 못했던 것이 아쉽다.&lt;/p&gt;
&lt;h2&gt;협업 방식에 대한 회고&lt;/h2&gt;
&lt;h3&gt;좋았던 점&lt;/h3&gt;
&lt;p&gt;github의 칸반보드를 잘 활용하고 issue, PR, git commit message를 생성하는데 필요한 convention을 팀원들과 회의를 통해 만들었고, 개인적으로 앞에서 명시된 사항들을 잘 지켰다.&lt;/p&gt;
&lt;h3&gt;아쉬웠던 점&lt;/h3&gt;
&lt;p&gt;팀원들 간의 역량 편차로 인해 개인적으로 코어 타임에는 주로 코드 리뷰를 진행하고, 코어 타임이 끝난 후 기능을 구현하게 되었는데, 기능 구현보다 코드 리뷰에 치중된 것 같아 아쉬웠다.&lt;/p&gt;
&lt;p&gt;비동기적인 소통이 강조되지만, 동기적인 소통이 필요한 상황이었다.&lt;/p&gt;
&lt;p&gt;프로젝트 초기, git과 gitHub에 대한 충분한 설명과 문서를 제공했지만, 현실은 이와 다르게 진행되었다. 팀원 중에서는 이해를 했다고 의사를 표명했지만, 실제로는 반대인 경우가 있었다. 나아가 노트북 세팅 문제나 git에서의 오류 등 다양한 문제가 발생했다.&lt;/p&gt;
&lt;p&gt;github 이슈 및 PR의 제목과 내용 형식에 대한 규칙을 정했지만, 이를 따르지 않는 팀원도 있었다. git commit message 또한 성의 없이 올린 팀원도 있어서, 충분한 설명과 이유를 포함해 규칙이 잘 지켜지지 못한 것에 대해 지키자는 이야기를 많이 했었다.&lt;/p&gt;
&lt;p&gt;위 명시된 사항들을 팀원들에게 알려주고, 해결하기 위해 생각보다 많은 시간을 할애했다.&lt;/p&gt;
&lt;p&gt;에러가 난 채로 PR이 올라와진 경우가 많이 있었고, 에러가 있는 채로 review가 진행되고 merge가 된 경우가 많이 있었다. 즉 에러가 있는 채로 main으로 merge가 되는 것이다. 이 점이 아쉬웠다.&lt;/p&gt;
&lt;h2&gt;앞으로는&lt;/h2&gt;
&lt;p&gt;프로젝트를 설정할 때 github actions를 활용해서 build 실패 시 merge가 되지 못하도록 하는 장치를 추가해야겠다. 더 나아가 husky의 pre-push 파일을 만들어 git push를 하기 전 build를 하도록 하고 실패하면 push가 되지 못하도록 해야겠다.&lt;/p&gt;
&lt;p&gt;github wiki 혹은 notion에 프로젝트에 대한 것을 더 자세히 기록해야겠다. 누군가는 당연히 알고 있고 충분한 설명을 듣고 이해했다고 하더라도, 실제로는 그렇지 않은 사람이 존재할 것이고, 물어보기를 망설일수도 있을 것이다. 모든 사람이 말을 하기를 좋아하고 잘 하는 것은 아니기 때문이다. 그래서 모든 내용을 문서화할 필요성을 느꼈다.&lt;/p&gt;
&lt;p&gt;전체적인 룰은 정하고, 태스크를 1차, 2차로 나누어 1차 태스크는 공통적으로 분배하고 2차 태스크는 개개인의 역량을 존중하기 위해 1차 태스크를 완료한 팀원이 가져가는 식으로 진행이 되었다. 예상했던 것과 다르게 1차 태스크가 마감에 근접했지만 완료되지 못하는 상황이 발생하기도 했다. 이에 대해 팀원간의 신뢰가 있고, 편차가 크지 않을 경우 가능하다는 생각을 하였다. 다음에는 상황에 맞게 일정을 계획하고 개인의 역량에 맞게 수시로 태스크를 재분배해 진행하면 좋겠다는 생각을 했다.&lt;/p&gt;</description>
      <category>Etc</category>
      <category>국비지원교육</category>
      <category>코딩부트캠프</category>
      <category>프로그래머스 데브코스</category>
      <category>프론트엔드 데브코스</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/89</guid>
      <comments>https://sukvvon.tistory.com/89#entry89comment</comments>
      <pubDate>Sun, 1 Oct 2023 16:32:46 +0900</pubDate>
    </item>
    <item>
      <title>2023년 7월 회고 (프론트엔드 데브코스 회고)</title>
      <link>https://sukvvon.tistory.com/88</link>
      <description>&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/b9NnlB/btsl1ID61HJ/SrK2fYFCK3swBqlCnB8j4K/img.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;데브코스를 시작하고 2달이 흘러버렸다. 지금까지 주요했던 것들을 위주로 회고를 작성해보려 한다.&lt;/p&gt;
&lt;h2&gt;유효성 검사(validation)&lt;/h2&gt;
&lt;p&gt;과제 내용들 중 validation을 구현해보라는 내용이 있었다. 평소 코딩을 할 때 유효성 검증에 대한 생각은 한 번도 해본적이 없었고, 실제로 해본적도 없었다. 과제를 하면서 그리고 한 후 유효성 검증을 어떤 식으로 해야하는지 알아보는 좋은 기회가 되었다. 멘토님의 하신 말씀을 정리하여 짧게 정리하고 복기하려고 한다.&lt;/p&gt;
&lt;h3&gt;유효성 검사, 얼마나, 어떻게 해야하는 것인가?&lt;/h3&gt;
&lt;h4&gt;완벽과 잘 하는 것&lt;/h4&gt;
&lt;p&gt;유효성 검사를 완벽하게 하면 너무 좋지만 그럴 수 없기에 현실과 타협해서 우선순위를 정하고 하나씩 해결하는 방식을 추구하자 즉 하나씩 잘 해결해나가면서 자연스럽게 완벽을 추구하는 그림을 그리면 될 것 같다.&lt;/p&gt;
&lt;p&gt;예를 들어 1년에 장애를 99프로 이하로 나게 하는 것은 비교적 쉬울 수 있으나 99.999프로로 나게 하는 것은 많은 비용과 시간이 들어간다. 99프로는 1년에 3일이지만 99.999프로는 1년에 5.2분이다.&lt;/p&gt;
&lt;h4&gt;누구를 위한 검사인가?&lt;/h4&gt;
&lt;p&gt;과제를 진행하면서 한 유효성 검사는 api로 들어가거나 들어오는 state에 대한 유효성 검사를 진행했었다. 이런 방식의 검사는 개발자들을 위한 검사이고, 유저는 어떻게 행해야하는지 모를 것이다. 개발자들을 위한 유효성 검사는 서버 API의 유효성 검사의 경우 프론트가 서버 응답 데이터를 가지고 재가공을 할 때에는 검사를 하는 것이 의미가 있을 수 있으나 서버에서 내려줄 때 이미 이루어졌어야한다. 서버나 프론트나 검사를 할 수 있지만 프론트에서는 쉽지 않기 때문이다. 유저를 유한 유효성 검사는 어떤 방식이 있을까? 검사 결과 에러가 발생했을 경우 간단한 try catch를 통해 에러 페이지를 띄우거나 재시도를 할 수 있도록 유도하는 정도로 하면 좋을 것 같다.&lt;/p&gt;
&lt;h4&gt;어떻게 해야하는가?&lt;/h4&gt;
&lt;p&gt;데이터를 사용하는 경우보다는 데이터가 새로 넣어질 때 하는 것이 좋다.(setState를 호출하는 쪽) (API를 호출하는 상황이라면 API가 데이터를 사용하는 쪽이고 API를 호출하는 상황은 데이터를 넣어주는 쪽이다.)&lt;/p&gt;
&lt;p&gt;데이터를 넣어주는 곳은 한 곳일 수 있지만 데이터를 사용하는 곳은 여러 곳일 수 있기 때문이다. 데이터의 어떤 부분이 바뀌는 상황일 때 넣어주는 쪽에서 미리 검사를 해둔다면 미리 대비를 해두고 통과를 했기 때문에 사용하는 곳에서는 검사를 하는 작업을 더 할 필요가 없기 때문이다. 즉 한 번만 하면 되기 때문에 개발 용이성, 복잡도 모두 좋아진다.&lt;/p&gt;
&lt;h2&gt;스터디&lt;/h2&gt;
&lt;p&gt;새로운 사람을 만나는 것을 좋아하는 나에게 무리가 없는 스터디를 모집하고 진행하는 것은 자신이 있었다. 어떻게 운영할 것인지도 계획이 있었으니 말이다. 하지만 주변 지인들이 스터디를 진행하는 것을 보면서 효율적이지 못하고 서로가 서로에 대한 신뢰가 없이 시작하다보니 금방 깨지는 경우를 많이 보았다. 그리하여 스터디를 진행하더라도 서로 신뢰가 쌓여있는 환경만 조성된다면 바로 &amp;quot;진행시켜&amp;quot; 하고 싶었다.&lt;/p&gt;
&lt;p&gt;그 때가 지금이라는 것을 인지하고 7월 초에 미루다가 흐지부지 되기 전에 바로 &amp;quot;진행시켜&amp;quot; 해버렸다. &lt;a href=&quot;https://github.com/prgrms-web-devcourse/FEDC4-JSAlgorithm-study&quot;&gt;FEDC4_JSAlgorithm_study&lt;/a&gt; 이름과 같이 알고리즘 스터디이다. 스터디의 목적과 방식을 정리하면 아래와 같다.&lt;/p&gt;
&lt;h3&gt;스터디 구조&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;목적&lt;ul&gt;
&lt;li&gt;알고리즘 문제들을 양으로 뿌수는 것이 아닌 하루하루 팀원들과 정한 문제(3 ~ 4)들을 푼다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;방식&lt;ul&gt;
&lt;li&gt;리뷰어를 1:1로 지정한다.&lt;ul&gt;
&lt;li&gt;정해진 기간안에 코드리뷰를 해주어 서로가 놓친 부분은 수정해준다.&lt;/li&gt;
&lt;li&gt;자신보다 더 나은 코드가 있다면 억지로 보게 함으로써 효율적인 코드 풀이법을 뇌에 넣는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;결과&lt;/h3&gt;
&lt;p&gt;다행히 팀원 모두가 위와 같은 시스템에 만족을 한다고 하였다. 이런 시스템을 제안한 나 또한 뿌듯해서 성공적으로 스터디가 진행이 되고 있다고 판단하였고, 정말 뿌듯하다. 본래 8월 전까지만 해보자라는 생각을 했는데, 이 기세를 몰아 12월 수료까지 혹은 그 이후에도 계속 이어가려고한다.&lt;/p&gt;
&lt;h2&gt;1차 팀 활동을 마무리하며&lt;/h2&gt;
&lt;p&gt;1차 팀 홛동에 대한 회고는 KPT(keep, Try, Problem) 회고론을 활용하여 정리해본다.&lt;br&gt;목적은 팀 활동을 통한 개인의 역량이다.&lt;/p&gt;
&lt;h3&gt;Keep&lt;/h3&gt;
&lt;h4&gt;팀원과 함께&lt;/h4&gt;
&lt;p&gt;데브코스에 들어와 팀 활동을 하기 전, 1년동안 혼자서 공부해보자는 생각을 했다. 공부를 하는 동안 이런 생각이 들었다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;지금 이렇게 하는 것이 맞는건지 아닌건지 혼란스럽다.&lt;/li&gt;
&lt;li&gt;너무 외롭다는 감정(공허함)에 휘둘려 공부에 집중이 안된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;그 결과, 혼자 공부하는 것보다는 함께 공부하는 것이 나에게 효과적이라는 것을 깨달았다. 데브코스에 들어와 팀 활동을 한 후, 이런 생각들이 들었다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;로드맵(무조건 신뢰하는 것이 아닌)이 심리적으로 안정감을 준다.&lt;/li&gt;
&lt;li&gt;함께하는 팀원들을 만나면서 외로움이 사라졌다!&lt;/li&gt;
&lt;li&gt;혼자 고민을 하는 것이 아닌 팀원과 함께 고민하면서 혼자서 얻는 결과보다 함께하며 얻는 결과가 더 가치가 크고 스트레스를 덜 받는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;위와 같은 생각을 유지한채로 다음 2차 팀 3차 팀에서도 꾸준히 이행해야겠다는 생각이 들었다. 너무 만족스럽다.&lt;/p&gt;
&lt;h4&gt;코드 리뷰&lt;/h4&gt;
&lt;p&gt;매주 과제가 주어지면 과제를 수행하고 팀원들끼리 서로에 대한 코드리뷰를 해주고, 후 멘토님이 각 멘티(팀원)들의 코드를 리뷰해주는 시스템을 가지고 있다. 코드리뷰라는 것이 어떤건지는 알고 있었지만 오픈소스 PR를 할 때 코드리뷰 아닌 코드리뷰(?)를 했던 기억이 있다. 이번 팀원들 간의 코드리뷰를 통해 다음과 같은 것들을 행했다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;팀원들의 코드리뷰를 통한 잘못된 나의 코드 습관을 수정했다.&lt;/li&gt;
&lt;li&gt;팀원들을 코드리뷰를 해주기 위한 공부를 통한 나의 성장.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;코드 리뷰를 왜 하는지 이유를 알았다. 조금 귀찮을 수 있지만 함께 성장할 수 밖에 없는 구조이기 때문이다.&lt;/p&gt;
&lt;h3&gt;Problem&lt;/h3&gt;
&lt;h4&gt;목적 없는 스크럼&lt;/h4&gt;
&lt;p&gt;팀 프로젝트를 하지 않고 팀 단위 활동에서 스크럼을 진행하니 매일 회고를 진행한 결과가 같은 패턴을 가지는 것이 보여졌다. 각자 강의를 듣는 것이 주된 활동이고 과제들이 나오면 팀원들의 코드리뷰를 해주는 과정이었다보니 스크럼 형식이 따분해질 수 밖에 없다는 생각이 들면서 어쩔 수 없다는 식으로 방관하는 나의 모습을 보게 되었다.&lt;/p&gt;
&lt;h3&gt;Try&lt;/h3&gt;
&lt;h4&gt;목적 없는 스크럼을 극복하기&lt;/h4&gt;
&lt;p&gt;분명히 더 나은 방식으로 할 수 있었는데 말이다. 같은 반복되는 내용이더라도 아 다르고 어 다르다는 말이 있는 것처럼 살을 더 붙여서 &amp;quot;무엇을 할 예정이다&amp;quot;라기 보다는 &amp;quot;무엇을 어떻게 할 예정이다&amp;quot;처럼 말을 했으면 어땟을까라는 생각을 해본다.&lt;/p&gt;</description>
      <category>Etc</category>
      <category>국비지원교육</category>
      <category>코딩부트캠프</category>
      <category>프로그래머스 데브코스</category>
      <category>프론트엔드 데브코스</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/88</guid>
      <comments>https://sukvvon.tistory.com/88#entry88comment</comments>
      <pubDate>Mon, 7 Aug 2023 16:14:18 +0900</pubDate>
    </item>
    <item>
      <title>2023년 6월 회고</title>
      <link>https://sukvvon.tistory.com/87</link>
      <description>&lt;h2&gt;새로운 시작&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/b9NnlB/btsl1ID61HJ/SrK2fYFCK3swBqlCnB8j4K/img.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;말로만 듣고 온라인으로 github repository를 참고하기만 했던 프론트엔드 데브코스가 시작되어 버렸다...&lt;br&gt;지금 이 글을 쓰고 있는 지금도 내가 이 과정에 참여하고 있다는 것이 믿겨지지가 않는다.&lt;/p&gt;
&lt;h2&gt;만남&lt;/h2&gt;
&lt;h3&gt;3기 tooooo1님과의 만남&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/mdzl6/btsl0MAhW28/kfqTRkokswj4PhZj2flFXk/img.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;약 1년 전부터 github 상기로 혼자 알고만 있던 &lt;a href=&quot;https://github.com/tooooo1&quot;&gt;tooooo1&lt;/a&gt;님과 프론트엔드 데브코스에서 운영중인 디스코드에서 이야기를 할 수 있는 기회를 가지게 되었다. 마치 연예인을 보는 듯한 기분이랄까...? 이야기를 하다보니 같은 동네에 살게 된다는 것을 알게되었고, 시간은 새벽 1시였지만 만나게 되었다.&lt;/p&gt;
&lt;p&gt;그동안 github상으로 궁금한 코드들도 많았고, 평상시에 어떻게 생각하시는지, 막힐 때 어떻게 대처하는지, 어떻게 삽질(?)을 하시는지 물어보고 직접 하시는 것도 보다보니 새벽 5:30이 되어서 집에 오게 되었다.&lt;/p&gt;
&lt;h4&gt;소감&lt;/h4&gt;
&lt;p&gt;이야기를 나눈 후 많은 것을 깨달았다. 말씀하신 것과 다르게 이 정도로 노력했다고 이 정도로 삽질을 해 봤다고 스스로 말을 할 수 없었기 때문이다. 이야기를 하면서 앞으로 나아가야할 방향을 정하고, 어떻게 대처하는지 등 마인드를 세팅 할 수 있게 된 좋은 순간이었다.&lt;/p&gt;
&lt;h3&gt;팀원들간의 만남&lt;/h3&gt;
&lt;h4&gt;비대면&lt;/h4&gt;
&lt;p&gt;이번 프로그래머스 4기는 총 60명으로 이루어져있고, 각 팀으로 해서 팀당 5-6명씩으로 이루어져있다. 그리고 정해진 일정이 있고, 코어 타임이 있고, 코어타임 기간 동안에는 디스코드에서 캠을 키고 서로 모니터링 하면서 공부를 하는 시스템이다. 이번달은 1시부터 7시였다.&lt;/p&gt;
&lt;h5&gt;소감&lt;/h5&gt;
&lt;p&gt;혼자서 공부하면서 방향성과 외로움에 허덕이던 나에게 더할 나위 없는 좋은 환경이었다. 혼자 했다면 &amp;quot;조금만 쉬었다 할까...?&amp;quot; 하면서 쉬곤 했던 나인데 함께 공부를 하니 눈치가 보여서 &amp;quot;안에 사람들이 있잖아&amp;quot; 라는 마인드로 계속 집중해서 할 수 있는 환경이 만들어지고 계속 해 나가는 나의 모습이 너무 좋았다.&lt;/p&gt;
&lt;h4&gt;대면&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/tDMlp/btsl1I5cHO9/iHl1keKqtUVnk9yFFJLqQ0/img.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;notion 클로닝 과제를 해야하는 일정이 있는데 그 일정을 할 겸 한 번도 서로 보지 못한 사이버 친구였으니 프로그래머스 일정으로 오프라인으로 2일 만나는 일정이 있었다.&lt;/p&gt;
&lt;h5&gt;소감&lt;/h5&gt;
&lt;p&gt;실제로 팀원 및 디스코드 상에서만 이야기를 하던 사람들을 만나니 너무 좋았다. 사람을 원체 만나는 것을 좋아하는 성격이라 더 뜻 깊게 와 닿은 것 같다. 만났으니 술과 노래가 빠지면 섭하지 않겠는가? 일정이 끝나고 아침까지 달려버렸다... ㅎㅎ 내가 가고자 하는 분야의 공통된 목적을 가지는 사람들과 만나서 일정이 끝나고 밥도 먹고 술도 먹고 야무지게 놀았더니 평소 놀 때보다 몇 배로 즐거웠던 같다. 동료들에게 민폐 안 끼치면서 이 과정을 잘 하고 프로젝트 또한 잘 완주하고 싶다는 다짐을 다시 한 번 했다.&lt;/p&gt;
&lt;h2&gt;코드 리뷰&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;image src=&quot;https://blog.kakaocdn.net/dn/cIXih1/btsl0Luy8iS/aBKyekIx831ZUqLioufUF1/img.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;혼자서 공부를 하기 전에 코드 리뷰를 해 본적이 한 번도 없었다. 약 1,2주일에 한 번씩 주어지는 과제가 있고, 그 과제를 해결한 후 멘티들 및 멘토님과 코드 리뷰를 진행하였다.&lt;/p&gt;
&lt;h3&gt;소감&lt;/h3&gt;
&lt;p&gt;코드 리뷰를 진행하면서 어떤 마음을 가지고 해야하는지 알 수 있었고, 나와 목적이 같지만 너무 다른 스타일의 코드를 가진 사람들이 생각한 것보다 많았다. &amp;quot;다른 사람이 짠 코드가 제일 어렵다&amp;quot; 라는 말을 몸소 체감한 순간이었다. 리뷰룰 할 때 가져야 하는 마음가짐 또한 배웠다. 말이 아 다르고 어 다르다고 하지 않았던가? 최대한 적을 때 상대방을 생각하면서 적는 연습을 할 수 있었다. 그리고 나의 부족한 점 즉 더 나아갸아할 점을 빠르게 알 수 있었다. 멘티들의 코드 리뷰도 좋았지만 멘토님이 달아주신 코드 리뷰 하나하나가 나도 모르는 잘못된 습관을 빠르게 알려주고 잡아주어서 너무 좋은 경험이었고, 앞으로 남은 기간동안 코드 리뷰 천국이라고 생각하니 너무 행복한 삶을 살고 있다고 말 할 수 있다.&lt;/p&gt;</description>
      <category>Etc</category>
      <category>프로그래머스 데브코스</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/87</guid>
      <comments>https://sukvvon.tistory.com/87#entry87comment</comments>
      <pubDate>Fri, 30 Jun 2023 23:38:01 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 프론트엔드 데브코스 4기 합격 후기</title>
      <link>https://sukvvon.tistory.com/86</link>
      <description>&lt;h2&gt;지원동기&lt;/h2&gt;
&lt;p&gt;독학을 한다는 것은 쉬운 것이 아니었다. 내가 정한 이 길로 공부를 해야겠다라는 생각을 가지고 패기있게 시작하였으나 혼자서 하다보니 쓸데없는 생각이 많아지기도 하고, “이렇게 해야한다”, “저렇게 해야한다” 는 주변의 유혹도 뿌리치기 힘든 순간들이 많았다. 다시말해 공부를 해야하는 방향에 너무 많은 갈림길들이 내 머리속에 들어와 나를 헤집어놨다. 당연히 javascript에 대한 깊은 이해 없이 바로 어떤 사이트를 강의를 듣고 응용하여 만드려고 하니 막히는 순간이 많았다. 막히는 순간이 올때마다 나에 대한 신뢰가 점점 떨어지고, ‘이 길이 내 길이 아닌것인가?’ 라는 생각이 들어 자신감이 하락하는 와중에 엎친데 덮친격으로 맥북까지 망가져버렸었다. 기본기가 부족해서 그렇다는 것을 지금은 알지만 그 당시 코딩이 무서워졌다. 결국 번아웃이 와버렸다. 그렇게 공부를 놓아버렸다.&lt;/p&gt;
&lt;p&gt;공부를 아예 놓고 일부러 몸을 쓰는 알바를 3-4개월 하면서 지내봤지만 개발이 자꾸 생각이 났었다. 그래서 마음을 다잡고 거금을 들여 다시 맥북을 사고 내가 막히는 원인이 javascript에 대한 무지, 사고력과 논리력 부족이라고 판단하여 두려움이 생겼던 웹 공부를 잠시 넣어두고 초심으로 돌아가 프로그래머스나 백준 플랫폼을 이용하여 &amp;quot;왜 해야하지?&amp;quot; 라고 생각했던 알고리즘 공부만 하면서 알고리즘 공부를 해야하는 이유도 깨닫고, 풀리는 맛이 좋아 자신감도 다시 얻었었다. 그리고 가끔씩 감을 잃지 않기 위해 ‘프로그래머스 데브코스’, ‘우아한테크코스’, ‘네이버 부스트캠프’ 와 같은 대표적인 부트캠프 과정들의 github organization의 여러 repository들을 보면서 어떻게 코드를 짯는지 봤었다. 독학을 했었을 때와 비교하며 다시 웹 공부를 해야겠다는 생각이 들었을 때 있으면 좋을 것 같은 요소들을 생각해봤다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;나를 잡아줄 방향이 잡힌 커리큘럼&lt;/li&gt;
&lt;li&gt;올바른 방향으로 이끌어줄 멘토들&lt;/li&gt;
&lt;li&gt;혼자가 아닌 함께 성장할 수 있는 동료들&lt;/li&gt;
&lt;li&gt;동료들을 실망시키지 않겠다는 마음가짐으로 인한 부지런함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;알고리즘도 꾸준히 풀면서 자신감과 자존감도 상승했겠다, 이왕 하는거 제대로 해보자라는 마인드로 평도 좋고, 괜찮은 커리큘럼을 지니고 있다고 생각한 알고리즘을 풀 때 메인으로 삼았던 플랫폼인 프로그래머스에서 운영하는 프로그래머스 프론트엔드 데브코스를 지원하기로 마음을 먹었다. 그리하여 지원을 했다.&lt;/p&gt;
&lt;h2&gt;서류&lt;/h2&gt;
&lt;h3&gt;자기소개서&lt;/h3&gt;
&lt;p&gt;자기소개서 문항은 크게 6개로 나뉘어졌다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;데브코스를 지원하게 된 동기는 무엇인가요?&lt;/li&gt;
&lt;li&gt;데브코스와 별개로 원래는 어떤 계획을 갖고 있었나요?&lt;/li&gt;
&lt;li&gt;개발자가 되고 싶은 이유는 무엇인가요?&lt;/li&gt;
&lt;li&gt;웹 프론트엔드 분야를 선택한 이유는 무엇인가요?&lt;/li&gt;
&lt;li&gt;웹 프론트엔드 진로를 위해 그동안 어떤 노력을 하셨나요?&lt;/li&gt;
&lt;li&gt;강도 높은 과정입니다. 데브코스에서 어떻게 학습을 이어갈 계획인가요?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;합격 후기들을 보았을 때 자소서의 비중이 큰 것 같다는 내용을 공통적으로 보았다. 모든 문항이 “300자 내외 최대 500자 제한” 이라고 명시되어 있었다. 비중이 컸다는 것을 생각하며 지원동기에서 서술했던 나의 이야기 및 코딩을 하면서 기여를 했거나 노력했던 것 등등 코딩 관련 나의 모든 경험과 감정을 진심을 담아 이것이 아니면 안된다는 마인드로 500자를 꽉 채워 썻던 것 같다. 코딩을 하면서 우여곡절도 많았고, 번아웃도 겪었다보니 나도 모르게 500자를 넘어 1000자를 썻던 문항도 있었다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/wVeTe/btsiswapTlo/Gh0mkiGQyIfi4G4wgQjOSK/img.png&quot; alt=&quot;1차 합격 메일&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;그리고 서류 전형을 통과하였다.&lt;/p&gt;
&lt;h2&gt;실력 확인 테스트&lt;/h2&gt;
&lt;p&gt;실력 확인 테스트 문제는 주관식 3문제 객관식 18문제가 나왔다.&lt;/p&gt;
&lt;h3&gt;주관식&lt;/h3&gt;
&lt;p&gt;코딩을 해야하는 주관식 문제 체감은 프로그래머스와 백준으로 평가했을 때&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lv. 1 (bronze 2)&lt;/li&gt;
&lt;li&gt;Lv. 1 (silver 4)&lt;/li&gt;
&lt;li&gt;Lv. 2 (gold 2)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;개인간에 편차가 있을 수 있지만 이 정도로 표현할 수 있을 것 같다. 평소 백준과 프로그래머스를 통해 약 4개월간 꾸준히 평균적으로 매일 3문제 이상씩 풀어온 나에게 1번과 2번 문제의 경우는 문제당 최소 5분에서 15분 정도 소요되며 어렵지 않게 풀 수 있었고, 3번 문제의 경우는 아쉽게도 풀지 못했다.&lt;/p&gt;
&lt;h3&gt;객관식&lt;/h3&gt;
&lt;p&gt;프로그래머스 데브코스 모집 홈페이지에서 &amp;quot;HTML/CSS, 브라우저&amp;quot; 관련 문제가 나온다고 명시가 되어있었는데 정말 평소에 기본적인 프론트엔드에 대한 지식이 있으면 풀 수 있을 정도로 나왔다. 5분만에 다 풀어버릴 정도로 말이다.&lt;/p&gt;
&lt;p&gt;그리하여 복기를 한 결과 주관식 문제는 2/3솔을 하고 객관식 문제는 18/18 즉 다 맞아서 총 20/21을 한 것 같았다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/beL0b8/btsiu0t4et6/AFz2P2Kxbdkp0emB7tcOpk/img.png&quot; alt=&quot;2차 합격 메일&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;그리고 실력 확인 테스트 또한 합격을 하였다.&lt;/p&gt;
&lt;h2&gt;면접&lt;/h2&gt;
&lt;p&gt;면접을 일대다로 보았다. 원래 면접관 1 면접자 5이지만 우리 조는 면접자 한 분이 불참을 하셔서 4명이서 보게 되었다. 질문 내용은 생각보다 그렇게 깊고 어렵지는 않았던 것 같다. 자소서를 기반으로 한 질문들을 우선적으로 하면서 자소서의 내용과 면접자가 말하는 내용이 일치하는가와 면접자의 인성을 보는 것 같았다. 그리고 각 면접자들마다 자소서에 기술적인 내용들이 있다면 좀 깊게 물어보셨다. 그 후 공통적으로 프론트엔드 관련하여 기초적인 이론적인 질문을 하셨다. 그리 어렵지 않은 질문들이었지만 완성도 있게 말하지 못하였는데 좀 후회가 되고 미련이 남았다. 면접할 때 너무 말이 많아서 정리를 하지 못해 컷을 당한 질문은 많이 아쉬웠다. 평소에 면접 준비를 했었어야 했다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/cAp3ex/btsis0BTnON/PGYwkLdYlZkisKI7pdI8e0/img.png&quot; alt=&quot;최종 합격 메일&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;예비를 받았다. 나보다 뛰어난 사람들이 많았다고 생각을 하였기 때문에 아쉽긴 하지만 면접까지 갔다는 것에 의의를 두었다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/2lh4P/btsitAwm2Jo/QPCCpZjF4dRSO60Ur3EC3K/img.png&quot; alt=&quot; 추가 합격 메일&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;그리고 다행스럽게도 추가 합격을 하였다.&lt;/p&gt;
&lt;h2&gt;결론&lt;/h2&gt;
&lt;p&gt;지원서 같은 경우 자신의 이야기를 풀어서 진심을 담아 쓴다면 합격을 하는 것이라고 생각이 든다. 그리고 자신이 왜 이 과정에 필요한지 어필을 할 수 있다면 통과할 수 있을 것이라고 생각했다. 나중에 알았지만 서류에서 떨어진 사람도 많았다고 한다.&lt;/p&gt;
&lt;p&gt;객관식의 경우, 유튜브(ex. 생활코딩)나 인프런 같은 곳의 무료 인강을 듣고 이해를 하며 연습을 했다면 객관식 문제는 수월하게 다 풀 수 있다고 생각이 들고, 주관식의 경우 평소 알고리즘 공부를 꾸준히 하면 통과할 수 있다고 생각한다.&lt;/p&gt;
&lt;p&gt;면접은 떨지 않고 자신이 하고 싶은 이야기를 짧고 강하게 이야기하는 연습이 되어 있으면 최초합을 할 수 있지 않을까(?)라는 생각을 하였다. &amp;quot;부족하기 때문에 부트캠프를 준비 하는 것이지 부족하지 않으면 왜 지원을 하겠는가? 바로 취업을 해버리지 ㅎㅎ&amp;quot; 라는 마음가짐을 가지고 비우고 &amp;quot;나를 보여주라&amp;quot; 라는 마인드로 준비를 했던 것이 합격할 수 있었던 요인이었던 것 같다.&lt;/p&gt;</description>
      <category>Etc</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/86</guid>
      <comments>https://sukvvon.tistory.com/86#entry86comment</comments>
      <pubDate>Fri, 2 Jun 2023 20:16:59 +0900</pubDate>
    </item>
    <item>
      <title>[Nodejs][백준] 단계별로 풀어보기 - 5. 함수</title>
      <link>https://sukvvon.tistory.com/85</link>
      <description>&lt;h2&gt;2. 셀프 넘버&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/4673&quot;&gt;https://www.acmicpc.net/problem/4673&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;셀프 넘버

문제
셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다.

양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다.

예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다음 수는 39 + 3 + 9 = 51, 다음 수는 51 + 5 + 1 = 57이다. 이런식으로 다음과 같은 수열을 만들 수 있다.

33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...

n을 d(n)의 생성자라고 한다. 위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자이다. 생성자가 한 개보다 많은 경우도 있다. 예를 들어, 101은 생성자가 2개(91과 100) 있다.

생성자가 없는 숫자를 셀프 넘버라고 한다. 100보다 작은 셀프 넘버는 총 13개가 있다. 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97

10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

입력
입력은 없다.

출력
10,000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.

예제 입력 1

예제 출력 1
1
3
5
7
9
20
31
42
53
64
 |
 |       &amp;lt;-- a lot more numbers
 |
9903
9914
9925
9927
9938
9949
9960
9971
9982
9993&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function d(n) {
  let sum = n;

  while (n &amp;gt; 0) {
    sum += n % 10;
    n = Math.floor(n / 10);
  }

  return sum;
}

const selfNum = new Array(10000);
selfNum.fill(true);

for (let i = 1; i &amp;lt;= 10000; i++) {
  selfNum[d(i)] = false;

  if (selfNum[i]) {
    console.log(i);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;function d(n) (생성자를 구하는 함수)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function d(n) {
  let sum = n;

  while (n &amp;gt; 0) {
    sum += n % 10;
    n = Math.floor(n / 10);
  }

  return sum;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;일정한 범위 내에서 생성자가 없는 숫자인 셀프 넘버를 구하기 위해서는 전체 범위에서 생성자를 빼주면 됩니다.&lt;/p&gt;
&lt;p&gt;우선 생성자를 구하는 함수가 필요합니다.&lt;/p&gt;
&lt;h5&gt;sum (생성자)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let sum = n;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;sum&lt;/code&gt;이라는 변수에 매개변수 양의 정수를 뜻하는 &lt;code&gt;n&lt;/code&gt;을 할당합니다.&lt;/p&gt;
&lt;p&gt;만약 &lt;code&gt;n&lt;/code&gt;이 &lt;code&gt;123&lt;/code&gt;인 경우 &lt;code&gt;sum&lt;/code&gt;은 &lt;code&gt;123&lt;/code&gt;이 됩니다.&lt;/p&gt;
&lt;h5&gt;while (생성자를 만드는 과정)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;while (n &amp;gt; 0) {
  sum += n % 10;
  n = Math.floor(n / 10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;while (n &amp;gt; 0) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/while&quot;&gt;while&lt;/a&gt;문을 활용해 &lt;code&gt;n &amp;gt; 0&lt;/code&gt;일 경우에만 진행을 하도록 합니다.&lt;/p&gt;
&lt;h6&gt;더하기 할당 (sum에 n의 나머지 값 더하기)&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;while (n &amp;gt; 0) {
  sum += n % 10;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Addition_assignment&quot;&gt;더하기 할당&lt;/a&gt;을 통해 &lt;code&gt;n&lt;/code&gt; 값을 할당한 변수 &lt;code&gt;sum&lt;/code&gt;에 &lt;code&gt;n&lt;/code&gt;의 10으로 나눈 나머지 즉 &lt;u&gt;일의 자리 수를 더하여 줍니다.&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;예를 들어 숫자 &lt;code&gt;123&lt;/code&gt;일 경우 &lt;code&gt;3&lt;/code&gt;을 더하여 주는 것입니다.&lt;/p&gt;
&lt;h6&gt;Math.floor() (소수점 밑 버리기)&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;while (n &amp;gt; 0) {
  sum += n % 10;
  n = Math.floor(n / 10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;n&lt;/code&gt;을 &lt;code&gt;10&lt;/code&gt;으로 나누면 소수점을 가진 실수가 되는데 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math/floor&quot;&gt;&lt;code&gt;Math.floor()&lt;/code&gt;&lt;/a&gt; 함수를 통해 정수화 해줍니다. 그리고 그 값을 &lt;code&gt;n&lt;/code&gt;에 할당합니다.&lt;/p&gt;
&lt;p&gt;예를 들어 &lt;code&gt;123&lt;/code&gt;의 경우 &lt;code&gt;n / 10&lt;/code&gt;을 하면 &lt;code&gt;12.3&lt;/code&gt;이 되는데 &lt;code&gt;Math.floor()&lt;/code&gt;을 통해 &lt;code&gt;12&lt;/code&gt;가 됩니다.&lt;/p&gt;
&lt;p&gt;위와 같은 과정을 &lt;code&gt;while (n &amp;gt; 0) {}&lt;/code&gt; 즉 &lt;code&gt;n&lt;/code&gt;이 &lt;code&gt;0&lt;/code&gt;보다 큰 경우 반복하게 되어 두 자리 수든 세 자리 수든 모든 자리수를 더한 값을 구할 수 있습니다.&lt;/p&gt;
&lt;h5&gt;return (생성자 sum 반환하기)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function d(n) {
  let sum = n;

  while (n &amp;gt; 0) {
    sum += n % 10;
    n = Math.floor(n / 10);
  }

  return sum;
}

console.log(d(123)); // 129&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/return&quot;&gt;&lt;code&gt;return&lt;/code&gt;&lt;/a&gt; 명령문을 통해 함수 실행을 종료하고 &lt;code&gt;sum&lt;/code&gt; 값을 반환합니다. 즉 &lt;code&gt;n&lt;/code&gt;의 생성자 혹은 생성자들을 반환하게 되는 것입니다.&lt;/p&gt;
&lt;h4&gt;selfNum (셀프 넘버를 가지는 배열)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const selfNum = new Array(10000);
selfNum.fill(true);&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;Array() 생성자 (배열 생성하기)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const selfNum = new Array(10000);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/Array&quot;&gt;&lt;code&gt;Array()&lt;/code&gt;&lt;/a&gt;를 활용하여 &lt;code&gt;10000&lt;/code&gt;개의 요소를 가지는 빈 배열을 생성하여 변수 &lt;code&gt;selfNum&lt;/code&gt;에 할당합니다.&lt;/p&gt;
&lt;h5&gt;fill() (배열의 요소 모두 true)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;selfNum.fill(true);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;아직 셀프 넘버인지 생성자인지 추려내지 않았기 때문에 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/fill&quot;&gt;&lt;code&gt;fill()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 모두 &lt;code&gt;true&lt;/code&gt;로 채웁니다.&lt;/p&gt;
&lt;h4&gt;for (selfNum 배열의 요소 추려내기)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= 10000; i++) {
  selfNum[d(i)] = false;

  if (selfNum[i]) {
    console.log(i);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= 10000; i++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;selfNum&lt;/code&gt; 내의 요소들에 관한 반복문이므로 &lt;code&gt;i&lt;/code&gt;의 범위를 &lt;code&gt;1&lt;/code&gt;부터 &lt;code&gt;10000&lt;/code&gt;까지로 합니다.&lt;/p&gt;
&lt;h5&gt;생성자인 경우 요소 false로&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= 10000; i++) {
  selfNum[d(i)] = false;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;d(i)&lt;/code&gt; 값과 일치하는 배열 &lt;code&gt;selfNum&lt;/code&gt;의 요소인 경우 &lt;code&gt;false&lt;/code&gt;로 할당합니다.&lt;/p&gt;
&lt;p&gt;위의 과정을 통해 생성자인 요소는 &lt;code&gt;false&lt;/code&gt;가 되는 것이고, 생성자가 아닌 셀프 넘버인 요소는 &lt;code&gt;true&lt;/code&gt; 값을 가지게 됩니다.&lt;/p&gt;
&lt;h5&gt;if...else (selfNum의 요소가 true인 경우)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= 10000; i++) {
  selfNum[d(i)] = false;

  if (selfNum[i]) {
    console.log(i);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/if...else&quot;&gt;if...else&lt;/a&gt;문에 의해 &lt;code&gt;selfNum[i]&lt;/code&gt;가 &lt;code&gt;true&lt;/code&gt;일 경우 셀프 넘버이므로 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt; 메서드로 &lt;code&gt;i&lt;/code&gt; 값을 출력해줍니다.&lt;/p&gt;
&lt;h2&gt;3. 한수&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1065&quot;&gt;https://www.acmicpc.net/problem/1065&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;한수

문제
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.

출력
첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.

예제 입력 1
110

예제 출력 1
99

예제 입력 2
1

예제 출력 2
1

예제 입력 3
210

예제 출력 3
105

예제 입력 4
1000

예제 출력 4
144

예제 입력 5
500

예제 출력 5
119&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = +fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

function arithmeticalSequence(n) {
  if (n &amp;lt; 100) {
    return true;
  } else if (n &amp;lt; 1000) {
    const number = n % 10;
    const tens = Math.floor(n / 10) % 10;
    const hundreds = Math.floor(n / 100);
    if (number - tens === tens - hundreds) {
      return true;
    } else {
      return false;
    }
  }
}

let count = 0;

for (let i = 1; i &amp;lt;= inputData; i++) {
  if (arithmeticalSequence(i)) {
    count++;
  }
}

console.log(count);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData (입력값)&lt;/h4&gt;
&lt;h5&gt;readFileSync() (파일 읽어오기)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 31 30 30 30&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;process.platform (작동 시스템 구별)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;+ (숫자형으로 변환)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = +fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // 1000&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 &lt;code&gt;inputData&lt;/code&gt;값을 숫자형으로 변환시킵니다.&lt;/p&gt;
&lt;h4&gt;arithmeticalSequence(n) (한수를 구하는 함수)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function arithmeticalSequence(n) {
  if (n &amp;lt; 100) {
    return true;
  } else if (n &amp;lt; 1000) {
    const number = n % 10;
    const tens = Math.floor(n / 10) % 10;
    const hundreds = Math.floor(n / 100);
    if (number - tens === tens - hundreds) {
      return true;
    } else {
      return false;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;일정한 범위 내에서 한수의 개수를 출력을 해야합니다. 우선 특정한 수가 한수 즉 등차수열인지 아닌지를 가려내는 함수를 생성합니다.&lt;/p&gt;
&lt;h5&gt;if...else (범위마다 한수 추려내기)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;if (n &amp;lt; 100) {
  return true;
} else if (n &amp;lt; 1000) {
  const number = n % 10;
  const tens = Math.floor(n / 10) % 10;
  const hundreds = Math.floor(n / 100);
  if (number - tens === tens - hundreds) {
    return true;
  } else {
    return false;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;1000&lt;/code&gt; 보다 작거나 같은 자연수에 중에 한수를 찾아내는 것이기 때문에 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/if...else&quot;&gt;if...else&lt;/a&gt;문을 활용하여 범위마다 구분합니다.&lt;/p&gt;
&lt;h6&gt;n &amp;lt; 100 (n이 100보다 작을 때)&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;if (n &amp;lt; 100) {
  return true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;n&lt;/code&gt; 값이 &lt;code&gt;100&lt;/code&gt;보다 작을 경우 &lt;u&gt;각 자리의 수가 모두 등차수열을 이루기&lt;/u&gt; 때문에 &lt;code&gt;true&lt;/code&gt; 값을 반환합니다.&lt;/p&gt;
&lt;h6&gt;n &amp;lt; 1000 (n 100 이상이면서 1000보다 작을 경우)&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;if (n &amp;lt; 100) {
  return true;
} else if (n &amp;lt; 1000) {
  const number = n % 10;
  const tens = Math.floor(n / 10) % 10;
  const hundreds = Math.floor(n / 100);
  if (number - tens === tens - hundreds) {
    return true;
  } else {
    return false;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;등차수열: 연속하는 두 항의 차이가 모두 일정한 수열&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;모두 &lt;code&gt;true&lt;/code&gt;인 &lt;code&gt;100&lt;/code&gt;미만의 경우를 제외하고 &lt;code&gt;100&lt;/code&gt;이상 &lt;code&gt;1000&lt;/code&gt; 미만일 경우 즉 세 자리 수부터는 각 자리수가 등차수열이 될 수 없는 경우가 존재합니다.&lt;/p&gt;
&lt;p&gt;그 존재를 가려내기 위해서 &lt;code&gt;number&lt;/code&gt;, &lt;code&gt;tens&lt;/code&gt;, &lt;code&gt;hundreds&lt;/code&gt;와 같이 각각 일의 자리 수, 십의 자리 수, 백의 자리 수를 의미하는 변수를 만들고,&lt;/p&gt;
&lt;p&gt;등차수열의 특징에 따라 &lt;u&gt;연속하는 두 항의 차이가 모두 일정&lt;/u&gt;해야하므로 &lt;code&gt;number - tens === tens - hundreds&lt;/code&gt; 즉 일의 자리 수와 십의 자리 수의 차이가 십의 자리 수와 백의 자리 수의 차이와 같다면 &lt;code&gt;true&lt;/code&gt;를 반환하고, 그것이 아니라면 &lt;code&gt;false&lt;/code&gt;를 반환하게 합니다.&lt;/p&gt;
&lt;h4&gt;count (한수의 개수)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let count = 0;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;한수의 개수를 의미하는 변수 &lt;code&gt;count&lt;/code&gt;를 선언하고 &lt;code&gt;0&lt;/code&gt;으로 초기화합니다.&lt;/p&gt;
&lt;h4&gt;for (inputData 값 이하의 수 한수 판단)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= inputData; i++) {
  if (arithmeticalSequence(i)) {
    count++;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for&quot;&gt;for&lt;/a&gt;문을 통해 &lt;code&gt;i&lt;/code&gt;의 범위를 &lt;code&gt;1&lt;/code&gt;부터 주어진 자연수인 &lt;code&gt;inputData&lt;/code&gt;만큼으로 하여 이하의 식을 수행하게 합니다.&lt;/p&gt;
&lt;h5&gt;if...else (한수일 경우 count 값 증가)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;if (arithmeticalSequence(i)) {
  count++;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위에서 정의한 한수를 판별하는 함수인 &lt;code&gt;arithmeticalSequence(i)&lt;/code&gt;를 통해 &lt;code&gt;i&lt;/code&gt;의 값이 한수이면 즉 반환하는 값이 &lt;code&gt;true&lt;/code&gt;이면 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Increment&quot;&gt;증가 연산자&lt;/a&gt;를 통해 증가시킵니다.&lt;/p&gt;
&lt;h4&gt;console.log() (한수의 개수 출력하기)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(count); // 144&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt; 메서드를 활용해 한수의 개수를 의미하는 변수 &lt;code&gt;count&lt;/code&gt;를 출력합니다.&lt;/p&gt;</description>
      <category>Nodejs</category>
      <category>BaekJoon</category>
      <category>nodejs</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/85</guid>
      <comments>https://sukvvon.tistory.com/85#entry85comment</comments>
      <pubDate>Mon, 12 Sep 2022 11:12:59 +0900</pubDate>
    </item>
    <item>
      <title>[Nodejs][백준] 단계별로 풀어보기 - 4. 1차원 배열</title>
      <link>https://sukvvon.tistory.com/84</link>
      <description>&lt;h2&gt;1. 최소,최대&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10818&quot;&gt;https://www.acmicpc.net/problem/10818&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;최소, 최대

문제
N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.

입력
첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

출력
첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.

예제 입력 1
5
20 10 35 30 7

예제 출력 1
7 35&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

const data = inputData[1].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
const maximum = Math.max(...data);
const minimum = Math.min(...data);

console.log(minimum, maximum);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData (입력값)&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 35 0a 32 30 20 31 30 20 33 35 20 33 30 20 37&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;문자열 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData);
// 5
// 20 10 35 30 7&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;toString()&lt;/h6&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;배열 생성&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .trim()
  .split(&amp;quot;\n&amp;quot;);

console.log(inputData); // [ &amp;#39;5&amp;#39;, &amp;#39;20 10 35 30 7&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;을 활용하여 매개변수에 다음줄을 의미하는 &lt;code&gt;&amp;quot;\n&amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h4&gt;data (N개의 정수에 대한 배열)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const data = inputData[1].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;N개의 정수에 대한 배열 생성&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const data = inputData[1].split(&amp;quot; &amp;quot;);

console.log(data); // [ &amp;#39;20&amp;#39;, &amp;#39;10&amp;#39;, &amp;#39;35&amp;#39;, &amp;#39;30&amp;#39;, &amp;#39;7&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;N&lt;/code&gt;개의 정수에 해당하는 요소인 &lt;code&gt;inputData[1]&lt;/code&gt;에 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;에 공백을 의미하는 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt;을 매개변수로 넣어 &lt;code&gt;N&lt;/code&gt;개의 정수에 대한 배열을 생성합니다.&lt;/p&gt;
&lt;h5&gt;배열 형식 숫자로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const data = inputData[1].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);

console.log(data); // [ 20, 10, 35, 30, 7 ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;map()&lt;/h6&gt;
&lt;p&gt;생성된 배열의 형식은 문자열입니다. 배열의 형식을 숫자 형식으로 변환하기 위해 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 매개변수 &lt;code&gt;callback&lt;/code&gt; 함수를 &lt;code&gt;(value) =&amp;gt; +value&lt;/code&gt;로 하여 모든 배열내의 요소가 &lt;u&gt;숫자 형식으로 변환&lt;/u&gt;되게 합니다.&lt;/p&gt;
&lt;h4&gt;maximun (최댓값)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const maximum = Math.max(...data);

console.log(maximun); // 35&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;최댓값 반환&lt;/h5&gt;
&lt;h6&gt;Math.max()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math/max&quot;&gt;&lt;code&gt;Math.max()&lt;/code&gt;&lt;/a&gt; 함수를 통해 최댓값을 반환합니다.&lt;/p&gt;
&lt;h6&gt;전개 구문&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const maximum1 = Math.max(...data);
console.log(maximum1); // 35

const maximum2 = Math.max(20, 10, 35, 30, 7);
console.log(maximum2); // 35

// maximum1과 maximum2 모두 같다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Math.max()&lt;/code&gt; 함수 내에 매개변수로 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Spread_syntax&quot;&gt;전개 구문&lt;/a&gt;을 활용해 &lt;u&gt;배열 내 요소&lt;/u&gt;를 &lt;code&gt;...data&lt;/code&gt;로 넣습니다.&lt;/p&gt;
&lt;h4&gt;minimum (최솟값)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const minimum = Math.min(...data);

console.log(minimum); // 7&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;최솟값 반환&lt;/h5&gt;
&lt;h6&gt;Math.min()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math/min&quot;&gt;&lt;code&gt;Math.min()&lt;/code&gt;&lt;/a&gt; 함수를 통해 최솟값을 반환합니다.&lt;/p&gt;
&lt;h6&gt;전개 구문&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const minimum1 = Math.min(...data);
console.log(minimum1); // 7

const minimum2 = Math.max(20, 10, 35, 30, 7);
console.log(minimum2); // 7

// minimum1과 minimum2 모두 같다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Math.min()&lt;/code&gt; 함수 내에 매개변수로 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Spread_syntax&quot;&gt;전개 구문&lt;/a&gt;을 활용해 &lt;u&gt;배열 내 요소&lt;/u&gt;를 &lt;code&gt;...data&lt;/code&gt;로 넣습니다.&lt;/p&gt;
&lt;h4&gt;결과값 출력하기&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(minimum, maximum); // 7 35&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;console.log()&lt;/h5&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 &lt;code&gt;minimum&lt;/code&gt;과 &lt;code&gt;maximum&lt;/code&gt;을 출력합니다.&lt;/p&gt;
&lt;h2&gt;2. 최댓값&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2562&quot;&gt;https://www.acmicpc.net/problem/2562&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;최댓값

문제
9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.

예를 들어, 서로 다른 9개의 자연수

3, 29, 38, 12, 57, 74, 40, 85, 61

이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.

입력
첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.

출력
첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.

예제 입력 1
3
29
38
12
57
74
40
85
61

예제 출력 1
85
8&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;src/index.txt&amp;quot;)
  .toString()
  .split(&amp;quot;\n&amp;quot;)
  .map((value) =&amp;gt; +value);

const maximum = Math.max(...inputData);
const index = inputData.findIndex((value) =&amp;gt; value === maximum) + 1;

console.log(`${maximum}
${index}`);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData (입력값)&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 33 0a 32 39 0a 33 38 0a 31 32 0a 35 37 0a 37 34 0a 34 30 0a 38 35 0a 36 31&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;문자열 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData);
// 3
// 29
// 38
// 12
// 57
// 74
// 40
// 85
// 61&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;toString()&lt;/h6&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;배열 생성&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

console.log(inputData);
// [
//   &amp;#39;3&amp;#39;,  &amp;#39;29&amp;#39;, &amp;#39;38&amp;#39;,
//   &amp;#39;12&amp;#39;, &amp;#39;57&amp;#39;, &amp;#39;74&amp;#39;,
//   &amp;#39;40&amp;#39;, &amp;#39;85&amp;#39;, &amp;#39;61&amp;#39;
// ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;을 활용하여 매개변수에 다음줄을 의미하는 &lt;code&gt;&amp;quot;\n&amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h5&gt;배열 형식 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;)
  .map((value) =&amp;gt; +value);

console.log(inputData);
// [
//    3, 29, 38, 12, 57,
//   74, 40, 85, 61
// ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;map()&lt;/h6&gt;
&lt;p&gt;생성된 배열의 형식은 문자열입니다. 배열의 형식을 숫자 형식으로 변환하기 위해 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 매개변수 &lt;code&gt;callback&lt;/code&gt; 함수를 &lt;code&gt;(value) =&amp;gt; +value&lt;/code&gt;로 하여 모든 배열 내부의 요소가 &lt;u&gt;숫자 형식으로 변환&lt;/u&gt;되게 합니다.&lt;/p&gt;
&lt;h4&gt;maximun (최댓값)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const maximum = Math.max(...inputData);

console.log(maximun); // 85&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;최댓값 반환&lt;/h5&gt;
&lt;h6&gt;Math.max()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math/max&quot;&gt;&lt;code&gt;Math.max()&lt;/code&gt;&lt;/a&gt; 함수를 통해 최댓값을 반환합니다.&lt;/p&gt;
&lt;h6&gt;전개 구문&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const maximum1 = Math.max(...inputData);
console.log(maximum1); // 85

const maximum2 = Math.max(3, 29, 38, 12, 57, 74, 40, 85, 61);
console.log(maximum2); // 85

// maximum1과 maximum2 모두 같다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Math.max()&lt;/code&gt; 함수 내에 매개변수로 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Spread_syntax&quot;&gt;전개 구문&lt;/a&gt;을 활용해 &lt;u&gt;배열 내 요소&lt;/u&gt;를 &lt;code&gt;inputData&lt;/code&gt;로 넣습니다.&lt;/p&gt;
&lt;h4&gt;index (최댓값 배열의 위치)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const index = inputData.findIndex((value) =&amp;gt; value === maximum) + 1;

console.log(index); // 8&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;배열에서 최댓값 index 위치 찾기&lt;/h5&gt;
&lt;h6&gt;findIndex&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;inputData&lt;/code&gt; 배열에서 매개변수로 &lt;code&gt;(value) =&amp;gt; value === maximum&lt;/code&gt; 즉 &lt;u&gt;배열의 각 요소를 순환하며 최댓값과 일치하는 요소&lt;/u&gt;를 찾는 &lt;code&gt;callback&lt;/code&gt; 함수를 가지는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex&quot;&gt;&lt;code&gt;findIndex&lt;/code&gt;&lt;/a&gt; 메서드를 통해 &lt;u&gt;최댓값에 해당하는 &lt;code&gt;index&lt;/code&gt;&lt;/u&gt;를 찾습니다.&lt;/p&gt;
&lt;p&gt;배열의 요소들은 처음 시작할 떄 &lt;code&gt;index&lt;/code&gt;를 &lt;code&gt;0&lt;/code&gt;을 가집니다. 시작하는 배열의 &lt;code&gt;index&lt;/code&gt;가 &lt;code&gt;1&lt;/code&gt; 이어야함으로 &lt;code&gt;1&lt;/code&gt;을 더해줍니다.&lt;/p&gt;
&lt;h4&gt;결과값 출력하기&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(`${maximum}
${index}`);
// 85
// 8&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;console.log()&lt;/h5&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals&quot;&gt;Templete literals&lt;/a&gt;을 활용하여 &lt;code&gt;maximum&lt;/code&gt;과 &lt;code&gt;index&lt;/code&gt;를 줄바꿈을 하여 출력합니다.&lt;/p&gt;
&lt;h2&gt;3. 숫자의 개수&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2577&quot;&gt;https://www.acmicpc.net/problem/2577&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;숫자의 개수

문제
세 개의 자연수 A, B, C가 주어질 때 A × B × C를 계산한 결과에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오.

예를 들어 A = 150, B = 266, C = 427 이라면 A × B × C = 150 × 266 × 427 = 17037300 이 되고, 계산한 결과 17037300 에는 0이 3번, 1이 1번, 3이 2번, 7이 2번 쓰였다.

입력
첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다.

출력
첫째 줄에는 A × B × C의 결과에 0 이 몇 번 쓰였는지 출력한다. 마찬가지로 둘째 줄부터 열 번째 줄까지 A × B × C의 결과에 1부터 9까지의 숫자가 각각 몇 번 쓰였는지 차례로 한 줄에 하나씩 출력한다.

예제 입력 1
150
266
427

예제 출력 1
3
1
0
2
0
0
0
2
0
0&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;)
  .map((value) =&amp;gt; +value);

const [A, B, C] = inputData;
const multiplied = A * B * C;

for (let i = 0; i &amp;lt; 10; i++) {
  const countOfEachDigit = String(multiplied)
    .split(&amp;quot;&amp;quot;)
    .filter((value) =&amp;gt; +value === i).length;

  console.log(countOfEachDigit);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData (입력값)&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 31 35 30 0a 32 36 36 0a 34 32 37&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;문자열 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData);
// 150
// 266
// 427&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;toString()&lt;/h6&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;배열 생성&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

console.log(inputData); // [ &amp;#39;150&amp;#39;, &amp;#39;266&amp;#39;, &amp;#39;427&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;을 활용하여 매개변수에 다음줄을 의미하는 &lt;code&gt;&amp;quot;\n&amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h5&gt;배열 형식 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;)
  .map((value) =&amp;gt; +value);

console.log(inputData); // [ 150, 266, 427 ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;map()&lt;/h6&gt;
&lt;p&gt;생성된 배열의 형식은 문자열입니다. 배열의 형식을 숫자 형식으로 변환하기 위해 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 매개변수 &lt;code&gt;callback&lt;/code&gt; 함수를 &lt;code&gt;(value) =&amp;gt; +value&lt;/code&gt;로 하여 모든 배열 내부의 요소가 &lt;u&gt;숫자 형식으로 변환&lt;/u&gt;되게 합니다.&lt;/p&gt;
&lt;h4&gt;A, B, C (세 개의 자연수)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [A, B, C] = inputData;

console.log(A, B, C); // 160 266 427&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;배열 구조 분해&lt;/h5&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;를 통해 배열 &lt;code&gt;inputData&lt;/code&gt;의 세 가지 요소를 각각 &lt;code&gt;A&lt;/code&gt;, &lt;code&gt;B&lt;/code&gt;, &lt;code&gt;C&lt;/code&gt;에 할당합니다.&lt;/p&gt;
&lt;h4&gt;multiplied (A, B, C를 곱한 값)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const multiplied = A * B * C;

console.log(multiplied); // 17037300&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;A&lt;/code&gt;, &lt;code&gt;B&lt;/code&gt;, &lt;code&gt;C&lt;/code&gt;를 곱한 값을 &lt;code&gt;multiplied&lt;/code&gt;라는 변수로 할당합니다.&lt;/p&gt;
&lt;h4&gt;for&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt; 10; i++) {
  const countOfEachDigit = String(multiplied)
    .split(&amp;quot;&amp;quot;)
    .filter((value) =&amp;gt; +value === i).length;

  console.log(countOfEachDigit);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt; 10; i++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for&quot;&gt;for&lt;/a&gt;문을 활용하여 &lt;code&gt;i&lt;/code&gt;의 범위를 0부터 9까지 하여 &lt;code&gt;multiplied&lt;/code&gt;의 각 자리의 숫자가 몇 번씩 쓰였는지 구합니다.&lt;/p&gt;
&lt;h5&gt;countOfEachDigit (각각의 숫자가 쓰인 횟수)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt; 10; i++) {
  const countOfEachDigit = String(multiplied)
    .split(&amp;quot;&amp;quot;)
    .filter((value) =&amp;gt; +value === i).length;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;String() (문자열 형식으로 변환)&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const countOfEachDigit = String(multiplied);

console.log(countOfEachDigit); // 17037300&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String&quot;&gt;&lt;code&gt;String()&lt;/code&gt;&lt;/a&gt;을 활용하여 숫자 형식으로 된 &lt;code&gt;multiplied&lt;/code&gt;를 문자열 형식으로 변환합니다.&lt;/p&gt;
&lt;h6&gt;split() (각 자리의 숫자로 이루어진 요소로 배열화)&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const countOfEachDigit = String(multiplied).split(&amp;quot;&amp;quot;);

console.log(countOfEachDigit);
// [
//   &amp;#39;1&amp;#39;, &amp;#39;7&amp;#39;, &amp;#39;0&amp;#39;,
//   &amp;#39;3&amp;#39;, &amp;#39;7&amp;#39;, &amp;#39;3&amp;#39;,
//   &amp;#39;0&amp;#39;, &amp;#39;0&amp;#39;
// ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;매개변수가 &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;가 포함된 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt; 메서드를 활용해 문자열 형식으로 변환된 &lt;code&gt;multiplied&lt;/code&gt;를 &lt;u&gt;각 문자를 요소로 가지는&lt;/u&gt; 문자열 형식의 배열로 만듭니다.&lt;/p&gt;
&lt;h6&gt;filter() (일치하는 값이 포함된 새로운 배열)&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt; 10; i++) {
  const countOfEachDigit = String(multiplied)
    .split(&amp;quot;&amp;quot;)
    .filter((value) =&amp;gt; +value === i);

  console.log(countOfEachDigit);
  // [ &amp;#39;0&amp;#39;, &amp;#39;0&amp;#39;, &amp;#39;0&amp;#39; ]
  // [ &amp;#39;1&amp;#39; ]
  // []
  // [ &amp;#39;3&amp;#39;, &amp;#39;3&amp;#39; ]
  // []
  // []
  // []
  // [ &amp;#39;7&amp;#39;, &amp;#39;7&amp;#39; ]
  // []
  // []
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;매개변수로 &lt;u&gt;각 배열의 요소가 &lt;code&gt;i&lt;/code&gt;와 일치하면 반환하는&lt;/u&gt; &lt;code&gt;(value) =&amp;gt; +value === i&lt;/code&gt;인 &lt;code&gt;callback&lt;/code&gt; 함수를 가지는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/filter&quot;&gt;&lt;code&gt;filter()&lt;/code&gt;&lt;/a&gt; 메서드를 활용해 &lt;code&gt;i&lt;/code&gt;와 일치하는 값이 반환된 새로운 배열을 반환합니다.&lt;/p&gt;
&lt;h6&gt;length (배열의 길이)&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt; 10; i++) {
  const countOfEachDigit = String(multiplied)
    .split(&amp;quot;&amp;quot;)
    .filter((value) =&amp;gt; +value === i).length;

  console.log(countOfEachDigit);
  // 3
  // 1
  // 0
  // 2
  // 0
  // 0
  // 0
  // 2
  // 0
  // 0
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그 후 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/length&quot;&gt;&lt;code&gt;length&lt;/code&gt;&lt;/a&gt; 속성으로 배열마다의 길이를 구합니다.&lt;/p&gt;
&lt;h6&gt;console.log (개수 출력)&lt;/h6&gt;
&lt;p&gt;마지막으로 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt;을 활용하여 출력하면 각각의 숫자가 몇 번씩 쓰였는지 개수를 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;4. 나머지&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/3052&quot;&gt;https://www.acmicpc.net/problem/3052&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;나머지

문제
두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.

수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.

입력
첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.

출력
첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.

예제 입력 1
1
2
3
4
5
6
7
8
9
10

예제 출력 1
10

각 수를 42로 나눈 나머지는 1, 2, 3, 4, 5, 6, 7, 8, 9, 10이다.

예제 입력 2
42
84
252
420
840
126
42
84
420
126

예제 출력 2
1

모든 수를 42로 나눈 나머지는 0이다.

예제 입력 3
39
40
41
42
43
44
82
83
84
85

예제 출력 3
6

각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다.&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .trim()
  .split(&amp;quot;\n&amp;quot;);

const remainder = inputData.map((value) =&amp;gt; +value % 42);

const deduplication = remainder.filter(
  (value, index) =&amp;gt; remainder.indexOf(value) === index
);

console.log(deduplication.length);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData (입력값)&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 33 39 0a 34 30 0a 34 31 0a 34 32 0a 34 33 0a 34 34 0a 38 32 0a 38 33 0a 38 34 0a 38 35&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;문자열 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData);
// 39
// 40
// 41
// 42
// 43
// 44
// 82
// 83
// 84
// 85&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;toString()&lt;/h6&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;공백 제거&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .trim();

console.log(inputData);
// 39
// 40
// 41
// 42
// 43
// 44
// 82
// 83
// 84
// 85&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;trim()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/Trim&quot;&gt;&lt;code&gt;trim()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 &lt;u&gt;문자열 양 끝의 공백을 제거&lt;/u&gt;합니다.&lt;/p&gt;
&lt;h5&gt;배열 생성&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

console.log(inputData);
// [
//   &amp;#39;39&amp;#39;, &amp;#39;40&amp;#39;, &amp;#39;41&amp;#39;,
//   &amp;#39;42&amp;#39;, &amp;#39;43&amp;#39;, &amp;#39;44&amp;#39;,
//   &amp;#39;82&amp;#39;, &amp;#39;83&amp;#39;, &amp;#39;84&amp;#39;,
//   &amp;#39;85&amp;#39;
// ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;을 활용하여 매개변수에 다음줄을 의미하는 &lt;code&gt;&amp;quot;\n&amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h4&gt;remainder (나머지)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const remainder = inputData.map((value) =&amp;gt; +value % 42);

console.log(remainder);
// [
//   39, 40, 41, 0, 1,
//    2, 40, 41, 0, 1
// ]&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;42로 나눈 나머지로 이루어진 배열&lt;/h5&gt;
&lt;h6&gt;map()&lt;/h6&gt;
&lt;p&gt;각 수를 42로 나눈 나머지를 구하기 위해서 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 매개변수 &lt;code&gt;callback&lt;/code&gt; 함수를 &lt;code&gt;(value) =&amp;gt; +value % 42&lt;/code&gt;로 하여 모든 배열 내부의 요소를 &lt;u&gt;문자열에서 숫자 형식으로 바꾼 후 42로 나눈 나머지를&lt;/u&gt; 반환합니다.&lt;/p&gt;
&lt;h4&gt;deduplication (중복 제거)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const deduplication = remainder.filter(
  (value, index) =&amp;gt; remainder.indexOf(value) === index
);

console.log(deduplication); // [ 39, 40, 41, 0, 1, 2 ]&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;배열 내 중복 요소 제거&lt;/h5&gt;
&lt;h6&gt;filter()&lt;/h6&gt;
&lt;p&gt;매개변수로 &lt;u&gt;&lt;code&gt;indexOf(value)&lt;/code&gt;가 &lt;code&gt;index&lt;/code&gt;와 일치하면 반환하는&lt;/u&gt; &lt;code&gt;(value, index) =&amp;gt; reaminder.indexOf(value) === index&lt;/code&gt;인 &lt;code&gt;callback&lt;/code&gt; 함수를 가지는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/filter&quot;&gt;&lt;code&gt;filter()&lt;/code&gt;&lt;/a&gt; 메서드를 활용합니다.&lt;/p&gt;
&lt;h6&gt;indexOf()&lt;/h6&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;&lt;code&gt;indexOf(value)&lt;/code&gt;&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;&lt;code&gt;index&lt;/code&gt;&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;&lt;code&gt;value&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;39&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;40&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;41&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;5&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;5&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;6&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;40&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;7&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;41&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;8&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;39&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;9&lt;/code&gt;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;40&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;위 표와 같이 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf&quot;&gt;&lt;code&gt;indexOf&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 &lt;u&gt;배열에서 지정된 요소를 찾을 수 있는 첫 번째&lt;/u&gt;에만 인덱스를 부여합니다.&lt;/p&gt;
&lt;p&gt;따라서 &lt;code&gt;fliter()&lt;/code&gt;의 &lt;code&gt;callback&lt;/code&gt; 함수인 &lt;code&gt;(value, index) =&amp;gt; reaminder.indexOf(value) === index&lt;/code&gt;에 의한 새로운 배열은 &lt;u&gt;&lt;code&gt;index(value)&lt;/code&gt;의 값과 &lt;code&gt;index&lt;/code&gt;의 값이 일치하는 것만 반환&lt;/u&gt;하므로 &lt;code&gt;[ 39, 40, 41, 0, 1, 2 ]&lt;/code&gt;가 됩니다.&lt;/p&gt;
&lt;h4&gt;중복 제거된 배열의 길이 출력&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(deduplication.length); // 6&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;console.log(), length&lt;/h5&gt;
&lt;p&gt;마지막으로 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt;와 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/length&quot;&gt;&lt;code&gt;length&lt;/code&gt;&lt;/a&gt; 속성을 활용하여 &lt;code&gt;deduplication.length&lt;/code&gt; 즉 중복을 제거한 배열의 길이를 출력합니다.&lt;/p&gt;
&lt;h2&gt;5. 평균&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1546&quot;&gt;https://www.acmicpc.net/problem/1546&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;평균

문제
세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.

예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.

세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.

입력
첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.

출력
첫째 줄에 새로운 평균을 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다.

예제 입력 1
3
40 80 60

예제 출력 1
75.0

예제 입력 2
3
10 20 30

예제 출력 2
66.666667
10-2 이하의 오차를 허용한다는 말은 정확히 소수 2번째 자리까지 출력하라는 뜻이 아니다.

예제 입력 3
4
1 100 100 100

예제 출력 3
75.25

예제 입력 4
5
1 2 4 8 16

예제 출력 4
38.75

예제 입력 5
2
3 10

예제 출력 5
65.0

예제 입력 6
4
10 20 0 100

예제 출력 6
32.5

예제 입력 7
1
50

예제 출력 7
100.0

예제 입력 8
9
10 20 30 40 50 60 70 80 90

예제 출력 8
55.55555555555556&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .trim()
  .split(&amp;quot;\n&amp;quot;);

const [N, inputDataScores] = inputData;
const scores = inputDataScores.split(&amp;quot; &amp;quot;);
const M = Math.max(...scores);
const newScores = scores.map((score) =&amp;gt; (score / M) * 100);

let sum = 0;

for (let i = 0; i &amp;lt; N; i++) {
  sum += newScores[i];
}

console.log(sum / N);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData (입력값)&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 33 0a 31 30 20 32 30 20 33 30&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;문자열 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData);
// 3
// 10 20 30&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;toString()&lt;/h6&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;공백 제거&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .trim();

console.log(inputData);
// 3
// 10 20 30&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;trim()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/Trim&quot;&gt;&lt;code&gt;trim()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 &lt;u&gt;문자열 양 끝의 공백을 제거&lt;/u&gt;합니다.&lt;/p&gt;
&lt;h5&gt;배열 생성&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

console.log(inputData); // [ &amp;#39;3&amp;#39;, &amp;#39;10 20 30&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;을 활용하여 매개변수에 다음줄을 의미하는 &lt;code&gt;&amp;quot;\n&amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h4&gt;N, inputDataScores&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [N, inputDataScores] = inputData;

console.log(N, inputDataScores); // 3 10 20 30&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;시험 본 과목의 개수, 현재 성적&lt;/h5&gt;
&lt;h6&gt;배열 구조 분해&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;를 통해 배열 &lt;code&gt;inputData&lt;/code&gt;의 두 가지 요소들을 각각 시험 본 과목의 개수를 의미하는 &lt;code&gt;N&lt;/code&gt;, 현재 성적을 의미하는 &lt;code&gt;inputDataScores&lt;/code&gt;에 할당합니다.&lt;/p&gt;
&lt;h4&gt;scores&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const scores = inputDataScores.split(&amp;quot; &amp;quot;);

console.log(scores); // [ &amp;#39;10&amp;#39;, &amp;#39;20&amp;#39;, &amp;#39;30&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;성적에 대한 배열 생성&lt;/h5&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;p&gt;성적에 대한 변수인 &lt;code&gt;inputDataScores&lt;/code&gt;를 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;을 활용하여 매개변수에 공백을 의미하는 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h4&gt;M&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const M = Math.max(...scores);

console.log(M); // 30&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;성적 중 최댓값&lt;/h5&gt;
&lt;h6&gt;Math.max()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math/max&quot;&gt;&lt;code&gt;Math.max()&lt;/code&gt;&lt;/a&gt; 함수를 통해 성적 중 최댓값을 반환하여 &lt;code&gt;M&lt;/code&gt; 변수에 할당합니다.&lt;/p&gt;
&lt;h6&gt;전개 구문&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;Math.max()&lt;/code&gt; 함수 내에 매개변수로 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Spread_syntax&quot;&gt;전개 구문&lt;/a&gt;을 활용해 배열 &lt;code&gt;scores&lt;/code&gt;의 요소들을 넣습니다.&lt;/p&gt;
&lt;h4&gt;newScores&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const newScores = scores.map((score) =&amp;gt; (score / M) * 100);

console.log(newScores); // [ 33.33333333333333, 66.66666666666666, 100 ]&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;성적을 고친 값&lt;/h5&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h6&gt;map()&lt;/h6&gt;
&lt;p&gt;기존의 점수인 &lt;code&gt;scores&lt;/code&gt;에 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 매개변수 &lt;code&gt;callback&lt;/code&gt; 함수를 위 주석대로 &lt;code&gt;(score) =&amp;gt; (score / M) * 100&lt;/code&gt;로 하여 &lt;u&gt;각 점수들을 최댓값으로 나눈 후 &lt;code&gt;100&lt;/code&gt;을 곱하여 조작한 값들에 대한&lt;/u&gt; 새로운 배열을 반환하고 &lt;code&gt;newScores&lt;/code&gt; 변수에 할당합니다.&lt;/p&gt;
&lt;h4&gt;sum&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let sum = 0;&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;조작된 점수들의 합&lt;/h5&gt;
&lt;p&gt;&lt;u&gt;조작된 점수들의 합을 위한 변수&lt;/u&gt;인 &lt;code&gt;sum&lt;/code&gt;에 &lt;code&gt;0&lt;/code&gt;으로 초기화합니다.&lt;/p&gt;
&lt;h4&gt;for&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt; N; i++) {
  sum += newScores[i];
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt; N; i++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for&quot;&gt;for&lt;/a&gt;문으로 조작된 점수들의 합을 구하기 위하여 &lt;code&gt;i&lt;/code&gt;를 &lt;code&gt;0&lt;/code&gt;부터 &lt;code&gt;N&lt;/code&gt;이전까지로 반복문의 범위를 정합니다.&lt;/p&gt;
&lt;h5&gt;조작된 점수들 합하기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt; N; i++) {
  sum += newScores[i];

  console.log(sum);
  // 33.33333333333333
  // 99.99999999999999
  // 200
}&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;더하기 할당&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;newScore[0]&lt;/code&gt;부터 &lt;code&gt;newScore[N-1]&lt;/code&gt;까지 &lt;code&gt;sum&lt;/code&gt;에 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Addition_assignment&quot;&gt;더하기 할당&lt;/a&gt;합니다.&lt;/p&gt;
&lt;h4&gt;조작된 점수들의 합에 과목 개수 나누기&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(sum / N); // 66.66666666666667&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;console.log()&lt;/h5&gt;
&lt;p&gt;마지막으로 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt;을 활용하여 &lt;code&gt;sum / N&lt;/code&gt; 즉 &lt;u&gt;조작된 과목들에 과목의 개수를 나눈 값&lt;/u&gt;을 출력합니다.&lt;/p&gt;
&lt;h2&gt;6. OX퀴즈&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/8958&quot;&gt;https://www.acmicpc.net/problem/8958&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;OX퀴즈

문제
&amp;quot;OOXXOXXOOO&amp;quot;와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.

&amp;quot;OOXXOXXOOO&amp;quot;의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.

OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

입력
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.

출력
각 테스트 케이스마다 점수를 출력한다.

예제 입력 1
5
OOXXOXXOOO
OOXXOOXXOO
OXOXOXOXOXOXOX
OOOOOOOOOO
OOOOXOOOOXOOOOX

예제 출력 1
10
9
7
55
30&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .trim()
  .split(&amp;quot;\n&amp;quot;);

const count = inputData[0];

for (let i = 1; i &amp;lt;= count; i++) {
  let value = 0;
  let sum = 0;

  const quizs = inputData[i].split(&amp;quot;&amp;quot;);
  const newQuizs = quizs.map((quiz) =&amp;gt; {
    if (quiz === &amp;quot;O&amp;quot;) {
      value += 1;
      return value;
    }
    if (quiz === &amp;quot;X&amp;quot;) {
      value = 0;
      return value;
    }
    return quiz;
  });

  for (y = 0; y &amp;lt; newQuizs.length; y++) {
    sum += newQuizs[y];
  }

  console.log(sum);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData (입력값)&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 35 0a 4f 4f 58 58 4f 58 58 4f 4f 4f 0a 4f 4f 58 58 4f 4f 58 58 4f 4f 0a 4f 58 4f 58 4f 58 4f 58 4f 58 4f 58 4f 58 0a 4f 4f 4f 4f 4f 4f 4f 4f 4f 4f 0a ... 15 more bytes&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;문자열 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData);
// 5
// OOXXOXXOOO
// OOXXOOXXOO
// OXOXOXOXOXOXOX
// OOOOOOOOOO
// OOOOXOOOOXOOOOX&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;toString()&lt;/h6&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;공백 제거&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .trim();

console.log(inputData);
// 5
// OOXXOXXOOO
// OOXXOOXXOO
// OXOXOXOXOXOXOX
// OOOOOOOOOO
// OOOOXOOOOXOOOOX&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;trim()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/Trim&quot;&gt;&lt;code&gt;trim()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 &lt;u&gt;문자열 양 끝의 공백을 제거&lt;/u&gt;합니다.&lt;/p&gt;
&lt;h5&gt;배열 생성&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

console.log(inputData);
// [
//   &amp;#39;5&amp;#39;,
//   &amp;#39;OOXXOXXOOO&amp;#39;,
//   &amp;#39;OOXXOOXXOO&amp;#39;,
//   &amp;#39;OXOXOXOXOXOXOX&amp;#39;,
//   &amp;#39;OOOOOOOOOO&amp;#39;,
//   &amp;#39;OOOOXOOOOXOOOOX&amp;#39;
// ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;을 활용하여 매개변수에 다음줄을 의미하는 &lt;code&gt;&amp;quot;\n&amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h4&gt;count&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const count = inputData[0];

console.log(count); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;테스트 케이스의 개수&lt;/h5&gt;
&lt;p&gt;테스트 케이스의 개수를 뜻하는 &lt;code&gt;inputData[0]&lt;/code&gt;을 변수 &lt;code&gt;count&lt;/code&gt;에 할당합니다.&lt;/p&gt;
&lt;h4&gt;for (각 퀴즈 결과에 대한 반복문)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= count; i++) {
  let value = 0;
  let sum = 0;

  const quizs = inputData[i].split(&amp;quot;&amp;quot;);
  const newQuizs = quizs.map((quiz) =&amp;gt; {
    if (quiz === &amp;quot;O&amp;quot;) {
      value += 1;
      return value;
    }
    if (quiz === &amp;quot;X&amp;quot;) {
      value = 0;
      return value;
    }
    return quiz;
  });

  for (y = 0; y &amp;lt; newQuizs.length; y++) {
    sum += newQuizs[y];
  }

  console.log(sum);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= count; i++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for&quot;&gt;for&lt;/a&gt;문으로 &lt;code&gt;inputData[i]&lt;/code&gt;에 대한 반복문을 실행할 것이기 때문에 &lt;code&gt;i&lt;/code&gt;의 범위를 테스트 케이스의 개수를 의미하는 &lt;code&gt;0&lt;/code&gt;이 아닌 &lt;code&gt;1&lt;/code&gt;부터 &lt;code&gt;count&lt;/code&gt;까지로 합니다.&lt;/p&gt;
&lt;h5&gt;value (O, X에 대한 점수)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let value = 0;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;O&lt;/code&gt;과 &lt;code&gt;X&lt;/code&gt;에 대한 점수를 의미하는 변수 &lt;code&gt;value&lt;/code&gt;를 선언하고 &lt;code&gt;0&lt;/code&gt;으로 초기화합니다.&lt;/p&gt;
&lt;h5&gt;sum (점수들의 합)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let sum = 0;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;점수들의 합산을 의미하는 변수 &lt;code&gt;sum&lt;/code&gt;을 선언하고 &lt;code&gt;0&lt;/code&gt;으로 초기화합니다.&lt;/p&gt;
&lt;h5&gt;quizs (각 OX퀴즈의 결과 배열화하기)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= count; i++) {
  let value = 0;
  let sum = 0;

  const quizs = inputData[i].split(&amp;quot;&amp;quot;);

  console.log(quizs);
}
// expected output:
// [
//   &amp;#39;O&amp;#39;, &amp;#39;O&amp;#39;, &amp;#39;X&amp;#39;, &amp;#39;X&amp;#39;,
//   &amp;#39;O&amp;#39;, &amp;#39;X&amp;#39;, &amp;#39;X&amp;#39;, &amp;#39;O&amp;#39;,
//   &amp;#39;O&amp;#39;, &amp;#39;O&amp;#39;
// ]
// [
//   &amp;#39;O&amp;#39;, &amp;#39;O&amp;#39;, &amp;#39;X&amp;#39;, &amp;#39;X&amp;#39;,
//   &amp;#39;O&amp;#39;, &amp;#39;O&amp;#39;, &amp;#39;X&amp;#39;, &amp;#39;X&amp;#39;,
//   &amp;#39;O&amp;#39;, &amp;#39;O&amp;#39;
// ]
// [
//   &amp;#39;O&amp;#39;, &amp;#39;X&amp;#39;, &amp;#39;O&amp;#39;, &amp;#39;X&amp;#39;,
//   &amp;#39;O&amp;#39;, &amp;#39;X&amp;#39;, &amp;#39;O&amp;#39;, &amp;#39;X&amp;#39;,
//   &amp;#39;O&amp;#39;, &amp;#39;X&amp;#39;, &amp;#39;O&amp;#39;, &amp;#39;X&amp;#39;,
//   &amp;#39;O&amp;#39;, &amp;#39;X&amp;#39;
// ]
// [
//   &amp;#39;O&amp;#39;, &amp;#39;O&amp;#39;, &amp;#39;O&amp;#39;, &amp;#39;O&amp;#39;,
//   &amp;#39;O&amp;#39;, &amp;#39;O&amp;#39;, &amp;#39;O&amp;#39;, &amp;#39;O&amp;#39;,
//   &amp;#39;O&amp;#39;, &amp;#39;O&amp;#39;
// ]
// [
//   &amp;#39;O&amp;#39;, &amp;#39;O&amp;#39;, &amp;#39;O&amp;#39;, &amp;#39;O&amp;#39;,
//   &amp;#39;X&amp;#39;, &amp;#39;O&amp;#39;, &amp;#39;O&amp;#39;, &amp;#39;O&amp;#39;,
//   &amp;#39;O&amp;#39;, &amp;#39;X&amp;#39;, &amp;#39;O&amp;#39;, &amp;#39;O&amp;#39;,
//   &amp;#39;O&amp;#39;, &amp;#39;O&amp;#39;, &amp;#39;X&amp;#39;
// ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;p&gt;매개변수 &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;를 가지는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 &lt;u&gt;문자열에 있는 각 문자들을 요소로 가지는 배열&lt;/u&gt;로 배열화한 후 &lt;code&gt;quizs&lt;/code&gt; 변수에 할당합니다.&lt;/p&gt;
&lt;h5&gt;newQuizs (점수를 매긴 각 OX퀴즈들의 배열)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= count; i++) {
  let value = 0;
  let sum = 0;

  const quizs = inputData[i].split(&amp;quot;&amp;quot;);
  const newQuizs = quizs.map((quiz) =&amp;gt; {
    if (quiz === &amp;quot;O&amp;quot;) {
      value += 1;
      return value;
    }
    if (quiz === &amp;quot;X&amp;quot;) {
      value = 0;
      return value;
    }
    return quiz;
  });

  console.log(newQuizs);
}
// expected output:
// [
//   1, 2, 0, 0, 1,
//   0, 0, 1, 2, 3
// ]
// [
//   1, 2, 0, 0, 1,
//   2, 0, 0, 1, 2
// ]
// [
//   1, 0, 1, 0, 1, 0,
//   1, 0, 1, 0, 1, 0,
//   1, 0
// ]
// [
//   1, 2, 3, 4,  5,
//   6, 7, 8, 9, 10
// ]
// [
//   1, 2, 3, 4, 0, 1,
//   2, 3, 4, 0, 1, 2,
//   3, 4, 0
// ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;map()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const newQuizs = quizs.map((quiz) =&amp;gt; {
  if (quiz === &amp;quot;O&amp;quot;) {
    value += 1;
    return value;
  }
  if (quiz === &amp;quot;X&amp;quot;) {
    value = 0;
    return value;
  }
  return quiz;
});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 매개변수 &lt;code&gt;callback&lt;/code&gt; 함수 내의 if...else문으로 &lt;code&gt;O&lt;/code&gt;와 &lt;code&gt;X&lt;/code&gt;별로 점수를 매깁니다. 그 후 과정이 끝나면 값을 &lt;code&gt;newQuizs&lt;/code&gt; 변수에 할당합니다.&lt;/p&gt;
&lt;h6&gt;if...else&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;if (quiz === &amp;quot;O&amp;quot;) {
  value += 1;
  return value;
}
if (quiz === &amp;quot;X&amp;quot;) {
  value = 0;
  return value;
}
return quiz;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&amp;quot;OOXXOXXOOO&amp;quot;의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;퀴즈의 값이 &lt;code&gt;O&lt;/code&gt;인 경우&lt;/p&gt;
&lt;p&gt;점수는 연속된 &lt;code&gt;O&lt;/code&gt;의 개수가 되기 때문에 &lt;code&gt;X&lt;/code&gt;가 나오기 전까진 &lt;code&gt;1&lt;/code&gt;씩 증가해야합니다. 따라서 더하기 할당을 통해 &lt;code&gt;value += 1&lt;/code&gt; 즉 &lt;code&gt;value&lt;/code&gt; 값이 &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;1&lt;/code&gt;, &lt;code&gt;2&lt;/code&gt; 이런식으로 할당시키고, 할당된 &lt;code&gt;value&lt;/code&gt; 값을 배열 내 요소에 반환합니다.&lt;/p&gt;
&lt;p&gt;퀴즈의 값이 &lt;code&gt;X&lt;/code&gt;인 경우&lt;/p&gt;
&lt;p&gt;배열의 요소가 &lt;code&gt;X&lt;/code&gt;가 나오는 순간 점수는 &lt;code&gt;0&lt;/code&gt;점이 됩니다. 그러므로 &lt;code&gt;value = 0&lt;/code&gt; 즉 &lt;code&gt;value&lt;/code&gt; 값을 &lt;code&gt;0&lt;/code&gt;으로 초기화시킵니다. 그리고 그 값을 &lt;code&gt;X&lt;/code&gt;인 배열의 요소에 반환합니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;O&lt;/code&gt;, &lt;code&gt;X&lt;/code&gt; 둘 다 아닌 경우&lt;/p&gt;
&lt;p&gt;둘 다 아닌 경우는 문제상 존재하진 않지만 &lt;code&gt;quiz&lt;/code&gt; 즉 배열의 요소 그대로 반환합니다.&lt;/p&gt;
&lt;h5&gt;for (점수 합하기)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (y = 0; y &amp;lt; newQuizs.length; y++) {
  sum += newQuizs[y];
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (y = 0; y &amp;lt; newQuizs.length; y++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;배열 내의 모든 점수를 합해야하기 때문에 변수 &lt;code&gt;y&lt;/code&gt;의 범위를 시작인 &lt;code&gt;0&lt;/code&gt;부터 &lt;code&gt;newQuizs&lt;/code&gt; 배열의 전체 길이를 의미하는 &lt;code&gt;newQuizs.length&lt;/code&gt; 전까지 반복문을 수행하게 합니다.&lt;/p&gt;
&lt;h6&gt;더하기 할당&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (y = 0; y &amp;lt; newQuizs.length; y++) {
  sum += newQuizs[y];
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Addition_assignment&quot;&gt;더하기 할당&lt;/a&gt;을 통해 &lt;code&gt;newQuize&lt;/code&gt; 배열 내의 모든 요소들을 합하여 &lt;code&gt;sum&lt;/code&gt;에 할당합니다.&lt;/p&gt;
&lt;h5&gt;console.log()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(sum);
// 10
// 9
// 7
// 55
// 30&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;마지막으로 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt;을 활용하여 &lt;code&gt;sum&lt;/code&gt;을 출력합니다.&lt;/p&gt;
&lt;h2&gt;7. 평균은 넘겠지&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/4344&quot;&gt;https://www.acmicpc.net/problem/4344&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;평균은 넘겠지

문제
대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

입력
첫째 줄에는 테스트 케이스의 개수 C가 주어진다.

둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.

출력
각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.

예제 입력 1
5
5 50 50 70 80 100
7 100 95 90 80 70 60 50
3 70 90 80
3 70 90 81
9 100 99 98 97 96 95 94 93 91

예제 출력 1
40.000%
57.143%
33.333%
66.667%
55.556%&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

const C = +inputData[0];

for (let i = 1; i &amp;lt;= C; i++) {
  let sum = 0;

  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  const N = testCase[0];

  for (let y = 1; y &amp;lt;= N; y++) {
    sum += testCase[y];
  }
  const avg = sum / N;

  let overStudent = 0;
  for (let z = 1; z &amp;lt;= N; z++) {
    if (testCase[z] &amp;gt; avg) {
      overStudent++;
    }
  }
  const overAvg = ((overStudent / N) * 100).toFixed(3);

  console.log(overAvg + &amp;quot;%&amp;quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData (입력값)&lt;/h4&gt;
&lt;h5&gt;readFileSync() (파일 읽어오기)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 35 0a 35 20 35 30 20 35 30 20 37 30 20 38 30 20 31 30 30 0a 37 20 31 30 30 20 39 35 20 39 30 20 38 30 20 37 30 20 36 30 20 35 30 0a 33 20 37 30 20 39 ... 45 more bytes&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;process.platform (작동 시스템 구별)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;toString() (문자열 형식으로 변환)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData);
// 5
// 5 50 50 70 80 100
// 7 100 95 90 80 70 60 50
// 3 70 90 80
// 3 70 90 81
// 9 100 99 98 97 96 95 94 93 91&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;split() (배열 생성)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

console.log(inputData);
// [
//   &amp;#39;5&amp;#39;,
//   &amp;#39;5 50 50 70 80 100&amp;#39;,
//   &amp;#39;7 100 95 90 80 70 60 50&amp;#39;,
//   &amp;#39;3 70 90 80&amp;#39;,
//   &amp;#39;3 70 90 81&amp;#39;,
//   &amp;#39;9 100 99 98 97 96 95 94 93 91&amp;#39;
// ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;을 활용하여 매개변수에 다음줄을 의미하는 &lt;code&gt;&amp;quot;\n&amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h4&gt;C (테스트 케이스의 개수)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const C = +inputData[0];

console.log(C); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;+ (숫자 형식으로 변환)&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;inputData&lt;/code&gt;의 테스트 케이스의 개수를 뜻하는 요소 &lt;code&gt;inputData[0]&lt;/code&gt;에 숫자 형식으로 변환을 하여 &lt;code&gt;+inputData[0]&lt;/code&gt;을 변수 &lt;code&gt;C&lt;/code&gt;에 할당합니다.&lt;/p&gt;
&lt;h4&gt;for (각 테스트 케이스를 위한 반복문)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= C; i++) {
  let sum = 0;

  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  const N = testCase[0];

  for (let y = 1; y &amp;lt;= N; y++) {
    sum += testCase[y];
  }
  const avg = sum / N;

  let overStudent = 0;
  for (let z = 1; z &amp;lt;= N; z++) {
    if (testCase[z] &amp;gt; avg) {
      overStudent++;
    }
  }
  const overAvg = ((overStudent / N) * 100).toFixed(3);

  console.log(overAvg + &amp;quot;%&amp;quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= C; i++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for&quot;&gt;for&lt;/a&gt;문으로 각 테스트 케이스를 위한 즉 &lt;code&gt;inputData[i]&lt;/code&gt;에 대한 반복문을 실행할 것이기 때문에 &lt;code&gt;i&lt;/code&gt;의 범위를 테스트 케이스의 개수를 의미하는 &lt;code&gt;0&lt;/code&gt;이 아닌 &lt;code&gt;1&lt;/code&gt;부터 &lt;code&gt;C&lt;/code&gt;까지로 합니다.&lt;/p&gt;
&lt;h5&gt;sum (점수들의 합)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let sum = 0;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;점수들의 합산을 의미하는 변수 &lt;code&gt;sum&lt;/code&gt;을 선언하고 &lt;code&gt;0&lt;/code&gt;으로 초기화합니다.&lt;/p&gt;
&lt;h5&gt;testCase (각 테스트 케이스 내의 점수들의 배열)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= C; i++) {
  let sum = 0;

  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);

  console.log(testCase);
}
// expected output:
// [ 5, 50, 50, 70, 80, 100 ]
// [
//    7, 100, 95, 90,
//   80,  70, 60, 50
// ]
// [ 3, 70, 90, 80 ]
// [ 3, 70, 90, 81 ]
// [
//    9, 100, 99, 98, 97,
//   96,  95, 94, 93, 91
// ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;split() (배열 형식으로 변환)&lt;/h6&gt;
&lt;p&gt;학생의 수와 점수들을 의미하는 &lt;code&gt;inputData[i]&lt;/code&gt;로부터 공백을 의미하는 매개변수 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt;를 가지는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 &lt;u&gt;공백을 기준으로 새로운 배열을 생성&lt;/u&gt;합니다.&lt;/p&gt;
&lt;h6&gt;map() (배열 내 요소 숫자 형식으로 변환)&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 매개변수 &lt;code&gt;callback&lt;/code&gt; 함수 &lt;code&gt;(value) =&amp;gt; +value)&lt;/code&gt;로 &lt;u&gt;문자열 형식의 배열을 숫자 형식으로&lt;/u&gt; 변환한 후 &lt;code&gt;testCase&lt;/code&gt;에 할당합니다.&lt;/p&gt;
&lt;h5&gt;N (학생들의 점수의 개수)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= C; i++) {
  let sum = 0;

  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  const N = testCase[0];

  cossole.log(N);
}
// expected output:
// 5
// 7
// 3
// 3
// 9&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;testCase&lt;/code&gt;의 첫 번째 인덱스인 &lt;code&gt;testCase[0]&lt;/code&gt;에서 학생들의 점수의 수를 변수 &lt;code&gt;N&lt;/code&gt;에 할당합니다.&lt;/p&gt;
&lt;h5&gt;for (testCase 내의 점수들에 대한 반복문)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= C; i++) {
  let sum = 0;

  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  const N = testCase[0];

  for (let y = 1; y &amp;lt;= N; y++) {
    sum += testCase[y];
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let y = 1; y &amp;lt;= N; y++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;testCase&lt;/code&gt; 내부 점수들에 관한 for문이기에 &lt;code&gt;y&lt;/code&gt;의 범위를 점수의 개수를 의미하는 배열 인덱스인 &lt;code&gt;0&lt;/code&gt;이 아닌 &lt;code&gt;1&lt;/code&gt;부터 &lt;code&gt;N&lt;/code&gt;까지로 합니다.&lt;/p&gt;
&lt;h6&gt;더하기 할당&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= C; i++) {
  let sum = 0;

  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  const N = testCase[0];

  for (let y = 1; y &amp;lt;= N; y++) {
    sum += testCase[y];
  }
}

console.log(sum);
// 350
// 545
// 240
// 241
// 863&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;더하기 할당&lt;/a&gt; 연산자를 활용하여 &lt;code&gt;testCase&lt;/code&gt; 배열 내의 모든 요소들을 합하여 &lt;code&gt;sum&lt;/code&gt;에 할당합니다.&lt;/p&gt;
&lt;h5&gt;avg (점수들의 평균)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= C; i++) {
  let sum = 0;

  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  const N = testCase[0];

  for (let y = 1; y &amp;lt;= N; y++) {
    sum += testCase[y];
  }
  const avg = sum / N;

  console.log(avg);
}
// expected output:
// 70
// 77.85714285714286
// 80
// 80.33333333333333
// 95.88888888888889&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;sum&lt;/code&gt;에 점수의 개수를 의미하는 &lt;code&gt;N&lt;/code&gt;을 나눠줘 평균을 구한 후 변수 &lt;code&gt;avg&lt;/code&gt;에 할당합니다.&lt;/p&gt;
&lt;h5&gt;overStudent (평균을 넘긴 학생의 수)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let overStudent = 0;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;평균을 넘은 학생들의 수를 뜻하는 변수 &lt;code&gt;overStudent&lt;/code&gt;을 선언하고 &lt;code&gt;0&lt;/code&gt;으로 초기화합니다.&lt;/p&gt;
&lt;h5&gt;for (평균을 넘은 학생들을 추려내는 반복문)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let z = 1; z &amp;lt;= N; z++) {
  if (testCase[z] &amp;gt; avg) {
    overStudent++;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let z = 1; z &amp;lt;= N; z++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;y&lt;/code&gt;와 같이 &lt;code&gt;testCase&lt;/code&gt; 내부 점수들에 관한 for문이기에 &lt;code&gt;z&lt;/code&gt;의 범위를 개수를 의미하는 배열 인덱스인 &lt;code&gt;0&lt;/code&gt;이 아닌 &lt;code&gt;1&lt;/code&gt;부터 &lt;code&gt;N&lt;/code&gt;까지로 합니다.&lt;/p&gt;
&lt;h6&gt;if...else&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= C; i++) {
  let sum = 0;

  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  const N = testCase[0];

  for (let y = 1; y &amp;lt;= N; y++) {
    sum += testCase[y];
  }
  const avg = sum / N;

  let overStudent = 0;
  for (let z = 1; z &amp;lt;= N; z++) {
    if (testCase[z] &amp;gt; avg) {
      overStudent++;
    }
  }
}

console.log(overStudent);
// 2
// 4
// 1
// 2
// 5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/if...else&quot;&gt;if...else&lt;/a&gt;문을 통해 &lt;code&gt;testCase&lt;/code&gt; 배열의 요소들 중 &lt;code&gt;avg&lt;/code&gt;즉 평균보다 큰 요소일 경우 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Increment&quot;&gt;&lt;code&gt;Increment (++)&lt;/code&gt;&lt;/a&gt;을 통해 &lt;code&gt;overStudent++&lt;/code&gt; 즉 &lt;code&gt;overStudent&lt;/code&gt;를 하나씩 증가시켜줍니다.&lt;/p&gt;
&lt;h5&gt;overAvg (평균이 넘는 학생들의 비율)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const overAvg = ((overStudent / N) * 100).toFixed(3);

console.log(overAvg);
// 40.000
// 57.143
// 33.333
// 66.667
// 55.556&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;평균 점수를 넘는 학생들의 수인 변수 &lt;code&gt;overStudent&lt;/code&gt;에 학생들의 점수의 수인 변수 &lt;code&gt;N&lt;/code&gt;을 나눈 후 비율을 위해 &lt;code&gt;100&lt;/code&gt;을 곱해줍니다.&lt;/p&gt;
&lt;h6&gt;toFixed() (숫자를 고정 소수점 표기법으로)&lt;/h6&gt;
&lt;p&gt;그 후 매개변수로 &lt;code&gt;3&lt;/code&gt;을 가지는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed&quot;&gt;&lt;code&gt;toFixed()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 &lt;u&gt;소수점 셋째 자리까지 출력&lt;/u&gt;하도록 합니다.&lt;/p&gt;
&lt;h5&gt;결과값 출력하기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(overAvg + &amp;quot;%&amp;quot;);
// 40.000%
// 57.143%
// 33.333%
// 66.667%
// 55.556%&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;console.log()&lt;/h6&gt;
&lt;p&gt;마지막으로 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt;을 활용하여 &lt;code&gt;overAvg&lt;/code&gt;에 &lt;code&gt;%&lt;/code&gt; 기호가 필요하기 때문에 &lt;code&gt;overAvg + &amp;quot;%&lt;/code&gt;을 출력합니다.&lt;/p&gt;</description>
      <category>Nodejs</category>
      <category>BaekJoon</category>
      <category>nodejs</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/84</guid>
      <comments>https://sukvvon.tistory.com/84#entry84comment</comments>
      <pubDate>Wed, 27 Jul 2022 19:14:31 +0900</pubDate>
    </item>
    <item>
      <title>[Nodejs][백준] 단계별로 풀어보기 - 3. 반복문</title>
      <link>https://sukvvon.tistory.com/83</link>
      <description>&lt;h2&gt;1. 구구단&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2739&quot;&gt;https://www.acmicpc.net/problem/2739&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;구구단

문제
N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 출력 형식에 맞춰서 출력하면 된다.

입력
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 9보다 작거나 같다.

출력
출력형식과 같게 N*1부터 N*9까지 출력한다.

예제 입력 1
2

예제 출력 1
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = +fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

for (let i = 1; i &amp;lt; 10; i++) {
  console.log(`${inputData} * ${i} = ${inputData * i}`);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 32&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;실수 형식으로 변환&lt;/h5&gt;
&lt;h6&gt;+&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = +fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // 2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;code&gt;inputData&lt;/code&gt;로 정의하려는 식 앞에 &lt;code&gt;+&lt;/code&gt;를 붙여 실수 형식으로 변환합니다.&lt;/p&gt;
&lt;h4&gt;구구단 구하기&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt; 10; i++) {
  console.log(`${inputData} * ${i} = ${inputData * i}`);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;for&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt; 10; i++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;구구단을 출력하기 위해 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for&quot;&gt;for&lt;/a&gt; 문을 활용하여 &lt;code&gt;inputData&lt;/code&gt;으로부터 1부터 9까지 곱한 값을 구할 수 있도록 합니다.&lt;/p&gt;
&lt;h5&gt;출력하기&lt;/h5&gt;
&lt;h6&gt;console.log()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt; 10; i++) {
  console.log(`${inputData} * ${i} = ${inputData * i}`);
}

// 2 * 1 = 2
// 2 * 2 = 4
// 2 * 3 = 6
// 2 * 4 = 8
// 2 * 5 = 10
// 2 * 6 = 12
// 2 * 7 = 14
// 2 * 8 = 16
// 2 * 9 = 18&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt;와 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals&quot;&gt;Template literals&lt;/a&gt;을 활용해 for문의 &lt;code&gt;i&lt;/code&gt;값마다 &lt;code&gt;2 * 1 = 2&lt;/code&gt;와 같은 형식으로 출력할 수 있도록 합니다.&lt;/p&gt;
&lt;h2&gt;2. A+B-3&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10950&quot;&gt;https://www.acmicpc.net/problem/10950&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;A+B-3

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 &amp;lt; A, B &amp;lt; 10)

출력
각 테스트 케이스마다 A+B를 출력한다.

예제 입력 1
5
1 1
2 3
3 4
9 8
5 28

예제 출력 1
2
5
7
17
7&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

const [count] = inputData;

for (let i = 1; i &amp;lt;= +count; i++) {
  const arrayOfValue = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  const [a, b] = arrayOfValue;
  console.log(a + b);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 35 0a 31 20 31 0a 32 20 33 0a 33 20 34 0a 39 20 38 0a 35 20 32&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;문자열 형식으로 변환&lt;/h5&gt;
&lt;h6&gt;toString()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData);
// 5
// 1 1
// 2 3
// 3 4
// 9 8
// 5 2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;배열 생성&lt;/h5&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

console.log(inputData); // [ &amp;#39;5&amp;#39;, &amp;#39;1 1&amp;#39;, &amp;#39;2 3&amp;#39;, &amp;#39;3 4&amp;#39;, &amp;#39;9 8&amp;#39;, &amp;#39;5 2&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;를 활용하여 매개변수에 다음줄을 의미하는 &lt;code&gt;&amp;quot;\n&amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h4&gt;count&lt;/h4&gt;
&lt;h5&gt;테스트 케이스의 개수&lt;/h5&gt;
&lt;h6&gt;배열 구조 분해&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [count] = inputData;

console.log(count); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 통해 &lt;code&gt;inputData&lt;/code&gt;로부터 &lt;code&gt;count&lt;/code&gt;라는 이름의 변수로 &lt;u&gt;테스트 케이스의 개수&lt;/u&gt;를 구합니다.&lt;/p&gt;
&lt;h4&gt;A + B 구하기&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= +count; i++) {
  const arrayOfValue = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  const [a, b] = arrayOfValue;
  console.log(a + b);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;for&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= +count; i++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for&quot;&gt;for&lt;/a&gt; 문을 활용합니다.&lt;/p&gt;
&lt;p&gt;처음 &lt;u&gt;테스트 케이스의 개수를 의미하는 값을 제외&lt;/u&gt;해야 하기 때문에 &lt;code&gt;i&lt;/code&gt;값을 &lt;code&gt;0&lt;/code&gt;이 아닌 &lt;code&gt;1&lt;/code&gt;로 초기화합니다.&lt;/p&gt;
&lt;p&gt;문자열 형식의 &lt;code&gt;count&lt;/code&gt;를 &lt;code&gt;+&lt;/code&gt;를 통해 실수 형식으로 바꿔 for문이 동작하도록 합니다.&lt;/p&gt;
&lt;h5&gt;값의 배열&lt;/h5&gt;
&lt;h6&gt;arrayOfValue&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= +count; i++) {
  const arrayOfValue = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  // expexted output: [ 1, 1 ], ..., [ 5, 2 ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;값의 배열을 의미하는 &lt;code&gt;arrayOfValue&lt;/code&gt;라는 변수를 만듭니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;split()&lt;/a&gt; 메서드를 통해 매개변수 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt; 즉 공백에 의한 배열을 생성합니다.&lt;/p&gt;
&lt;p&gt;그 후 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;map()&lt;/a&gt; 메서드를 통해 &lt;u&gt;문자열 형식인 배열 값들을 실수 형식&lt;/u&gt;으로 변환합니다.&lt;/p&gt;
&lt;h5&gt;배열 구조 분해&lt;/h5&gt;
&lt;h6&gt;[a, b]&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= +count; i++) {
  const arrayOfValue = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  const [a, b] = arrayOfValue;

  console.log(a, b);
  // 1 1
  // 2 3
  // 3 4
  // 9 8
  // 5 2
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 통해 &lt;code&gt;arrayOfValue&lt;/code&gt;를 &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;에 할당합니다.&lt;/p&gt;
&lt;h5&gt;a + b 출력&lt;/h5&gt;
&lt;h6&gt;console.log()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= +count; i++) {
  const arrayOfValue = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  const [a, b] = arrayOfValue;
  console.log(a + b);
  // 2
  // 5
  // 7
  // 17
  // 7
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 &lt;code&gt;a + b&lt;/code&gt;값을 &lt;code&gt;i&lt;/code&gt;값마다 출력합니다.&lt;/p&gt;
&lt;h2&gt;3. 합&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/8393&quot;&gt;https://www.acmicpc.net/problem/8393&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;합

문제
n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하시오.

입력
첫째 줄에 n (1 ≤ n ≤ 10,000)이 주어진다.

출력
1부터 n까지 합을 출력한다.

예제 입력 1
3

예제 출력 1
6&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = +fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

let result = 0;

for (let i = 0; i &amp;lt;= inputData; i++) {
  result += i;
}

console.log(result);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 33&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;실수 형식으로 변환&lt;/h5&gt;
&lt;h6&gt;+&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = +fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // 3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;code&gt;inputData&lt;/code&gt;로 정의하려는 식 앞에 &lt;code&gt;+&lt;/code&gt;를 붙여 실수 형식으로 변환합니다.&lt;/p&gt;
&lt;h4&gt;result&lt;/h4&gt;
&lt;h5&gt;결과값 선언 및 초기화&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let result = 0;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;1부터 n까지 합을 담을 변수 &lt;code&gt;result&lt;/code&gt;를 0으로 초기화하여 선언합니다.&lt;/p&gt;
&lt;h4&gt;결과값 구하기&lt;/h4&gt;
&lt;h5&gt;for&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt;= inputData; i++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for&quot;&gt;for&lt;/a&gt; 문을 통해 &lt;code&gt;i&lt;/code&gt;를 &lt;code&gt;0&lt;/code&gt;으로 초기화하여 &lt;code&gt;i&lt;/code&gt; 값을 &lt;code&gt;1&lt;/code&gt;씩 증가시키면서 &lt;code&gt;inputData&lt;/code&gt;까지 증가하여 &lt;code&gt;inputData + 1&lt;/code&gt;번 반복하게끔 합니다.&lt;/p&gt;
&lt;h5&gt;모든 i 값 더하기&lt;/h5&gt;
&lt;h6&gt;더하기 할당&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt;= inputData; i++) {
  result += i;
}
// ex) inputData = 3
// 1 time: 0 = 0 + 0
// 2 time: 1 = 0 + 1
// 3 time: 3 = 1 + 2
// 4 time: 6 = 3 + 3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Expressions_and_Operators#%ED%95%A0%EB%8B%B9_%EC%97%B0%EC%82%B0%EC%9E%90&quot;&gt;할당 연산자&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Addition_assignment&quot;&gt;더하기 할당&lt;/a&gt;을 통해 반복문을 통해 순환되는 모든 &lt;code&gt;i&lt;/code&gt;값을 &lt;code&gt;result&lt;/code&gt;에 더합니다.&lt;/p&gt;
&lt;h4&gt;결과값 출력&lt;/h4&gt;
&lt;h5&gt;console.log()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(result);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log#content&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 &lt;code&gt;result&lt;/code&gt;값을 출력합니다.&lt;/p&gt;
&lt;h2&gt;4. 빠른 A+B&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/15552&quot;&gt;https://www.acmicpc.net/problem/15552&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;빠른 A+B

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

C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL)과 sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자. 단, 이렇게 하면 더 이상 scanf/printf/puts/getchar/putchar 등 C의 입출력 방식을 사용하면 안 된다.

Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.

Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다.

또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.

자세한 설명 및 다른 언어의 경우는 이 글에 설명되어 있다.

이 블로그 글에서 BOJ의 기타 여러 가지 팁을 볼 수 있다.

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

출력
각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.

예제 입력 1
5
1 1
12 34
5 500
40 60
1000 1000

예제 출력 1
2
46
505
100
2000&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .trim()
  .split(&amp;quot;\n&amp;quot;);

const count = inputData.length;

let result = &amp;quot;&amp;quot;;

for (let i = 1; i &amp;lt; count; i++) {
  const data = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);

  if (i &amp;lt; count - 1) {
    result += `${data[0] + data[1]}\n`;
  } else if (i &amp;lt; count) {
    result += `${data[0] + data[1]}`;
  }
}

console.log(result);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 35 0a 31 20 31 0a 31 32 20 33 34 0a 35 20 35 30 30 0a 34 30 20 36 30 0a 31 30 30 30 20 31 30 30 30&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;문자열 형식으로 변환&lt;/h5&gt;
&lt;h6&gt;toString()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData);
// 5
// 1 1
// 12 34
// 5 500
// 40 60
// 1000 1000&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;문자열 공백 제거&lt;/h5&gt;
&lt;h6&gt;trim()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .trim();

console.log(inputData);
// 5
// 1 1
// 12 34
// 5 500
// 40 60
// 1000 1000&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;공백이 존재한다고 생각하진 않았는데 백준에서 재출을 할 때 틀렸다고 하였습니다. 혹시나해서 &lt;code&gt;trim()&lt;/code&gt; 메서드를 활용하였더니 성공하였습니다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/Trim&quot;&gt;&lt;code&gt;trim()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 &lt;u&gt;문자열 양 끝의 공백을 제거&lt;/u&gt;합니다.&lt;/p&gt;
&lt;h5&gt;배열 생성&lt;/h5&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

console.log(inputData); // [ &amp;#39;5&amp;#39;, &amp;#39;1 1&amp;#39;, &amp;#39;12 34&amp;#39;, &amp;#39;5 500&amp;#39;, &amp;#39;40 60&amp;#39;, &amp;#39;1000 1000&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;을 활용하여 매개변수에 다음줄을 의미하는 &lt;code&gt;&amp;quot;\n&amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h4&gt;count&lt;/h4&gt;
&lt;h5&gt;배열 inputData의 길이&lt;/h5&gt;
&lt;h6&gt;length&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const count = inputData.length;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;각 줄에 해당하는 값들을 더해야하므로 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/length&quot;&gt;&lt;code&gt;length&lt;/code&gt;&lt;/a&gt;를 통해 배열인 &lt;code&gt;inputData&lt;/code&gt;의 길이를 구합니다.&lt;/p&gt;
&lt;h4&gt;result&lt;/h4&gt;
&lt;h5&gt;결과값 선언 및 초기화&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let result = &amp;quot;&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;각 줄에 해당하는 값들을 담은 변수 &lt;code&gt;result&lt;/code&gt;를 &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; 즉 &lt;u&gt;문자열 형식의 빈 값&lt;/u&gt;으로 초기화하여 선언합니다.&lt;/p&gt;
&lt;h4&gt;결과값 구하기&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt; count; i++) {
  const data = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);

  if (i &amp;lt; count - 1) {
    result += `${data[0] + data[1]}\n`;
  } else if (i &amp;lt; count) {
    result += `${data[0] + data[1]}`;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;for&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= count; i++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for&quot;&gt;for&lt;/a&gt; 문을 통해 첫 줄은 테스트케이스의 개수르르 의미하므로 &lt;code&gt;0&lt;/code&gt;이 아닌 &lt;code&gt;i&lt;/code&gt;를 &lt;code&gt;1&lt;/code&gt;으로 초기화하여 &lt;code&gt;i&lt;/code&gt; 값을 &lt;code&gt;1&lt;/code&gt;씩 증가시키면서 &lt;code&gt;count&lt;/code&gt;까지 증가하여 &lt;code&gt;for&lt;/code&gt;문의 수행횟수를 &lt;code&gt;count&lt;/code&gt;번 반복하게끔 합니다.&lt;/p&gt;
&lt;h5&gt;각 줄의 값 배열화 (data)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt; count; i++) {
  const data = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
}
// expected output :
// [ &amp;#39;1&amp;#39;, &amp;#39;1&amp;#39; ]
// [ &amp;#39;12&amp;#39;, &amp;#39;34&amp;#39; ]
// [ &amp;#39;5&amp;#39;, &amp;#39;500&amp;#39; ]
// [ &amp;#39;40&amp;#39;, &amp;#39;60&amp;#39; ]
// [ &amp;#39;1000&amp;#39;, &amp;#39;1000&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;p&gt;각 줄의 번호를 의미하는 &lt;code&gt;inputData[i]&lt;/code&gt;로부터 태스트 케이스 값들을 받아 공백을 의미하는 매개변수 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt;이 포함된 &lt;code&gt;split()&lt;/code&gt; 메서드를 실행하여 각 줄에 값들에 대한 각각의 배열을 만듭니다.&lt;/p&gt;
&lt;h6&gt;map()&lt;/h6&gt;
&lt;p&gt;그 후 &lt;code&gt;(value) =&amp;gt; +value&lt;/code&gt;가 포함된 &lt;code&gt;callback&lt;/code&gt; 함수를 가지는 &lt;code&gt;map()&lt;/code&gt; 메서드를 통해 문자열 형식을 실수 형식으로 바꾸게 하여 연산이 가능하도록 합니다.&lt;/p&gt;
&lt;h5&gt;if...else&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;if (i &amp;lt; count - 1) {
  result += `${data[0] + data[1]}\n`;
} else if (i &amp;lt; count) {
  result += `${data[0] + data[1]}`;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/if...else&quot;&gt;if...else&lt;/a&gt;을 통하여 &lt;code&gt;result&lt;/code&gt;에 담을 값에 대한 경우를 나누어야합니다.&lt;/p&gt;
&lt;h6&gt;i &amp;lt; count - 1 의 경우&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;if (i &amp;lt; count - 1) {
  result += `${data[0] + data[1]}\n`;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;count&lt;/code&gt;의 값이 1부터 &lt;code&gt;count - 2&lt;/code&gt;까지의 경우 연산이 끝난 후 다음줄로 출력되어야 하기 때문에 &lt;code&gt;\n&lt;/code&gt;을 써줍니다.&lt;/p&gt;
&lt;p&gt;값을 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Addition_assignment&quot;&gt;더하기 할당&lt;/a&gt; 연산자를 활용하여 순서대로 더해줍니다.&lt;/p&gt;
&lt;h6&gt;i &amp;lt; count 의 경우&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;else if (i &amp;lt; count) {
  result += `${data[0] + data[1]}`;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;else if&lt;/code&gt;를 통해 &lt;code&gt;i &amp;lt; count - 1&lt;/code&gt; 의 경우를 제외한 &lt;code&gt;i &amp;lt; count&lt;/code&gt; 즉 &lt;code&gt;count - 1&lt;/code&gt;에 대한 경우는 &lt;code&gt;\n&lt;/code&gt;을 제외해 &lt;u&gt;다음줄까지 함께 출력되는 것을 방지&lt;/u&gt;합니다.&lt;/p&gt;
&lt;p&gt;마찬가지로 값을 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Addition_assignment&quot;&gt;더하기 할당&lt;/a&gt; 연산자를 활용하여 더해줍니다.&lt;/p&gt;
&lt;h4&gt;결과값 출력&lt;/h4&gt;
&lt;h5&gt;console.log()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(result);
// 2
// 46
// 505
// 100
// 2000&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log#content&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 &lt;code&gt;result&lt;/code&gt;값을 출력합니다.&lt;/p&gt;
&lt;h2&gt;5. N 찍기&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2741&quot;&gt;https://www.acmicpc.net/problem/2741&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;N 찍기

문제
자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.

출력
첫째 줄부터 N번째 줄 까지 차례대로 출력한다.

예제 입력 1
5

예제 출력 1
1
2
3
4
5&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = +fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

let result = &amp;quot;&amp;quot;;

for (let i = 1; i &amp;lt;= inputData; i++) {
  result += `${i}\n`;
}

console.log(result);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 35&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;문자열 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;toString()&lt;/h6&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;숫자 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = +fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;+&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;String&lt;/code&gt; 형식으로 출력된 값을 &lt;code&gt;+&lt;/code&gt; 을 통해 문자열 형식에서 숫자 형식으로 바꿉니다.&lt;/p&gt;
&lt;h4&gt;result&lt;/h4&gt;
&lt;h5&gt;결과값들을 담을 변수&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let result = &amp;quot;&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;결과값이 담길 변수 &lt;code&gt;result&lt;/code&gt;을 선언하고, &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; 즉 빈 값으로 초기화합니다.&lt;/p&gt;
&lt;h4&gt;for&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= inputData; i++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;code&gt;inputData&lt;/code&gt; 값이 예제에서 &lt;code&gt;5&lt;/code&gt;이므로 &lt;code&gt;1&lt;/code&gt;의 경우부터 &lt;code&gt;5&lt;/code&gt;의 경우까지 반복합니다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;code&gt;1&lt;/code&gt;부터 &lt;code&gt;inputData&lt;/code&gt; 까지의 값을 출력해야하기 때문에&lt;/p&gt;
&lt;p&gt;&lt;code&gt;i&lt;/code&gt;값을 &lt;code&gt;1&lt;/code&gt;로 선언하고 &lt;code&gt;1&lt;/code&gt;부터 &lt;code&gt;inputData&lt;/code&gt;까지 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for&quot;&gt;for&lt;/a&gt;문을 반복하게 합니다.&lt;/p&gt;
&lt;h5&gt;result에 i 값 줄바꿈하여 넣기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= inputData; i++) {
  result += `${i}\n`;
}
// expected output:
// 1
// 2
// 3
// 4
// 5&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;Templete literals&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals&quot;&gt;Templete literals&lt;/a&gt;를 통해 자연수인 &lt;code&gt;i&lt;/code&gt; 값이 연산이 되지 않도록 문자열 형식이 되게 합니다.&lt;/p&gt;
&lt;h6&gt;더하기 할당&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Addition_assignment&quot;&gt;더하기 할당 연산자&lt;/a&gt;를 활용하여 &lt;code&gt;\n&lt;/code&gt;을 통해 오른쪽 피연산자의 값인 &lt;code&gt;i&lt;/code&gt; 값이 &lt;code&gt;result&lt;/code&gt;으로 더해져도 &lt;u&gt;다음줄에서 더해지게&lt;/u&gt; 합니다.&lt;/p&gt;
&lt;h4&gt;출력하기&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(result);
// 1
// 2
// 3
// 4
// 5&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;console.log()&lt;/h5&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt;를 통해 &lt;code&gt;result&lt;/code&gt; 값을 출력합니다.&lt;/p&gt;
&lt;h2&gt;6. 기찍 N&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2742&quot;&gt;https://www.acmicpc.net/problem/2742&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;기찍 N

문제
자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.

출력
첫째 줄부터 N번째 줄 까지 차례대로 출력한다.

예제 입력 1
5

예제 출력 1
5
4
3
2
1&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = +fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

let result = &amp;quot;&amp;quot;;

for (let i = 1; i &amp;lt;= inputData; i++) {
  result += `${i}\n`;
}

console.log(result);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 35&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;문자열 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;toString()&lt;/h6&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;숫자 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = +fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;+&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;String&lt;/code&gt; 형식으로 출력된 값을 &lt;code&gt;+&lt;/code&gt; 을 통해 문자열 형식에서 숫자 형식으로 바꿉니다.&lt;/p&gt;
&lt;h4&gt;result&lt;/h4&gt;
&lt;h5&gt;결과값들을 담을 변수&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let result = &amp;quot;&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;결과값이 담길 변수 &lt;code&gt;result&lt;/code&gt;을 선언하고, &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; 즉 빈 값으로 초기화합니다.&lt;/p&gt;
&lt;h4&gt;for&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = inputData; i &amp;gt;= 1; i--) {}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;code&gt;inputData&lt;/code&gt; 값이 예제에서 &lt;code&gt;5&lt;/code&gt;이므로 &lt;code&gt;5&lt;/code&gt;의 경우부터 &lt;code&gt;1&lt;/code&gt;의 경우까지 반복합니다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;code&gt;inputData&lt;/code&gt;부터 &lt;code&gt;1&lt;/code&gt;까지의 값을 출력해야하기 때문에&lt;/p&gt;
&lt;p&gt;&lt;code&gt;i&lt;/code&gt;값을 &lt;code&gt;inputData&lt;/code&gt;로 선언하고 &lt;code&gt;inputData&lt;/code&gt;부터 &lt;code&gt;1&lt;/code&gt;까지 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for&quot;&gt;for&lt;/a&gt;문을 반복하게 합니다.&lt;/p&gt;
&lt;h5&gt;result에 i 값 줄바꿈하여 넣기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = inputData; i &amp;gt;= 1; i--) {
  result += `${i}\n`;
}
// expected output:
// 5
// 4
// 3
// 2
// 1&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;Templete literals&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals&quot;&gt;Templete literals&lt;/a&gt;를 통해 자연수인 &lt;code&gt;i&lt;/code&gt; 값이 연산이 되지 않도록 문자열 형식이 되게 합니다.&lt;/p&gt;
&lt;h6&gt;더하기 할당&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Addition_assignment&quot;&gt;더하기 할당 연산자&lt;/a&gt;를 활용하여 &lt;code&gt;\n&lt;/code&gt;을 통해 오른쪽 피연산자의 값인 &lt;code&gt;i&lt;/code&gt; 값이 &lt;code&gt;result&lt;/code&gt;으로 더해져도 &lt;u&gt;다음줄에서 더해지게&lt;/u&gt; 합니다.&lt;/p&gt;
&lt;h4&gt;출력하기&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(result);
// 5
// 4
// 3
// 2
// 1&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;console.log()&lt;/h5&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt;를 통해 &lt;code&gt;result&lt;/code&gt; 값을 출력합니다.&lt;/p&gt;
&lt;h2&gt;7. A+B-7&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11021&quot;&gt;https://www.acmicpc.net/problem/11021&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;A+B-7

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 &amp;lt; A, B &amp;lt; 10)

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

예제 입력 1
5
1 1
2 3
3 4
9 8
5 2

예제 출력 1
Case #1: 2
Case #2: 5
Case #3: 7
Case #4: 17
Case #5: 7&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

const [count] = inputData;

for (let i = 1; i &amp;lt;= +count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  const [a, b] = testCase;

  console.log(`Case #${i}: ${a + b}`);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 35 0a 31 20 31 0a 32 20 33 0a 33 20 34 0a 39 20 38 0a 35 20 32 0a&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;문자열 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData);
// 5
// 1 1
// 2 3
// 3 4
// 9 8
// 5 2&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;toString()&lt;/h6&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;배열 생성&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

console.log(inputData); // [ &amp;#39;5&amp;#39;, &amp;#39;1 1&amp;#39;, &amp;#39;2 3&amp;#39;, &amp;#39;3 4&amp;#39;, &amp;#39;9 8&amp;#39;, &amp;#39;5 2&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;을 활용하여 매개변수에 다음줄을 의미하는 &lt;code&gt;&amp;quot;\n&amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h4&gt;count&lt;/h4&gt;
&lt;h5&gt;테스트 케이스 개수&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [count] = inputData;

console.log(count); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;배열 구조 분해&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 활용해 &lt;code&gt;inputData&lt;/code&gt;배열의 첫 번째 인덱스에 해당하는 값 즉 &lt;code&gt;inputData[0]&lt;/code&gt;을 변수 &lt;code&gt;count&lt;/code&gt;에 할당합니다.&lt;/p&gt;
&lt;h4&gt;for&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= +count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  const [a, b] = testCase;

  console.log(`Case #${i}: ${a + b}`);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= +count; i++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;code&gt;count&lt;/code&gt; 값이 예제에서 &lt;code&gt;5&lt;/code&gt;이므로 &lt;code&gt;1&lt;/code&gt;의 경우부터 &lt;code&gt;5&lt;/code&gt;의 경우까지 반복합니다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;code&gt;1&lt;/code&gt;부터 &lt;code&gt;count&lt;/code&gt; 까지의 값을 출력해야하기 때문에&lt;/p&gt;
&lt;p&gt;&lt;code&gt;i&lt;/code&gt;값을 &lt;code&gt;1&lt;/code&gt;로 선언하고 &lt;code&gt;1&lt;/code&gt;부터 &lt;code&gt;count&lt;/code&gt;까지 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for&quot;&gt;for&lt;/a&gt;문을 반복하게 합니다.&lt;/p&gt;
&lt;h5&gt;+count&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;count&lt;/code&gt; 값은 문자열 형식이기 때문에 &lt;code&gt;+&lt;/code&gt;를 통해 숫자로 형식을 바꿔줍니다.&lt;/p&gt;
&lt;h5&gt;testCase&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= +count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);

  console.log(testCase);
  // [ 1, 1 ]
  // [ 2, 3 ]
  // [ 3, 4 ]
  // [ 9, 8 ]
  // [ 5, 2 ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const testCase = inputData[i].split(&amp;quot; &amp;quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;testCase&lt;/code&gt;내에 있는 변수들을 모두 더하는 연산을 하기 위해서 &lt;code&gt;testCase&lt;/code&gt; 내에 있는 변수들을 모두 각각의 배열로 분해해야합니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;을 활용하여 매개변수에 공백을 의미하는 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h6&gt;map()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그 후 &lt;code&gt;(value) =&amp;gt; +value&lt;/code&gt;가 포함된 &lt;code&gt;callback&lt;/code&gt; 함수를 가지는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 문자열 형식을 실수 형식으로 바꾸게 하여 연산이 가능하도록 합니다.&lt;/p&gt;
&lt;h5&gt;[a, b]&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= +count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  const [a, b] = testCase;

  console.log(a, b);
  // 1 1
  // 2 3
  // 3 4
  // 9 8
  // 5 2
}&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;배열 구조 분해&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [a, b] = testCase;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 활용해 &lt;code&gt;testCase&lt;/code&gt;배열의 변수들을 각각 &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;에 할당합니다.&lt;/p&gt;
&lt;h5&gt;출력하기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= +count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  const [a, b] = testCase;

  console.log(`Case #${i}: ${a + b}`);
  // Case #1: 2
  // Case #2: 5
  // Case #3: 7
  // Case #4: 17
  // Case #5: 7
}&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;Templete literals&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;`Case #${i}: ${a + b}`;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals&quot;&gt;Templete literals&lt;/a&gt;을 활용해&lt;/p&gt;
&lt;p&gt;&lt;code&gt;${i}&lt;/code&gt;로 하여금 &lt;code&gt;i&lt;/code&gt;값을 반복문이 실행되는 경우마다 넣도록 합니다.&lt;/p&gt;
&lt;p&gt;그리고 &lt;code&gt;${a + b}&lt;/code&gt;를 통해 연산된 값을 나타내도록 합니다.&lt;/p&gt;
&lt;h6&gt;console.log()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(`Case #${i}: ${a + b}`);
// Case #1: 2
// Case #2: 5
// Case #3: 7
// Case #4: 17
// Case #5: 7&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 테스트 케이스마다 Templete literals 로 이루어진 값을 출력합니다.&lt;/p&gt;
&lt;h2&gt;8. A+B-8&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11022&quot;&gt;https://www.acmicpc.net/problem/11022&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;A+B-8

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 &amp;lt; A, B &amp;lt; 10)

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

예제 입력 1
5
1 1
2 3
3 4
9 8
5 2

예제 출력 1
Case #1: 1 + 1 = 2
Case #2: 2 + 3 = 5
Case #3: 3 + 4 = 7
Case #4: 9 + 8 = 17
Case #5: 5 + 2 = 7&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

const [count] = inputData;

for (let i = 1; i &amp;lt;= +count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  const [a, b] = testCase;

  console.log(`Case #${i}: ${a} + ${b} = ${a + b}`);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 35 0a 31 20 31 0a 32 20 33 0a 33 20 34 0a 39 20 38 0a 35 20 32 0a&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;문자열 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData);
// 5
// 1 1
// 2 3
// 3 4
// 9 8
// 5 2&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;toString()&lt;/h6&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;배열 생성&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

console.log(inputData); // [ &amp;#39;5&amp;#39;, &amp;#39;1 1&amp;#39;, &amp;#39;2 3&amp;#39;, &amp;#39;3 4&amp;#39;, &amp;#39;9 8&amp;#39;, &amp;#39;5 2&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;을 활용하여 매개변수에 다음줄을 의미하는 &lt;code&gt;&amp;quot;\n&amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h4&gt;count&lt;/h4&gt;
&lt;h5&gt;테스트 케이스 개수&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [count] = inputData;

console.log(count); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;배열 구조 분해&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 활용해 &lt;code&gt;inputData&lt;/code&gt;배열의 첫 번째 인덱스에 해당하는 값 즉 &lt;code&gt;inputData[0]&lt;/code&gt;을 변수 &lt;code&gt;count&lt;/code&gt;에 할당합니다.&lt;/p&gt;
&lt;h4&gt;for&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= +count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  const [a, b] = testCase;

  console.log(`Case #${i}: ${a} + ${b} = ${a + b}`);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= +count; i++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;code&gt;count&lt;/code&gt; 값이 예제에서 &lt;code&gt;5&lt;/code&gt;이므로 &lt;code&gt;1&lt;/code&gt;의 경우부터 &lt;code&gt;5&lt;/code&gt;의 경우까지 반복합니다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;code&gt;1&lt;/code&gt;부터 &lt;code&gt;count&lt;/code&gt; 까지의 값을 출력해야하기 때문에&lt;/p&gt;
&lt;p&gt;&lt;code&gt;i&lt;/code&gt;값을 &lt;code&gt;1&lt;/code&gt;로 선언하고 &lt;code&gt;1&lt;/code&gt;부터 &lt;code&gt;count&lt;/code&gt;까지 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for&quot;&gt;for&lt;/a&gt;문을 반복하게 합니다.&lt;/p&gt;
&lt;h5&gt;+count&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;count&lt;/code&gt; 값은 문자열 형식이기 때문에 &lt;code&gt;+&lt;/code&gt;를 통해 숫자로 형식을 바꿔줍니다.&lt;/p&gt;
&lt;h5&gt;testCase&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= +count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);

  console.log(testCase);
  // [ 1, 1 ]
  // [ 2, 3 ]
  // [ 3, 4 ]
  // [ 9, 8 ]
  // [ 5, 2 ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const testCase = inputData[i].split(&amp;quot; &amp;quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;testCase&lt;/code&gt;내에 있는 변수들을 모두 더하는 연산을 하기 위해서 &lt;code&gt;testCase&lt;/code&gt; 내에 있는 변수들을 모두 각각의 배열로 분해해야합니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;을 활용하여 매개변수에 공백을 의미하는 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h6&gt;map()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그 후 &lt;code&gt;(value) =&amp;gt; +value&lt;/code&gt;가 포함된 &lt;code&gt;callback&lt;/code&gt; 함수를 가지는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 문자열 형식을 실수 형식으로 바꾸게 하여 연산이 가능하도록 합니다.&lt;/p&gt;
&lt;h5&gt;[a, b]&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= +count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  const [a, b] = testCase;

  console.log(a, b);
  // 1 1
  // 2 3
  // 3 4
  // 9 8
  // 5 2
}&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;배열 구조 분해&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [a, b] = testCase;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 활용해 &lt;code&gt;testCase&lt;/code&gt;배열의 변수들을 각각 &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;에 할당합니다.&lt;/p&gt;
&lt;h5&gt;출력하기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= +count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
  const [a, b] = testCase;

  console.log(`Case #${i}: ${a} + ${b} = ${a + b}`);
  // Case #1: 1 + 1 = 2
  // Case #2: 2 + 3 = 5
  // Case #3: 3 + 4 = 7
  // Case #4: 9 + 8 = 17
  // Case #5: 5 + 2 = 7
}&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;Templete literals&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;`Case #${i}: ${a} + ${b} = ${a + b}`;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals&quot;&gt;Templete literals&lt;/a&gt;을 활용해&lt;/p&gt;
&lt;p&gt;&lt;code&gt;${i}&lt;/code&gt;로 하여금 &lt;code&gt;i&lt;/code&gt;값을 반복문이 실행되는 경우마다 넣도록 합니다.&lt;/p&gt;
&lt;p&gt;그리고 &lt;code&gt;${a}&lt;/code&gt;, &lt;code&gt;${b}&lt;/code&gt;를 통해 &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;의 값을 나타내게 하고 &lt;code&gt;${a + b}&lt;/code&gt;를 통해 연산된 값을 나타내도록 합니다.&lt;/p&gt;
&lt;h6&gt;console.log()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(`Case #${i}: ${a} + ${b} = ${a + b}`);
// Case #1: 1 + 1 = 2
// Case #2: 2 + 3 = 5
// Case #3: 3 + 4 = 7
// Case #4: 9 + 8 = 17
// Case #5: 5 + 2 = 7&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 테스트 케이스마다 Templete literals 로 이루어진 값을 출력합니다.&lt;/p&gt;
&lt;h2&gt;9. 별 찍기 - 1&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2438&quot;&gt;https://www.acmicpc.net/problem/2438&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;별 찍기 - 1

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

입력
첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력
첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

예제 입력 1
5

예제 출력 1
*
**
***
****
*****&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = +fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

for (let i = 1; i &amp;lt;= inputData; i++) {
  let stars = &amp;quot;&amp;quot;;

  for (let y = 1; y &amp;lt;= i; y++) {
    stars += &amp;quot;*&amp;quot;;
  }

  console.log(stars);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData (입력값)&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 35&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;문자열 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;toString()&lt;/h6&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;숫자 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = +fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;+&lt;/h6&gt;
&lt;p&gt;문자열 형식이었던 &lt;code&gt;inputData&lt;/code&gt;에 &lt;code&gt;+&lt;/code&gt;를 붙혀 숫자 형식으로 변환합니다.&lt;/p&gt;
&lt;h4&gt;for (별이 출력되는 줄의 개수)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= inputData; i++) {
  let stars = &amp;quot;&amp;quot;;

  for (let y = 1; y &amp;lt;= i; y++) {
    stars += &amp;quot;*&amp;quot;;
  }

  console.log(stars);
  // *
  // **
  // ***
  // ****
  // *****
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= inputData; i++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;u&gt;별이 출력되는 줄의 수&lt;/u&gt;와 관련된 for문입니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;code&gt;inputData&lt;/code&gt; 값이 예제에서 &lt;code&gt;5&lt;/code&gt;이므로 &lt;code&gt;1&lt;/code&gt;의 경우부터 &lt;code&gt;5&lt;/code&gt;의 경우까지 반복합니다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;별을 출력되는 줄이 총 5줄이기 때문에&lt;/p&gt;
&lt;p&gt;&lt;code&gt;i&lt;/code&gt;값을 &lt;code&gt;1&lt;/code&gt;로 선언하고 &lt;code&gt;1&lt;/code&gt;부터 &lt;code&gt;inputData&lt;/code&gt;까지 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for&quot;&gt;for&lt;/a&gt;문을 반복하게 합니다.&lt;/p&gt;
&lt;h5&gt;stars (별이 담기는 변수)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= inputData; i++) {
  let stars = &amp;quot;&amp;quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;별이 담기는 변수 &lt;code&gt;stars&lt;/code&gt;를 빈 값으로 선언합니다.&lt;/p&gt;
&lt;p&gt;for문이 반복되어 &lt;code&gt;stars&lt;/code&gt;값에 추후에 어떤 값이 들어와 새로운 값이 되어도 &lt;code&gt;i&lt;/code&gt;값이 증가하면서 &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; 빈 값으로 초기화됩니다.&lt;/p&gt;
&lt;h5&gt;for (각 줄에 담기는 별의 개수)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= inputData; i++) {
  let stars = &amp;quot;&amp;quot;;

  for (let y = 1; y &amp;lt;= i; y++) {
    stars += &amp;quot;*&amp;quot;;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let y = 1; y &amp;lt;= i; y++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;두번째 for문입니다.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;각 줄에 출력되는 별의 개수&lt;/u&gt;에 대한 for문입니다.&lt;/p&gt;
&lt;h6&gt;더하기 할당&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let y = 1; y &amp;lt;= i; y++) {
  stars += &amp;quot;*&amp;quot;;
}

// expected output:
// y가 1일 경우 *
// y가 2일 경우 **
// y가 3일 경우 ***
// y가 4일 경우 ****
// y가 5일 경우 *****&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Addition_assignment&quot;&gt;더하기 할당&lt;/a&gt;을 활용합니다.&lt;/p&gt;
&lt;p&gt;반복문 for문에 의하여 &lt;code&gt;i&lt;/code&gt;값이 &lt;code&gt;1&lt;/code&gt;이라면 &lt;code&gt;*&lt;/code&gt;가 출력될 것이고 &lt;code&gt;2&lt;/code&gt;라면 &lt;code&gt;**&lt;/code&gt;가 출력될 것입니다.&lt;/p&gt;
&lt;h5&gt;출력하기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= inputData; i++) {
  let stars = &amp;quot;&amp;quot;;

  for (let y = 1; y &amp;lt;= i; y++) {
    stars += &amp;quot;*&amp;quot;;
  }

  console.log(stars);
  // *
  // **
  // ***
  // ****
  // *****
}&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;console.log()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(stars);
// *
// **
// ***
// ****
// *****&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 &lt;code&gt;stars&lt;/code&gt; 변수를 출력합니다.&lt;/p&gt;
&lt;h2&gt;10. 별 찍기 - 2&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2439&quot;&gt;https://www.acmicpc.net/problem/2439&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;별 찍기 - 2

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

하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.

입력
첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력
첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

예제 입력 1
5

예제 출력 1
    *
   **
  ***
 ****
*****&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = +fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

for (let i = 1; i &amp;lt;= inputData; i++) {
  let stars = &amp;quot;&amp;quot;;

  for (let y = inputData - 1; y &amp;gt;= i; y--) {
    stars += &amp;quot; &amp;quot;;
  }

  for (let z = 1; z &amp;lt;= i; z++) {
    stars += &amp;quot;*&amp;quot;;
  }

  console.log(stars);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData (입력값)&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 35&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;문자열 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;toString()&lt;/h6&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;숫자 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = +fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;+&lt;/h6&gt;
&lt;p&gt;문자열 형식이었던 &lt;code&gt;inputData&lt;/code&gt;에 &lt;code&gt;+&lt;/code&gt;를 붙혀 숫자 형식으로 변환합니다.&lt;/p&gt;
&lt;h4&gt;for (별이 출력되는 줄의 개수)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= inputData; i++) {
  let stars = &amp;quot;&amp;quot;;

  for (let y = inputData - 1; y &amp;gt;= i; y--) {
    stars += &amp;quot; &amp;quot;;
  }

  for (let z = 1; z &amp;lt;= i; z++) {
    stars += &amp;quot;*&amp;quot;;
  }

  console.log(stars);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= inputData; i++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;u&gt;별이 출력되는 줄의 수&lt;/u&gt;와 관련된 for문입니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;code&gt;inputData&lt;/code&gt; 값이 예제에서 &lt;code&gt;5&lt;/code&gt;이므로 &lt;code&gt;1&lt;/code&gt;의 경우부터 &lt;code&gt;5&lt;/code&gt;의 경우까지 반복합니다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;별을 출력되는 줄이 총 5줄이기 때문에&lt;/p&gt;
&lt;p&gt;&lt;code&gt;i&lt;/code&gt;값을 &lt;code&gt;1&lt;/code&gt;로 선언하고 &lt;code&gt;1&lt;/code&gt;부터 &lt;code&gt;inputData&lt;/code&gt;까지 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for&quot;&gt;for&lt;/a&gt;문을 반복하게 합니다.&lt;/p&gt;
&lt;h5&gt;stars (별이 담기는 변수)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= inputData; i++) {
  let stars = &amp;quot;&amp;quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;별이 담기는 변수 &lt;code&gt;stars&lt;/code&gt;를 빈 값으로 선언합니다.&lt;/p&gt;
&lt;p&gt;for문이 반복되어 &lt;code&gt;stars&lt;/code&gt;값에 추후에 어떤 값이 들어와 새로운 값이 되어도 &lt;code&gt;i&lt;/code&gt;값이 증가하면서 &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; 빈 값으로 초기화됩니다.&lt;/p&gt;
&lt;h5&gt;for (각 줄에 담기는 공백의 개수)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= inputData; i++) {
  let stars = &amp;quot;&amp;quot;;

  for (let y = inputData - 1; y &amp;gt;= i; y--) {
    stars += &amp;quot; &amp;quot;;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let y = inputData - 1; y &amp;gt;= i; y--) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;두번째 for문입니다.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;각 줄에 출력되는 공백의 개수&lt;/u&gt;에 대한 for문입니다.&lt;/p&gt;
&lt;h6&gt;더하기 할당&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let y = inputData - 1; y &amp;gt;= i; y--) {
  stars += &amp;quot; &amp;quot;;
}

// expected output:
// y가 1일 경우 공백 4개
// y가 2일 경우 공백 3개
// y가 3일 경우 공백 2개
// y가 4일 경우 공백 1개
// y가 5일 경우 공백 0개&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Addition_assignment&quot;&gt;더하기 할당&lt;/a&gt;을 활용합니다.&lt;/p&gt;
&lt;p&gt;공백의 개수는 &lt;code&gt;inputData&lt;/code&gt;에서 1을 뺀 수이기 때문에 공백의 개수에 해당하는 변수로 &lt;code&gt;y&lt;/code&gt;를 선언하고 &lt;code&gt;inputData - 1&lt;/code&gt;로 초기화합니다. 그리고 반복문이 진행될때마다 하나씩 &lt;code&gt;y&lt;/code&gt;값이 감소하게 합니다.&lt;/p&gt;
&lt;h5&gt;for (각 줄에 담기는 별의 개수)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= inputData; i++) {
  let stars = &amp;quot;&amp;quot;;

  for (let y = inputData - 1; y &amp;gt;= i; y--) {
    stars += &amp;quot; &amp;quot;;
  }

  for (let z = 1; z &amp;lt;= i; z++) {
    stars += &amp;quot;*&amp;quot;;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let z = 1; z &amp;lt;= i; z++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;세번째 for문입니다.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;각 줄에 출력되는 별의 개수&lt;/u&gt;에 대한 for문입니다.&lt;/p&gt;
&lt;h6&gt;더하기 할당&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let z = 1; z &amp;lt;= i; z++) {
  stars += &amp;quot;*&amp;quot;;
}

// expected output:
// z가 1일 경우     *
// z가 2일 경우    **
// z가 3일 경우   ***
// z가 4일 경우  ****
// z가 5일 경우 *****&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Addition_assignment&quot;&gt;더하기 할당&lt;/a&gt;을 활용합니다.&lt;/p&gt;
&lt;p&gt;공백을 넣은 이후의 과정이라서 반복문 for문에 의하여 &lt;code&gt;i&lt;/code&gt;값이 &lt;code&gt;1&lt;/code&gt;이라면 &lt;code&gt;*&lt;/code&gt;가 출력될 것이고 &lt;code&gt;2&lt;/code&gt;라면 &lt;code&gt;**&lt;/code&gt;가 출력될 것입니다.&lt;/p&gt;
&lt;h5&gt;출력하기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 1; i &amp;lt;= inputData; i++) {
  let stars = &amp;quot;&amp;quot;;

  for (let y = inputData - 1; y &amp;gt;= i; y--) {
    stars += &amp;quot; &amp;quot;;
  }

  for (let z = 1; z &amp;lt;= i; z++) {
    stars += &amp;quot;*&amp;quot;;
  }

  console.log(stars);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;console.log()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(stars);
//     *
//    **
//   ***
//  ****
// *****&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 &lt;code&gt;stars&lt;/code&gt; 변수를 출력합니다.&lt;/p&gt;
&lt;h2&gt;11. X보다 작은 수&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10871&quot;&gt;https://www.acmicpc.net/problem/10871&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;X보다 작은 수

문제
정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000)

둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.

출력
X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.

예제 입력 1
10 5
1 10 4 9 2 3 8 5 7 6

예제 출력 1
1 4 2 3&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

const nx = inputData[0].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
const [n, x] = nx;

const a = inputData[1].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);

let result = &amp;quot;&amp;quot;;

for (let i = 0; i &amp;lt; n; i++) {
  if (a[i] &amp;lt; x) {
    result += `${a[i]} `;
  }
}

console.log(result);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData (입력값)&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 31 30 20 35 0a 31 20 31 30 20 34 20 39 20 32 20 33 20 38 20 35 20 37 20 36&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;문자열 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData);
// 10 5
// 1 10 4 9 2 3 8 5 7 6&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;toString()&lt;/h6&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;배열 생성&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

console.log(inputData); // [ &amp;#39;10 5&amp;#39;, &amp;#39;1 10 4 9 2 3 8 5 7 6&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;을 활용하여 매개변수에 다음줄을 의미하는 &lt;code&gt;&amp;quot;\n&amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h4&gt;nx (정수 n개, 조건 x를 가지는 배열)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const nx = inputData[0].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;nx에 대한 배열 생성&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const nx = inputData[0].split(&amp;quot; &amp;quot;);

console.log(nx); // [ &amp;#39;10&amp;#39;, &amp;#39;5&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;inputData[0]&lt;/code&gt; 즉 &lt;code&gt;inputData&lt;/code&gt;의 첫 번째 배열로부터 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt; 공백을 매개변수로 가지는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 배열을 생성합니다.&lt;/p&gt;
&lt;h5&gt;nx에 대한 배열 형식 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const nx = inputData[0].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);

console.log(nx); // [ 10, 5 ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;map()&lt;/h6&gt;
&lt;p&gt;생성한 배열을 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 &lt;code&gt;callback&lt;/code&gt;함수 &lt;code&gt;(value) =&amp;gt; +value)&lt;/code&gt;를 통해 &lt;u&gt;문자열이였던 형식을 숫자 형식으로&lt;/u&gt; 바꿔줍니다.&lt;/p&gt;
&lt;h4&gt;n, x (정수 n개, 조건 x)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const nx = inputData[0].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
const [n, x] = nx;&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;배열 nx를 n, x에 할당&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [n, x] = nx;

console.log(n, x); // 10, 5&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;배열 구조 분해&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;에서 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;를 통해 &lt;code&gt;nx&lt;/code&gt;로부터 &lt;code&gt;n&lt;/code&gt;, &lt;code&gt;x&lt;/code&gt;에 값을 할당합니다.&lt;/p&gt;
&lt;h4&gt;a (n개로 이루어진 수열 a)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const a = inputData[1].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;수열 a에 대한 배열 생성&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const a = inputData[1].split(&amp;quot; &amp;quot;);

console.log(a);
// [
//   &amp;#39;1&amp;#39;, &amp;#39;10&amp;#39;, &amp;#39;4&amp;#39;,
//   &amp;#39;9&amp;#39;, &amp;#39;2&amp;#39;,  &amp;#39;3&amp;#39;,
//   &amp;#39;8&amp;#39;, &amp;#39;5&amp;#39;,  &amp;#39;7&amp;#39;,
//   &amp;#39;6&amp;#39;
// ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;inputData[1]&lt;/code&gt; 즉 &lt;code&gt;inputData&lt;/code&gt;의 두 번째 배열로부터 매개변수 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt;을 포함한 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 배열을 생성합니다.&lt;/p&gt;
&lt;h5&gt;a에 대한 배열 형식 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const a = inputData[1].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);

console.log(a);
// [
//   1, 10, 4, 9, 2,
//   3,  8, 5, 7, 6
// ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;map()&lt;/h6&gt;
&lt;p&gt;생성한 배열을 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 &lt;code&gt;callback&lt;/code&gt;함수 &lt;code&gt;(value) =&amp;gt; +value)&lt;/code&gt;를 통해 &lt;u&gt;문자열이였던 형식을 숫자 형식으로&lt;/u&gt; 바꿔줍니다.&lt;/p&gt;
&lt;h4&gt;result (x보다 작은 수를 담는 변수)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let result = &amp;quot;&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;x보다 작은 수를 담는 변수 &lt;code&gt;result&lt;/code&gt;를 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/let&quot;&gt;&lt;code&gt;let&lt;/code&gt;&lt;/a&gt; 명령문으로 선언하여 초기화가 가능하게끔 합니다.&lt;/p&gt;
&lt;h4&gt;for (a 수열 내 배열 각각에 대한 반복문)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt; n; i++) {
  if (a[i] &amp;lt; x) {
    result += `${a[i]} `;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;code&gt;n&lt;/code&gt; 값이 예제에서 &lt;code&gt;10&lt;/code&gt;이므로 &lt;code&gt;0&lt;/code&gt;의 경우부터 &lt;code&gt;9&lt;/code&gt;의 경우까지 반복합니다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;code&gt;i&lt;/code&gt;값을 &lt;code&gt;0&lt;/code&gt;으로 선언하고 &lt;code&gt;0&lt;/code&gt;부터 &lt;code&gt;9&lt;/code&gt;인 &lt;code&gt;n&lt;/code&gt;까지 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for&quot;&gt;for&lt;/a&gt;문을 반복하게 합니다.&lt;/p&gt;
&lt;h5&gt;a[i]가 x 보다 작은 경우 선별&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;if (a[i] &amp;lt; x) {
  result += `${a[i]} `;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;if...else&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;if (a[i] &amp;lt; x) {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;수열 &lt;code&gt;a[i]&lt;/code&gt;의 값이 &lt;code&gt;x&lt;/code&gt;보다 작은 값들을 선별해야합니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/if...else&quot;&gt;if...else&lt;/a&gt;문을 활용해서 &lt;code&gt;a[i] &amp;lt; x&lt;/code&gt;인 조건을 만족하는 값들만 다음 내부에 오는 연산을 수행하도록 합니다.&lt;/p&gt;
&lt;h6&gt;더하기 할당&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;if (a[i] &amp;lt; x) {
  result += `${a[i]} `;
}
// expected output: 1 4 2 3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Addition_assignment&quot;&gt;더하기 할당&lt;/a&gt;을 활용해 if...else문을 통과한 수들을 &lt;code&gt;result += `${a[i]} `&lt;/code&gt;를 통해 &lt;code&gt;result&lt;/code&gt;값에 할당하도록 합니다.&lt;/p&gt;
&lt;h4&gt;결과값 출력하기&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(result); // 1 4 2 3&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;console.log()&lt;/h5&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 결과값을 출력합니다.&lt;/p&gt;
&lt;h2&gt;12. A+B-5&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10952&quot;&gt;https://www.acmicpc.net/problem/10952&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;A+B-5

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력
입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 &amp;lt; A, B &amp;lt; 10)

입력의 마지막에는 0 두 개가 들어온다.

출력
각 테스트 케이스마다 A+B를 출력한다.

예제 입력 1
1 1
2 3
3 4
9 8
5 2
0 0

예제 출력 1
2
5
7
17
7&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .trim()
  .split(&amp;quot;\n&amp;quot;);

const count = inputData.length - 1;

for (let i = 0; i &amp;lt; count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);

  console.log(testCase[0] + testCase[1]);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData (입력값)&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 31 20 31 0a 32 20 33 0a 33 20 34 0a 39 20 38 0a 35 20 32 0a 30 20 30&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;문자열 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData);
// 1 1
// 2 3
// 3 4
// 9 8
// 5 2
// 0 0&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;toString()&lt;/h6&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;공백 제거&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .trim();

console.log(inputData);
// 1 1
// 2 3
// 3 4
// 9 8
// 5 2
// 0 0&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;trim()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/Trim&quot;&gt;&lt;code&gt;trim()&lt;/code&gt;&lt;/a&gt;을 활용하여 문자열 양 끝의 공백을 제거합니다.&lt;/p&gt;
&lt;h5&gt;배열 생성&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .trim()
  .split(&amp;quot;\n&amp;quot;);

console.log(inputData); // [ &amp;#39;1 1&amp;#39;, &amp;#39;2 3&amp;#39;, &amp;#39;3 4&amp;#39;, &amp;#39;9 8&amp;#39;, &amp;#39;5 2&amp;#39;, &amp;#39;0 0&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;을 활용하여 매개변수에 다음줄을 의미하는 &lt;code&gt;&amp;quot;\n&amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h4&gt;count&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const count = inputData.length - 1;

console.log(count); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;테스트 케이스의 개수&lt;/h5&gt;
&lt;h6&gt;length&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/length&quot;&gt;&lt;code&gt;length&lt;/code&gt;&lt;/a&gt; 속성을 활용하여 &lt;code&gt;inputData&lt;/code&gt;의 길이를 구하여 테스트 케이스의 개수를 구합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;입력의 마지막에는 0 두 개가 들어온다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;입력의 마지막에 &lt;code&gt;0&lt;/code&gt; 두 개가 들어오므로 &lt;code&gt;1&lt;/code&gt;을 빼줍니다. 그러므로 예제 입력에 따라서 &lt;code&gt;count&lt;/code&gt;를 &lt;code&gt;5&lt;/code&gt;로 만들어줍니다.&lt;/p&gt;
&lt;h4&gt;for (각 테스트 케이스에 대한 반복문)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt; count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);

  console.log(testCase[0] + testCase[1]);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt; count; i++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;예제에서 &lt;code&gt;count&lt;/code&gt;의 값은 &lt;code&gt;5&lt;/code&gt;입니다. 마지막 입력 0 두 개를 제외하면 테스트 케이스들에 해당하는 인덱스는 0,1,2,3,4 총 5가지입니다.&lt;/p&gt;
&lt;p&gt;이것을 활용하여 뒤에 나오는 연산을 진행합니다.&lt;/p&gt;
&lt;h5&gt;testCase&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt; count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;각각의 테스트 케이스들을 의미하는 &lt;code&gt;testCase&lt;/code&gt;라는 변수를 생성하고 이하에 나오는 과정을 &lt;code&gt;testCase&lt;/code&gt;라는 변수에 정의합니다.&lt;/p&gt;
&lt;h6&gt;split() (각 testCase에 대한 배열 생성)&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt; count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;);

  console.log(testCase);
  // [ &amp;#39;1&amp;#39;, &amp;#39;1&amp;#39; ]
  // [ &amp;#39;2&amp;#39;, &amp;#39;3&amp;#39; ]
  // [ &amp;#39;3&amp;#39;, &amp;#39;4&amp;#39; ]
  // [ &amp;#39;9&amp;#39;, &amp;#39;8&amp;#39; ]
  // [ &amp;#39;5&amp;#39;, &amp;#39;2&amp;#39; ]
}

// i = 0 의 경우 [ &amp;#39;1&amp;#39;, &amp;#39;1&amp;#39; ]
// i = 1 의 경우 [ &amp;#39;2&amp;#39;, &amp;#39;3&amp;#39; ]
// i = 2 의 경우 [ &amp;#39;3&amp;#39;, &amp;#39;4&amp;#39; ]
// i = 3 의 경우 [ &amp;#39;9&amp;#39;, &amp;#39;8&amp;#39; ]
// i = 4 의 경우 [ &amp;#39;5&amp;#39;, &amp;#39;2&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;testCase&lt;/code&gt;라는 변수에 &lt;code&gt;inputData[i]&lt;/code&gt; 즉 &lt;code&gt;inputData&lt;/code&gt;의 각 인덱스로부터 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt; 즉 공백을 매개변수로 가지는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 &lt;u&gt;각 테스트 케이스에 대한 배열&lt;/u&gt;을 생성합니다.&lt;/p&gt;
&lt;h6&gt;map() (각 testCase에 대한 배열의 형식 변환)&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt; count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);

  console.log(testCase);
  //  [ 1, 1 ]
  //  [ 2, 3 ]
  //  [ 3, 4 ]
  //  [ 9, 8 ]
  //  [ 5, 2 ]
}
// i = 0 의 경우 [ 1, 1 ]
// i = 1 의 경우 [ 2, 3 ]
// i = 2 의 경우 [ 3, 4 ]
// i = 3 의 경우 [ 9, 8 ]
// i = 4 의 경우 [ 5, 2 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;생성한 배열을 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 &lt;code&gt;callback&lt;/code&gt;함수 &lt;code&gt;(value) =&amp;gt; +value)&lt;/code&gt;를 통해 &lt;u&gt;문자열이였던 형식을 숫자 형식으로&lt;/u&gt; 바꿔줍니다.&lt;/p&gt;
&lt;h5&gt;결과값 출력하기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(testCase[0] + testCase[1]);
// 2
// 5
// 7
// 17
// 7&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;console.log()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 &lt;code&gt;testCase[0] + testCase[1]&lt;/code&gt; 즉 &lt;code&gt;testCase&lt;/code&gt;의 &lt;u&gt;인덱스 &lt;code&gt;0&lt;/code&gt;과 &lt;code&gt;1&lt;/code&gt;의 값을 합한 결과값&lt;/u&gt;을 출력합니다.&lt;/p&gt;
&lt;h2&gt;13. A+B-4&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10951&quot;&gt;https://www.acmicpc.net/problem/10951&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;A+B-4

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력
입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 &amp;lt; A, B &amp;lt; 10)

출력
각 테스트 케이스마다 A+B를 출력한다.

예제 입력 1
1 1
2 3
3 4
9 8
5 2

예제 출력 1
2
5
7
17
7&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .trim()
  .split(&amp;quot;\n&amp;quot;);

const count = inputData.length;

for (let i = 0; i &amp;lt; count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);

  console.log(testCase[0] + testCase[1]);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData (입력값)&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 31 20 31 0a 32 20 33 0a 33 20 34 0a 39 20 38 0a 35 20 32&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;문자열 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData);
// 1 1
// 2 3
// 3 4
// 9 8
// 5 2&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;toString()&lt;/h6&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;공백 제거&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .trim();

console.log(inputData);
// 1 1
// 2 3
// 3 4
// 9 8
// 5 2&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;trim()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/Trim&quot;&gt;&lt;code&gt;trim()&lt;/code&gt;&lt;/a&gt;을 활용하여 문자열 양 끝의 공백을 제거합니다.&lt;/p&gt;
&lt;h5&gt;배열 생성&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .trim()
  .split(&amp;quot;\n&amp;quot;);

console.log(inputData); // [ &amp;#39;1 1&amp;#39;, &amp;#39;2 3&amp;#39;, &amp;#39;3 4&amp;#39;, &amp;#39;9 8&amp;#39;, &amp;#39;5 2&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;을 활용하여 매개변수에 다음줄을 의미하는 &lt;code&gt;&amp;quot;\n&amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h4&gt;count&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const count = inputData.length;

console.log(count); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;테스트 케이스의 개수&lt;/h5&gt;
&lt;h6&gt;length&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/length&quot;&gt;&lt;code&gt;length&lt;/code&gt;&lt;/a&gt; 속성을 활용하여 &lt;code&gt;inputData&lt;/code&gt;의 길이를 구하여 테스트 케이스의 개수를 구합니다.&lt;/p&gt;
&lt;h4&gt;for (각 테스트 케이스에 대한 반복문)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt; count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);

  console.log(testCase[0] + testCase[1]);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt; count; i++) {}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;count&lt;/code&gt;의 값은 &lt;code&gt;5&lt;/code&gt;입니다. 테스트 케이스들에 해당하는 인덱스는 0,1,2,3,4 총 5가지입니다.&lt;/p&gt;
&lt;p&gt;이것을 활용하여 뒤에 나오는 연산을 진행합니다.&lt;/p&gt;
&lt;h5&gt;testCase&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt; count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;각각의 테스트 케이스들을 의미하는 &lt;code&gt;testCase&lt;/code&gt;라는 변수를 생성하고 이하에 나오는 과정을 &lt;code&gt;testCase&lt;/code&gt;라는 변수에 정의합니다.&lt;/p&gt;
&lt;h6&gt;split() (각 testCase에 대한 배열 생성)&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt; count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;);

  console.log(testCase);
  // [ &amp;#39;1&amp;#39;, &amp;#39;1&amp;#39; ]
  // [ &amp;#39;2&amp;#39;, &amp;#39;3&amp;#39; ]
  // [ &amp;#39;3&amp;#39;, &amp;#39;4&amp;#39; ]
  // [ &amp;#39;9&amp;#39;, &amp;#39;8&amp;#39; ]
  // [ &amp;#39;5&amp;#39;, &amp;#39;2&amp;#39; ]
}

// i = 0 의 경우 [ &amp;#39;1&amp;#39;, &amp;#39;1&amp;#39; ]
// i = 1 의 경우 [ &amp;#39;2&amp;#39;, &amp;#39;3&amp;#39; ]
// i = 2 의 경우 [ &amp;#39;3&amp;#39;, &amp;#39;4&amp;#39; ]
// i = 3 의 경우 [ &amp;#39;9&amp;#39;, &amp;#39;8&amp;#39; ]
// i = 4 의 경우 [ &amp;#39;5&amp;#39;, &amp;#39;2&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;testCase&lt;/code&gt;라는 변수에 &lt;code&gt;inputData[i]&lt;/code&gt; 즉 &lt;code&gt;inputData&lt;/code&gt;의 각 인덱스로부터 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt; 즉 공백을 매개변수로 가지는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 &lt;u&gt;각 테스트 케이스에 대한 배열&lt;/u&gt;을 생성합니다.&lt;/p&gt;
&lt;h6&gt;map() (각 testCase에 대한 배열의 형식 변환)&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt; count; i++) {
  const testCase = inputData[i].split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);

  console.log(testCase);
  //  [ 1, 1 ]
  //  [ 2, 3 ]
  //  [ 3, 4 ]
  //  [ 9, 8 ]
  //  [ 5, 2 ]
}
// i = 0 의 경우 [ 1, 1 ]
// i = 1 의 경우 [ 2, 3 ]
// i = 2 의 경우 [ 3, 4 ]
// i = 3 의 경우 [ 9, 8 ]
// i = 4 의 경우 [ 5, 2 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;생성한 배열을 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 &lt;code&gt;callback&lt;/code&gt;함수 &lt;code&gt;(value) =&amp;gt; +value)&lt;/code&gt;를 통해 &lt;u&gt;문자열이였던 형식을 숫자 형식으로&lt;/u&gt; 바꿔줍니다.&lt;/p&gt;
&lt;h5&gt;결과값 출력하기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(testCase[0] + testCase[1]);
// 2
// 5
// 7
// 17
// 7&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;console.log()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 &lt;code&gt;testCase[0] + testCase[1]&lt;/code&gt; 즉 &lt;code&gt;testCase&lt;/code&gt;의 &lt;u&gt;인덱스 &lt;code&gt;0&lt;/code&gt;과 &lt;code&gt;1&lt;/code&gt;의 값을 합한 결과값&lt;/u&gt;을 출력합니다.&lt;/p&gt;
&lt;h2&gt;14. 더하기 사이클&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1110&quot;&gt;https://www.acmicpc.net/problem/1110&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;더하기 사이클

문제
0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.

26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.

위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.

N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.

입력
첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.

출력
첫째 줄에 N의 사이클 길이를 출력한다.

예제 입력 1
26

예제 출력 1
4

예제 입력 2
55

예제 출력 2
3

예제 입력 3
1

예제 출력 3
60

예제 입력 4
0

예제 출력 4
1

예제 입력 5
71

예제 출력 5
12&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = +fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

let value = inputData;
let sum;
let cycle = 0;

do {
  cycle++;
  sum = Math.floor(value / 10) + (value % 10);
  value = (value % 10) * 10 + (sum % 10);
} while (inputData !== value);

console.log(cycle);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData (입력값)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = +fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 32 36&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;숫자 형식으로 변환&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = +fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // 26&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;+&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;+&lt;/code&gt;를 통해 버퍼 형식이었던 값을 숫자 형식으로 변환해줍니다.&lt;/p&gt;
&lt;h4&gt;value&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let value = inputData;

console.log(value); // 26&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;value로 inputData 값 선언&lt;/h5&gt;
&lt;h6&gt;let&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;inputData&lt;/code&gt;의 값을 &lt;code&gt;value&lt;/code&gt;라는 변수로 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/let&quot;&gt;&lt;code&gt;let&lt;/code&gt;&lt;/a&gt; 명령문을 활용하여 선언해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;let&lt;/code&gt; 명령문으로 &lt;code&gt;value&lt;/code&gt; 값은 &lt;u&gt;수정 가능한 값&lt;/u&gt;이 됩니다.&lt;/p&gt;
&lt;h4&gt;sum&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let sum;

console.log(sum); // undefined&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;value 값의 일의 자리와 십의 자리의 합&lt;/h5&gt;
&lt;h6&gt;let&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;sum&lt;/code&gt; 변수는 &lt;u&gt;&lt;code&gt;value&lt;/code&gt;값의 십의 자리와 일의 자리를 합한 수를 담는 변수&lt;/u&gt;입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/let&quot;&gt;&lt;code&gt;let&lt;/code&gt;&lt;/a&gt; 명령문을 활용하여 선언해줘 &lt;code&gt;sum&lt;/code&gt;은 &lt;u&gt;수정 가능한 값&lt;/u&gt;이 됩니다.&lt;/p&gt;
&lt;h4&gt;cycle&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let cycle = 0;

console.log(cycle); // 0&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;사이클의 길이&lt;/h5&gt;
&lt;h6&gt;let&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/let&quot;&gt;&lt;code&gt;let&lt;/code&gt;&lt;/a&gt; 명령문을 활용하여 &lt;u&gt;사이클의 길이를 의미하는 변수&lt;/u&gt; &lt;code&gt;cycle&lt;/code&gt;을 &lt;code&gt;0&lt;/code&gt;으로 선언합니다.&lt;/p&gt;
&lt;p&gt;초기 사이클의 값은 0이고 &lt;code&gt;cycle&lt;/code&gt;은 &lt;u&gt;수정 가능한 값&lt;/u&gt;이 됩니다.&lt;/p&gt;
&lt;h4&gt;do...while&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;do {
  cycle++;
  sum = Math.floor(value / 10) + (value % 10);
  value = (value % 10) * 10 + (sum % 10);
} while (inputData !== value);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/do...while&quot;&gt;do...while&lt;/a&gt;을 활용해 사이클의 값을 구합니다.&lt;/p&gt;
&lt;h5&gt;cycle++ (cycle값 1개씩 증가)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;do {
  cycle++
} while ();&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;++&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Increment&quot;&gt;증가(++)&lt;/a&gt;를 통해 &lt;code&gt;cycle&lt;/code&gt;은 과정이 한 번 시작되었기 때문에 do...while문이 시작함과 동시에 증가하게 합니다.&lt;/p&gt;
&lt;h5&gt;sum (value의 일의 자리 십의 자리 합)&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;do {
  cycle++;
  sum = Math.floor(value / 10) + (value % 10);
} while ();

// expected output:
// 2 + 6 = 8&lt;/code&gt;&lt;/pre&gt;
&lt;h6&gt;Math.floor&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math/floor&quot;&gt;&lt;code&gt;Math.floor&lt;/code&gt;&lt;/a&gt; 함수를 통해 &lt;u&gt;주어진 수 이하의 가장 큰 정수&lt;/u&gt;를 반환합니다.&lt;/p&gt;
&lt;p&gt;즉 예제값 &lt;code&gt;26&lt;/code&gt;을 &lt;code&gt;value / 10&lt;/code&gt;의 과정을 거치면 &lt;code&gt;2.6&lt;/code&gt;이 됩니다. 여기서 &lt;code&gt;Math.floor&lt;/code&gt;를 통해 반환한 값은 &lt;code&gt;2&lt;/code&gt;입니다. 값의 십의 자리를 반환하는 것입니다.&lt;/p&gt;
&lt;p&gt;이렇게 반환한 값과 &lt;code&gt;value % 10&lt;/code&gt; 나머지 즉 일의 자리 값, 예제로 따지면 &lt;code&gt;6&lt;/code&gt;을 합합니다.&lt;/p&gt;
&lt;p&gt;그리하여 &lt;code&gt;sum&lt;/code&gt;의 값은 &lt;code&gt;8&lt;/code&gt;이 됩니다.&lt;/p&gt;
&lt;h5&gt;value&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;do {
  cycle++;
  sum = Math.floor(value / 10) + (value % 10);
  value = (value % 10) * 10 + (sum % 10);
} while ();

// expected output:
// 60 + 8 = 68&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;value&lt;/code&gt;는 초기값으로 &lt;code&gt;inputData&lt;/code&gt;를 가지는 값을 가지고 있습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;위 블록주석대로 &lt;code&gt;(value % 10) * 10&lt;/code&gt; 연산을 통해 주어진 수의 가장 오른쪽 자리 수, 즉 &lt;code&gt;value&lt;/code&gt;를 &lt;code&gt;10&lt;/code&gt;으로 나눈 나머지를 구하고 10을 곱하고,&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sum % 10&lt;/code&gt; 연산을 통해 합의 가장 오른쪽 자리 수, 즉 &lt;code&gt;sum&lt;/code&gt;을 &lt;code&gt;10&lt;/code&gt;으로 나눈 나머지를 구하여 둘을 합합니다.&lt;/p&gt;
&lt;p&gt;합한 값을 &lt;code&gt;value&lt;/code&gt; 값으로 초기화합니다.&lt;/p&gt;
&lt;h5&gt;while 내의 조건식&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;do {
  cycle++;
  sum = Math.floor(value / 10) + (value % 10);
  value = (value % 10) * 10 + (sum % 10);
} while (inputData !== value);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;초기값인 &lt;code&gt;inputData&lt;/code&gt;와 다시 초기화가 된 &lt;code&gt;value&lt;/code&gt; 값이 일치하지 않으면 즉 &lt;code&gt;true&lt;/code&gt;면 do...while 문을 빠져나오지 않고 계속 일치할때까지 진행하고, 일치하면 즉 &lt;code&gt;false&lt;/code&gt;라면 빠져나옵니다.&lt;/p&gt;
&lt;h4&gt;결과값 출력하기&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(cycle); // 4&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;cycle 출력&lt;/h5&gt;
&lt;h6&gt;console.log()&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 &lt;code&gt;cycle&lt;/code&gt; 값을 출력합니다.&lt;/p&gt;</description>
      <category>Nodejs</category>
      <category>BaekJoon</category>
      <category>nodejs</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/83</guid>
      <comments>https://sukvvon.tistory.com/83#entry83comment</comments>
      <pubDate>Fri, 22 Jul 2022 19:43:04 +0900</pubDate>
    </item>
    <item>
      <title>[Nodejs][백준] 단계별로 풀어보기 - 2. 조건문</title>
      <link>https://sukvvon.tistory.com/82</link>
      <description>&lt;h2&gt;1. 두 수 비교하기&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1330&quot;&gt;https://www.acmicpc.net/problem/1330&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;두 수 비교하기

문제
두 정수 A와 B가 주어졌을 때, A와 B를 비교하는 프로그램을 작성하시오.

입력
첫째 줄에 A와 B가 주어진다. A와 B는 공백 한 칸으로 구분되어져 있다.

출력
첫째 줄에 다음 세 가지 중 하나를 출력한다.

A가 B보다 큰 경우에는 &amp;#39;&amp;gt;&amp;#39;를 출력한다.
A가 B보다 작은 경우에는 &amp;#39;&amp;lt;&amp;#39;를 출력한다.
A와 B가 같은 경우에는 &amp;#39;==&amp;#39;를 출력한다.

제한
-10,000 ≤ A, B ≤ 10,000

예제 입력 1
1 2

예제 출력 1
&amp;lt;

예제 입력 2
10 2

예제 출력 2
&amp;gt;

예제 입력 3
5 5

예제 출력 3
==&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;)
  .map((value) =&amp;gt; +value);

const [a, b] = inputData;

function compare(a, b) {
  if (a &amp;gt; b) {
    return &amp;quot;&amp;gt;&amp;quot;;
  } else if (a &amp;lt; b) {
    return &amp;quot;&amp;lt;&amp;quot;;
  } else if (a == b) {
    return &amp;quot;==&amp;quot;;
  }
}

console.log(compare(a, b));&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData&lt;/h4&gt;
&lt;h5&gt;readFileSync()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 31 20 32&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;백준의 파일 경로는 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;toString()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData); // 1 2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;split()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;);

console.log(inputData); // [ &amp;#39;1&amp;#39;, &amp;#39;2&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;를 활용하여 매개변수에 &lt;u&gt;공백을 의미&lt;/u&gt;하는 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h5&gt;map()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;)
  .map((value) =&amp;gt; +value);

console.log(inputData); // [ 1, 2 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드의 callback 함수를 활용하여 &lt;code&gt;string&lt;/code&gt; 형식이었던 배열의 각 값을 &lt;code&gt;number&lt;/code&gt; 형식으로 바꿉니다.&lt;/p&gt;
&lt;h5&gt;배열 구조 분해&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [a, b] = inputData;
console.log(a); // 1
console.log(b); // 2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 통해 배열 속의 &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;에 값을 할당합니다.&lt;/p&gt;
&lt;h4&gt;compare()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function compare(a, b) {
  if (a &amp;gt; b) {
    return &amp;quot;&amp;gt;&amp;quot;;
  } else if (a &amp;lt; b) {
    return &amp;quot;&amp;lt;&amp;quot;;
  } else if (a == b) {
    return &amp;quot;==&amp;quot;;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;if...else&lt;/h5&gt;
&lt;p&gt;매개변수 &lt;code&gt;a&lt;/code&gt;,&lt;code&gt;b&lt;/code&gt;를 받는 함수 &lt;code&gt;compare()&lt;/code&gt;을 생성하여 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/if...else&quot;&gt;if...else&lt;/a&gt;를 활용하여&lt;/p&gt;
&lt;p&gt;&lt;code&gt;a&lt;/code&gt;가 &lt;code&gt;b&lt;/code&gt;보다 큰 경우 &lt;code&gt;&amp;quot;&amp;gt;&amp;quot;&lt;/code&gt;을,&lt;br&gt;&lt;code&gt;a&lt;/code&gt;가 &lt;code&gt;b&lt;/code&gt;보다 작은 경우 &lt;code&gt;&amp;quot;&amp;lt;&amp;quot;&lt;/code&gt;을,&lt;br&gt;&lt;code&gt;a&lt;/code&gt;와 &lt;code&gt;b&lt;/code&gt;가 같은 경우 &lt;code&gt;&amp;quot;==&amp;quot;&lt;/code&gt;을&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/return&quot;&gt;&lt;code&gt;return&lt;/code&gt;&lt;/a&gt; 명령문을 통해 반환하게 합니다.&lt;/p&gt;
&lt;h4&gt;console.log()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(compare(a, b)); // &amp;lt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;1&lt;/code&gt;과 &lt;code&gt;2&lt;/code&gt;를 대입하였을 경우 &lt;code&gt;&amp;lt;&lt;/code&gt; 가 출력되고,&lt;br&gt;&lt;code&gt;10&lt;/code&gt;, &lt;code&gt;2&lt;/code&gt;를 대입하였을 경우 &lt;code&gt;&amp;gt;&lt;/code&gt;가 출력되고,&lt;br&gt;&lt;code&gt;5&lt;/code&gt;, &lt;code&gt;5&lt;/code&gt;를 대입하였을 경우 &lt;code&gt;==&lt;/code&gt;가 출력되는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;2. 시험 성적&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/9498&quot;&gt;https://www.acmicpc.net/problem/9498&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;시험 성적

문제
시험 점수를 입력받아 90 ~ 100점은 A, 80 ~ 89점은 B, 70 ~ 79점은 C, 60 ~ 69점은 D, 나머지 점수는 F를 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 시험 점수가 주어진다. 시험 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.

출력
시험 성적을 출력한다.

예제 입력 1
100

예제 출력 1
A&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = +fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

function grade(score) {
  if (score &amp;gt;= 90 &amp;amp;&amp;amp; score &amp;lt;= 100) {
    return &amp;quot;A&amp;quot;;
  } else if (score &amp;gt;= 80 &amp;amp;&amp;amp; score &amp;lt; 90) {
    return &amp;quot;B&amp;quot;;
  } else if (score &amp;gt;= 70 &amp;amp;&amp;amp; score &amp;lt; 80) {
    return &amp;quot;C&amp;quot;;
  } else if (score &amp;gt;= 60 &amp;amp;&amp;amp; score &amp;lt; 70) {
    return &amp;quot;D&amp;quot;;
  } else {
    return &amp;quot;F&amp;quot;;
  }
}

console.log(grade(inputData));&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData&lt;/h4&gt;
&lt;h5&gt;readFileSync()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 31 30 30&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;백준의 파일 경로는 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;+&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = +fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // 100&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;code&gt;inputData&lt;/code&gt;로 정의하려는 식 앞에 &lt;code&gt;+&lt;/code&gt;를 붙여 &lt;u&gt;실수 형식으로 변환&lt;/u&gt;합니다.&lt;/p&gt;
&lt;h4&gt;grade()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function grade(score) {
  if (score &amp;gt;= 90 &amp;amp;&amp;amp; score &amp;lt;= 100) {
    return &amp;quot;A&amp;quot;;
  } else if (score &amp;gt;= 80 &amp;amp;&amp;amp; score &amp;lt; 90) {
    return &amp;quot;B&amp;quot;;
  } else if (score &amp;gt;= 70 &amp;amp;&amp;amp; score &amp;lt; 80) {
    return &amp;quot;C&amp;quot;;
  } else if (score &amp;gt;= 60 &amp;amp;&amp;amp; score &amp;lt; 70) {
    return &amp;quot;D&amp;quot;;
  } else {
    return &amp;quot;F&amp;quot;;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;if...else&lt;/h5&gt;
&lt;p&gt;매개변수 &lt;code&gt;score&lt;/code&gt;를 받는 함수 &lt;code&gt;grade()&lt;/code&gt;를 생성하여 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/if...else&quot;&gt;if...else&lt;/a&gt;를 활용하여&lt;/p&gt;
&lt;p&gt;score가 90이상 100 이하이면 &lt;code&gt;&amp;quot;A&amp;quot;&lt;/code&gt;를,&lt;br&gt;80이상 90 미만이면 &lt;code&gt;&amp;quot;B&amp;quot;&lt;/code&gt;를,&lt;br&gt;70이상 80 미만이면 &lt;code&gt;&amp;quot;C&amp;quot;&lt;/code&gt;를,&lt;br&gt;60이상 70 미만이면 &lt;code&gt;&amp;quot;D&amp;quot;&lt;/code&gt;를,&lt;br&gt;위의 조건을 충족하지 못하는 나머지의 경우 &lt;code&gt;&amp;quot;F&amp;quot;&lt;/code&gt;를&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/return&quot;&gt;&lt;code&gt;return&lt;/code&gt;&lt;/a&gt; 명령문을 통해 반환하게 합니다.&lt;/p&gt;
&lt;h4&gt;console.log()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(grade(inputData)); // A&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log&lt;/code&gt;&lt;/a&gt; 메서드를 통해 &lt;code&gt;A&lt;/code&gt;가 정상적으로 출력되는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;3. 윤년&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2753&quot;&gt;https://www.acmicpc.net/problem/2753&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;윤년

문제
연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오.

윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다.

예를 들어, 2012년은 4의 배수이면서 100의 배수가 아니라서 윤년이다. 1900년은 100의 배수이고 400의 배수는 아니기 때문에 윤년이 아니다. 하지만, 2000년은 400의 배수이기 때문에 윤년이다.

입력
첫째 줄에 연도가 주어진다. 연도는 1보다 크거나 같고, 4000보다 작거나 같은 자연수이다.

출력
첫째 줄에 윤년이면 1, 아니면 0을 출력한다.

예제 입력 1
2000

예제 출력 1
1

예제 입력 2
1999

예제 출력 2
0&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = +fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

(inputData % 4 === 0 &amp;amp;&amp;amp; inputData % 100 !== 0) ||
(inputData % 4 === 0 &amp;amp;&amp;amp; inputData % 400 === 0)
  ? console.log(1)
  : console.log(0);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData&lt;/h4&gt;
&lt;h5&gt;readFileSync()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 32 30 30 30&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;백준의 파일 경로는 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;+&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = +fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // 2000&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;code&gt;inputData&lt;/code&gt;로 정의하려는 식 앞에 &lt;code&gt;+&lt;/code&gt;를 붙여 &lt;u&gt;실수 형식으로 변환&lt;/u&gt;합니다.&lt;/p&gt;
&lt;h4&gt;윤년&lt;/h4&gt;
&lt;h5&gt;삼항연산자&lt;/h5&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/if...else&quot;&gt;if...else&lt;/a&gt;문으로 할 수 있지만 간단하게 표현하기 위해 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Conditional_Operator&quot;&gt;삼항연산자&lt;/a&gt;를 활용해보았습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;(inputData % 4 === 0 &amp;amp;&amp;amp; inputData % 100 !== 0) ||
  (inputData % 4 === 0 &amp;amp;&amp;amp; inputData % 400 === 0);&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;4의 배수이면서 100의 배수가 아닐 때이거나 4의 배수이면서 400의 배수일 때를 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Expressions_and_Operators#%EB%B9%84%EA%B5%90_%EC%97%B0%EC%82%B0%EC%9E%90&quot;&gt;비교연산자&lt;/a&gt;와 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Expressions_and_Operators#%EB%85%BC%EB%A6%AC_%EC%97%B0%EC%82%B0%EC%9E%90&quot;&gt;논리연산자&lt;/a&gt;와 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Expressions_and_Operators#%EC%82%B0%EC%88%A0_%EC%97%B0%EC%82%B0%EC%9E%90&quot;&gt;산술연산자&lt;/a&gt;를 활용하여 조건에 맞게 구현합니다.&lt;/p&gt;
&lt;h5&gt;console.log()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;(inputData % 4 === 0 &amp;amp;&amp;amp; inputData % 100 !== 0) ||
(inputData % 4 === 0 &amp;amp;&amp;amp; inputData % 400 === 0)
  ? console.log(1)
  : console.log(0); // 1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;&lt;code&gt;console.log&lt;/code&gt;&lt;/a&gt; 메서드를 통해 2000년은 윤년이므로 &lt;code&gt;1&lt;/code&gt;이 정상적으로 출력되는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;4. 사분면 고르기&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14681&quot;&gt;https://www.acmicpc.net/problem/14681&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://onlinejudgeimages.s3-ap-northeast-1.amazonaws.com/problem/14681/1.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;사분면 고르기

문제
흔한 수학 문제 중 하나는 주어진 점이 어느 사분면에 속하는지 알아내는 것이다. 사분면은 아래 그림처럼 1부터 4까지 번호를 갖는다. &amp;quot;Quadrant n&amp;quot;은 &amp;quot;제n사분면&amp;quot;이라는 뜻이다.


예를 들어, 좌표가 (12, 5)인 점 A는 x좌표와 y좌표가 모두 양수이므로 제1사분면에 속한다. 점 B는 x좌표가 음수이고 y좌표가 양수이므로 제2사분면에 속한다.

점의 좌표를 입력받아 그 점이 어느 사분면에 속하는지 알아내는 프로그램을 작성하시오. 단, x좌표와 y좌표는 모두 양수나 음수라고 가정한다.

입력
첫 줄에는 정수 x가 주어진다. (−1000 ≤ x ≤ 1000; x ≠ 0) 다음 줄에는 정수 y가 주어진다. (−1000 ≤ y ≤ 1000; y ≠ 0)

출력
점 (x, y)의 사분면 번호(1, 2, 3, 4 중 하나)를 출력한다.

예제 입력 1
12
5

예제 출력 1
1

예제 입력 2
9
-13

예제 출력 2
4&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(process.platform === &amp;quot;linux&amp;quot; ? 0 : &amp;quot;../../../../index.txt&amp;quot;)
  .toString()
  .split(&amp;quot;\n&amp;quot;)
  .map((value) =&amp;gt; +value);

const [a, b] = inputData;

function quadrant(a, b) {
  if (a &amp;gt; 0 &amp;amp;&amp;amp; b &amp;gt; 0) {
    return 1;
  } else if (a &amp;lt; 0 &amp;amp;&amp;amp; b &amp;gt; 0) {
    return 2;
  } else if (a &amp;lt; 0 &amp;amp;&amp;amp; b &amp;lt; 0) {
    return 3;
  } else if (a &amp;gt; 0 &amp;amp;&amp;amp; b &amp;lt; 0) {
    return 4;
  }
}

console.log(quadrant(a, b));&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData&lt;/h4&gt;
&lt;h5&gt;readFileSync()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? 0 : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 31 32 0a 35&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;백준의 파일 경로는 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;입니다. 하지만 이 문제에서만큼은 이유를 잘 모르겠지만 백준에서 &lt;em&gt;런타임 에러&lt;/em&gt;가 납니다. 다른 분들이 하신 것을 참고해보니, &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt; 대신에 &lt;code&gt;0&lt;/code&gt;을 넣었더니 문제가 풀렸습니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;0&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;toString()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(process.platform === &amp;quot;linux&amp;quot; ? 0 : &amp;quot;../../../../index.txt&amp;quot;)
  .toString();

console.log(inputData);
// 12
// 5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;split()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(process.platform === &amp;quot;linux&amp;quot; ? 0 : &amp;quot;../../../../index.txt&amp;quot;)
  .toString()
  .split(&amp;quot;\n&amp;quot;);

console.log(inputData); // [ &amp;#39;12&amp;#39;, &amp;#39;5&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;를 활용하여 매개변수에 다음줄을 의미하는 &lt;code&gt;&amp;quot;\n&amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h5&gt;map()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(process.platform === &amp;quot;linux&amp;quot; ? 0 : &amp;quot;../../../../index.txt&amp;quot;)
  .toString()
  .split(&amp;quot; &amp;quot;)
  .map((value) =&amp;gt; +value);

console.log(inputData); // [ 12, 5 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드의 callback 함수를 활용하여 &lt;code&gt;string&lt;/code&gt; 형식이었던 배열의 각 값을 &lt;code&gt;number&lt;/code&gt; 형식으로 바꿉니다.&lt;/p&gt;
&lt;h5&gt;배열 구조 분해&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [a, b] = inputData;
console.log(a); // 12
console.log(b); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 통해 배열 속의 &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;에 값을 할당합니다.&lt;/p&gt;
&lt;h4&gt;quadrant(a,b)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function quadrant(a, b) {
  if (a &amp;gt; 0 &amp;amp;&amp;amp; b &amp;gt; 0) {
    return 1;
  } else if (a &amp;lt; 0 &amp;amp;&amp;amp; b &amp;gt; 0) {
    return 2;
  } else if (a &amp;lt; 0 &amp;amp;&amp;amp; b &amp;lt; 0) {
    return 3;
  } else if (a &amp;gt; 0 &amp;amp;&amp;amp; b &amp;lt; 0) {
    return 4;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;사분면을 구별할 수 있는 매개변수 &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;를 요구하는 &lt;code&gt;quadrant()&lt;/code&gt; 함수를 만듭니다.&lt;/p&gt;
&lt;h5&gt;if...else&lt;/h5&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/if...else&quot;&gt;if...else&lt;/a&gt;문과 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Expressions_and_Operators#%EB%B9%84%EA%B5%90_%EC%97%B0%EC%82%B0%EC%9E%90&quot;&gt;비교연산자&lt;/a&gt;와 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Expressions_and_Operators#%EB%85%BC%EB%A6%AC_%EC%97%B0%EC%82%B0%EC%9E%90&quot;&gt;논리연산자&lt;/a&gt;을 활용하여&lt;/p&gt;
&lt;h6&gt;return&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;가 모두 양수일 경우 &lt;em&gt;1사분면&lt;/em&gt;을 의미하는 &lt;code&gt;1&lt;/code&gt;을 반환하고,&lt;br&gt;&lt;code&gt;a&lt;/code&gt;는 음수이고, &lt;code&gt;b&lt;/code&gt;는 양수일 &lt;em&gt;2사분면&lt;/em&gt;을 의미하는 경우 &lt;code&gt;2&lt;/code&gt;를 반환하고,&lt;br&gt;&lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;가 모두 음수일 경우 &lt;em&gt;3사분면&lt;/em&gt;을 의미하는 &lt;code&gt;3&lt;/code&gt;을 반환하고,&lt;br&gt;&lt;code&gt;a&lt;/code&gt;는 양수이고, &lt;code&gt;b&lt;/code&gt;는 음수일 경우 &lt;em&gt;4사분면&lt;/em&gt;을 의미하는 &lt;code&gt;4&lt;/code&gt;를 반환하게 합니다.&lt;/p&gt;
&lt;h4&gt;console.log()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(quadrant(a, b)); // 1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;console.log()&lt;/a&gt; 메서드를 통해 &lt;code&gt;quadrant(a,b)&lt;/code&gt;를 출력하면 &lt;code&gt;12, 5&lt;/code&gt;인 경우 &lt;code&gt;1&lt;/code&gt;이 출력되고 &lt;code&gt;9, -13&lt;/code&gt;일 경우 &lt;code&gt;4&lt;/code&gt;가 출력되는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;5. 알람 시계&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2884&quot;&gt;https://www.acmicpc.net/problem/2884&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;알람 시계

문제
상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다.

상근이는 모든 방법을 동원해보았지만, 조금만 더 자려는 마음은 그 어떤 것도 없앨 수가 없었다.

이런 상근이를 불쌍하게 보던, 창영이는 자신이 사용하는 방법을 추천해 주었다.

바로 &amp;quot;45분 일찍 알람 설정하기&amp;quot;이다.

이 방법은 단순하다. 원래 설정되어 있는 알람을 45분 앞서는 시간으로 바꾸는 것이다. 어차피 알람 소리를 들으면, 알람을 끄고 조금 더 잘 것이기 때문이다. 이 방법을 사용하면, 매일 아침 더 잤다는 기분을 느낄 수 있고, 학교도 지각하지 않게 된다.

현재 상근이가 설정한 알람 시각이 주어졌을 때, 창영이의 방법을 사용한다면, 이를 언제로 고쳐야 하는지 구하는 프로그램을 작성하시오.

입력
첫째 줄에 두 정수 H와 M이 주어진다. (0 ≤ H ≤ 23, 0 ≤ M ≤ 59) 그리고 이것은 현재 상근이가 설정한 놓은 알람 시간 H시 M분을 의미한다.

입력 시간은 24시간 표현을 사용한다. 24시간 표현에서 하루의 시작은 0:0(자정)이고, 끝은 23:59(다음날 자정 1분 전)이다. 시간을 나타낼 때, 불필요한 0은 사용하지 않는다.

출력
첫째 줄에 상근이가 창영이의 방법을 사용할 때, 설정해야 하는 알람 시간을 출력한다. (입력과 같은 형태로 출력하면 된다.)

예제 입력 1
10 10

예제 출력 1
9 25

예제 입력 2
0 30

예제 출력 2
23 45

예제 입력 3
23 40

예제 출력 3
22 55&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;)
  .map((value) =&amp;gt; +value);

const [hour, minute] = inputData;

function alarm(hour, minute) {
  minute -= 45;
  if (minute &amp;lt; 0) {
    minute += 60;
    hour -= 1;
    if (hour &amp;lt; 0) {
      hour = 23;
    }
  }
  return [hour, minute];
}

const [newHour, newMinute] = alarm(hour, minute);

console.log(newHour, newMinute);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData&lt;/h4&gt;
&lt;h5&gt;readFileSync()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 30 20 33 30&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;toString()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData); // 0 30&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;split()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;);

console.log(inputData); // [ &amp;#39;0&amp;#39;, &amp;#39;30&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;를 활용하여 매개변수에 공백을 의미하는 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h5&gt;map()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;)
  .map((value) =&amp;gt; +value);

console.log(inputData); // [ 0, 30 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드의 callback 함수를 활용하여 &lt;code&gt;string&lt;/code&gt; 형식이었던 배열의 각 값을 &lt;code&gt;number&lt;/code&gt; 형식으로 바꿉니다.&lt;/p&gt;
&lt;h5&gt;배열 구조 분해&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [hours, minutes] = inputData;
console.log(a); // 0
console.log(b); // 30&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 통해 배열 속의 &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;에 값을 할당합니다.&lt;/p&gt;
&lt;h4&gt;alarm()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function alarm(hour, minute) {
  minute -= 45;
  if (minute &amp;lt; 0) {
    minute += 60;
    hour -= 1;
    if (hour &amp;lt; 0) {
      hour = 23;
    }
  }
  return [hour, minute];
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;사분면을 구별할 수 있는 매개변수 &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;를 요구하는 &lt;code&gt;alarm()&lt;/code&gt; 함수를 만듭니다.&lt;/p&gt;
&lt;h5&gt;if...else&lt;/h5&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/if...else&quot;&gt;if...else&lt;/a&gt;문과 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Expressions_and_Operators#%ED%95%A0%EB%8B%B9_%EC%97%B0%EC%82%B0%EC%9E%90&quot;&gt;할당연산자&lt;/a&gt;를 활용하여&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function alarm(hour, minute) {
  minute -= 45; // expected output: 0 -15
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;45분 일찍 알람 설정하기로 인해 &lt;code&gt;minute -= 45&lt;/code&gt;의 과정을 거치면 결과는 &lt;code&gt;0 -15&lt;/code&gt;가 됩니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function alarm(hour, minute) {
  minute -= 45;
  if (minute &amp;lt; 0) {
    minute += 60; // expected output: 0 45
    hour -= 1; // expected output: -1 45
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;음수인 분단위는 존재하지가 않으므로 &lt;code&gt;0 -15&lt;/code&gt;에서 &lt;code&gt;minute += 60&lt;/code&gt;을 해줍니다. 결과값은 &lt;code&gt;0 45&lt;/code&gt; 이 되고,&lt;/p&gt;
&lt;p&gt;60분을 시간에서 빼서 더하였기 때문에 시간을 1만큼 빼줘 &lt;code&gt;hour -= 1&lt;/code&gt; 를 거쳐 &lt;code&gt;-1 45&lt;/code&gt;가 되게 합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function alarm(hour, minute) {
  minute -= 45;
  if (minute &amp;lt; 0) {
    minute += 60;
    hour -= 1;
    if (hour &amp;lt; 0) {
      hour = 23; // expected output: 23 45
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;시간에서 0은 자정을 의미하기 때문에 만약 시간을 의미하는 매개변수 &lt;code&gt;hour&lt;/code&gt;이 &lt;code&gt;0&lt;/code&gt;보다 작으면 &lt;code&gt;hour&lt;/code&gt;은 &lt;code&gt;23&lt;/code&gt;이라고 설정해줍니다.&lt;/p&gt;
&lt;h5&gt;return&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function alarm(hour, minute) {
  minute -= 45;
  if (minute &amp;lt; 0) {
    minute += 60;
    hour -= 1;
    if (hour &amp;lt; 0) {
      hour = 23;
    }
  }
  return [hour, minute];
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;if...else문을 통해서 계산된 &lt;code&gt;hour&lt;/code&gt;과 &lt;code&gt;minute&lt;/code&gt;를 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/return&quot;&gt;return&lt;/a&gt; 명령문을 통해 배열로 반환해줍니다.&lt;/p&gt;
&lt;h5&gt;배열 구조 분해&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [newHour, nweMinute] = alarm(hour, minute);
console.log(newHour); // 23
console.log(newMinute); // 45&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 통해 &lt;code&gt;alarm(hour, minute)&lt;/code&gt;을 통해 반환된 배열 &lt;code&gt;[hour, minute]&lt;/code&gt;로부터 &lt;code&gt;newHour&lt;/code&gt;, &lt;code&gt;newMinute&lt;/code&gt;에 값을 할당합니다.&lt;/p&gt;
&lt;h4&gt;console.log()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(newHour, newMinute); // 23 45&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;console.log()&lt;/a&gt; 메서드를 통해 &lt;code&gt;newHour&lt;/code&gt;, &lt;code&gt;newMinute&lt;/code&gt;을 출력하면 &lt;code&gt;10 10&lt;/code&gt;인 경우 &lt;code&gt;9 25&lt;/code&gt;가 출력되고 &lt;code&gt;0, 30&lt;/code&gt;일 경우 &lt;code&gt;23 45&lt;/code&gt;가 출력되고 &lt;code&gt;23 40&lt;/code&gt;은 &lt;code&gt;22 55&lt;/code&gt;가 출력되는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;6. 오븐 시계&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2525&quot;&gt;https://www.acmicpc.net/problem/2525&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;오븐 시계

문제
KOI 전자에서는 건강에 좋고 맛있는 훈제오리구이 요리를 간편하게 만드는 인공지능 오븐을 개발하려고 한다. 인공지능 오븐을 사용하는 방법은 적당한 양의 오리 훈제 재료를 인공지능 오븐에 넣으면 된다. 그러면 인공지능 오븐은 오븐구이가 끝나는 시간을 분 단위로 자동적으로 계산한다.

또한, KOI 전자의 인공지능 오븐 앞면에는 사용자에게 훈제오리구이 요리가 끝나는 시각을 알려 주는 디지털 시계가 있다.

훈제오리구이를 시작하는 시각과 오븐구이를 하는 데 필요한 시간이 분단위로 주어졌을 때, 오븐구이가 끝나는 시각을 계산하는 프로그램을 작성하시오.

입력
첫째 줄에는 현재 시각이 나온다. 현재 시각은 시 A (0 ≤ A ≤ 23) 와 분 B (0 ≤ B ≤ 59)가 정수로 빈칸을 사이에 두고 순서대로 주어진다. 두 번째 줄에는 요리하는 데 필요한 시간 C (0 ≤ C ≤ 1,000)가 분 단위로 주어진다.

출력
첫째 줄에 종료되는 시각의 시와 분을 공백을 사이에 두고 출력한다. (단, 시는 0부터 23까지의 정수, 분은 0부터 59까지의 정수이다. 디지털 시계는 23시 59분에서 1분이 지나면 0시 0분이 된다.)

예제 입력 1
14 30
20

예제 출력 1
14 50

예제 입력 2
17 40
80

예제 출력 2
19 0

예제 입력 3
23 48
25

예제 출력 3
0 13&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

const [timeData, plusMinuteData] = inputData;

const plusMinute = +plusMinuteData;

const time = timeData.split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
const [hour, minute] = time;

function ovenClock(hour, minute, plusMinute) {
  minute += plusMinute;
  while (minute &amp;gt;= 60) {
    minute -= 60;
    hour += 1;
  }
  if (hour &amp;gt;= 24) {
    hour -= 24;
  }
  return [hour, minute];
}

[resultHour, resultMinute] = ovenClock(hour, minute, plusMinute);

console.log(resultHour, resultMinute);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData&lt;/h4&gt;
&lt;h5&gt;파일 부르기&lt;/h5&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 31 37 20 34 30 0a 38 30&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;문자열 형식으로 변환&lt;/h5&gt;
&lt;h6&gt;toString()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData);
// 17 40
// 80&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;배열 생성&lt;/h5&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

console.log(inputData); // [ &amp;#39;17 40&amp;#39;, &amp;#39;80&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;를 활용하여 매개변수에 다음줄을 의미하는 &lt;code&gt;&amp;quot;\n&amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h5&gt;배열 구조 분해&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [timeData, plusMinuteData] = inputData;
console.log(timeData, plusMinuteData); // 17 40 80&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 통해 &lt;code&gt;inputData&lt;/code&gt;를 배열 속의 현재 시간을 의미하는 &lt;code&gt;timeData&lt;/code&gt;, 추가되는 시간을 의미하는 &lt;code&gt;plusMinuteData&lt;/code&gt;에 값을 할당합니다.&lt;/p&gt;
&lt;h4&gt;plusMinute&lt;/h4&gt;
&lt;h5&gt;문자열을 실수로 변한&lt;/h5&gt;
&lt;h6&gt;+&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const plusMinute = +plusMinuteData;
console.log(plusMinute); // 80&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;문자열 형식인 추가되는 시간을 의미하는 &lt;code&gt;plusMinuteData&lt;/code&gt;를 &lt;u&gt;연산을 하기 위해&lt;/u&gt; 실수 형태로 변환시켜줍니다.&lt;/p&gt;
&lt;h4&gt;time&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const time = timeData.split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
const [hour, minute] = time;&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;배열 생성&lt;/h5&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const time = timeData.split(&amp;quot; &amp;quot;);
console.log(time); // [ &amp;#39;17&amp;#39;, &amp;#39;40&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;현재 시간을 의미하는 &lt;code&gt;timeData&lt;/code&gt;에서 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt; 메서드를 활용하여 공백을 의미하는 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt;을 매개변수로 하여 배열을 생성합니다.&lt;/p&gt;
&lt;h5&gt;문자열 배열에서 실수 배열로 변환&lt;/h5&gt;
&lt;h6&gt;map()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const time = timeData.split(&amp;quot; &amp;quot;).map((value) =&amp;gt; +value);
console.log(time); // [ 17, 40 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드의 callback 함수를 활용하여 &lt;code&gt;string&lt;/code&gt; 형식이었던 배열의 각 값을 &lt;code&gt;number&lt;/code&gt; 형식으로 바꿉니다.&lt;/p&gt;
&lt;h5&gt;배열 구조 분해&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [hour, minute] = time;
console.log(hour, minute); // 17 40&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 통해 &lt;code&gt;time&lt;/code&gt;을 배열 속의 현재 시간의 &lt;code&gt;시&lt;/code&gt;를 의미하는 &lt;code&gt;hour&lt;/code&gt;, 현재 시간을 &lt;code&gt;분&lt;/code&gt; 의미하는 &lt;code&gt;minute&lt;/code&gt;에 값을 할당합니다.&lt;/p&gt;
&lt;h4&gt;ovenClock()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function ovenClock(hour, minute, plusMinute) {
  minute += plusMinute;
  while (minute &amp;gt;= 60) {
    minute -= 60;
    hour += 1;
  }
  if (hour &amp;gt;= 24) {
    hour -= 24;
  }
  return [hour, minute];
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;오븐 시간을 계산하며 매개변수 &lt;code&gt;hour&lt;/code&gt;, &lt;code&gt;minute&lt;/code&gt;, &lt;code&gt;plusMinute&lt;/code&gt;을 요구하는 &lt;code&gt;ovenClock()&lt;/code&gt; 함수를 만듭니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/if...else&quot;&gt;if...else&lt;/a&gt;문과, &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/while&quot;&gt;while&lt;/a&gt;문과 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Expressions_and_Operators#%ED%95%A0%EB%8B%B9_%EC%97%B0%EC%82%B0%EC%9E%90&quot;&gt;할당연산자&lt;/a&gt;를 활용하여&lt;/p&gt;
&lt;h5&gt;현재 시간에 추가할 시간 더하기&lt;/h5&gt;
&lt;h6&gt;+=&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function ovenClock(hour, minute, plusMinute) {
  minute += plusMinute; // expected output: 17 120
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;우선 현재 시간에서 추가할 시간을 더해야 하므로 &lt;code&gt;minute += plusMinute&lt;/code&gt;의 과정을 거치면 결과는 &lt;code&gt;17 120&lt;/code&gt;이 됩니다.&lt;/p&gt;
&lt;h5&gt;60분을 초과한 경우&lt;/h5&gt;
&lt;h6&gt;while&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function ovenClock(hour, minute, plusMinute) {
  minute += plusMinute;
  while (minute &amp;gt;= 60) {
    minute -= 60; // expected output: 60 =&amp;gt; 0
    hour += 1; // expected output: 18 =&amp;gt; 19
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;17 120&lt;/code&gt;에서 &lt;code&gt;while&lt;/code&gt;문을 만나 조건인 &lt;code&gt;minute &amp;gt;= 60&lt;/code&gt;에 만족하지 않을 때까지 &lt;code&gt;minute -= 60&lt;/code&gt;과 &lt;code&gt;hour += 1&lt;/code&gt;을 수행합니다.&lt;/p&gt;
&lt;p&gt;첫번째 사이클의 결과는 &lt;code&gt;18 60&lt;/code&gt;입니다. 조건 &lt;code&gt;minute &amp;gt;= 60&lt;/code&gt;에 만족하므로 한 번 더 진행합니다.&lt;/p&gt;
&lt;p&gt;두번째 사이클의 결과는 &lt;code&gt;19 0&lt;/code&gt;입니다. 조건 &lt;code&gt;minute &amp;gt;= 60&lt;/code&gt;에 만족하지 않으므로 &lt;code&gt;while&lt;/code&gt;문을 빠져나옵니다.&lt;/p&gt;
&lt;h5&gt;24시를 초과한 경우&lt;/h5&gt;
&lt;h6&gt;if...else&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function ovenClock(hour, minute, plusMinute) {
  minute += plusMinute;
  while (minute &amp;gt;= 60) {
    minute -= 60;
    hour += 1;
  }
  if (hour &amp;gt;= 24) {
    hour -= 24; // expected output: 19
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;만약 시가 24를 초과하여 25, 26과 같이 될 경우를 대비하여&lt;/p&gt;
&lt;p&gt;&lt;code&gt;hour &amp;gt;= 24&lt;/code&gt; 조건을 만족시킨다면 &lt;code&gt;hour -= 24&lt;/code&gt;를 통해 24시간을 빼줍니다.&lt;/p&gt;
&lt;h5&gt;return&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function ovenClock(hour, minute, plusMinute) {
  minute += plusMinute;
  while (minute &amp;gt;= 60) {
    minute -= 60;
    hour += 1;
  }
  if (hour &amp;gt;= 24) {
    hour -= 24;
  }
  return [hour, minute];
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위의 과정들을 통해 계산된 &lt;code&gt;hour&lt;/code&gt;과 &lt;code&gt;minute&lt;/code&gt;를 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/return&quot;&gt;return&lt;/a&gt; 명령문을 통해 배열로 반환해줍니다.&lt;/p&gt;
&lt;h5&gt;배열 구조 분해&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;[resultHour, resultMinute] = ovenClock(hour, minute, plusMinute);
console.log(resultHour); // 19
console.log(resultMinute); // 0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 통해 &lt;code&gt;ovenClock(hour, minute, plusMinute)&lt;/code&gt;을 통해 반환된 배열 &lt;code&gt;[hour, minute]&lt;/code&gt;로부터 &lt;code&gt;resultHour&lt;/code&gt;, &lt;code&gt;resultMinute&lt;/code&gt;에 값을 할당합니다.&lt;/p&gt;
&lt;h4&gt;결과 출력&lt;/h4&gt;
&lt;h5&gt;console.log()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(resultHour, resultMinute); // 19 0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;console.log()&lt;/a&gt; 메서드를 통해 &lt;code&gt;resultHour&lt;/code&gt;, &lt;code&gt;resultMinute&lt;/code&gt;을 출력하면 &lt;code&gt;14 30&lt;/code&gt; 그리고 &lt;code&gt;20&lt;/code&gt;인 경우 &lt;code&gt;14 50&lt;/code&gt;이 출력되고 &lt;code&gt;17 40&lt;/code&gt; 그리고 &lt;code&gt;80&lt;/code&gt;인 경우 &lt;code&gt;19 0&lt;/code&gt;이 출력되고 &lt;code&gt;23 48&lt;/code&gt; 그리고 &lt;code&gt;25&lt;/code&gt;인 경우 &lt;code&gt;0 13&lt;/code&gt;이 출력되는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;7. 주사위 세개&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2480&quot;&gt;https://www.acmicpc.net/problem/2480&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;주사위 세개

문제
1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.

같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.
같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.
모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.
예를 들어, 3개의 눈 3, 3, 6이 주어지면 상금은 1,000+3×100으로 계산되어 1,300원을 받게 된다. 또 3개의 눈이 2, 2, 2로 주어지면 10,000+2×1,000 으로 계산되어 12,000원을 받게 된다. 3개의 눈이 6, 2, 5로 주어지면 그중 가장 큰 값이 6이므로 6×100으로 계산되어 600원을 상금으로 받게 된다.

3개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.

입력
첫째 줄에 3개의 눈이 빈칸을 사이에 두고 각각 주어진다.

출력
첫째 줄에 게임의 상금을 출력 한다.

예제 입력 1
3 3 6

예제 출력 1
1300

예제 입력 2
2 2 2

예제 출력 2
12000

예제 입력 3
6 2 5

예제 출력 3
600&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputdata = fs
  .readfilesync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;)
  .map((value) =&amp;gt; +value);

const [a, b, c] = inputData;

function threeDice(first, second, third) {
  function twoSameDice(first, second, third) {
    if (first === second &amp;amp;&amp;amp; first !== third) {
      return first;
    } else if (first === third &amp;amp;&amp;amp; first !== second) {
      return first;
    } else if (second === third &amp;amp;&amp;amp; second !== first) {
      return second;
    }
  }

  function theBiggestDice(first, second, third) {
    if (
      (first &amp;gt; second &amp;amp;&amp;amp; second &amp;gt; third) ||
      (first &amp;gt; third &amp;amp;&amp;amp; third &amp;gt; second)
    ) {
      return first;
    } else if (
      (second &amp;gt; first &amp;amp;&amp;amp; first &amp;gt; third) ||
      (second &amp;gt; third &amp;amp;&amp;amp; third &amp;gt; first)
    ) {
      return second;
    } else if (
      (third &amp;gt; first &amp;amp;&amp;amp; first &amp;gt; second) ||
      (third &amp;gt; second &amp;amp;&amp;amp; second &amp;gt; first)
    ) {
      return third;
    }
  }

  if (first === second &amp;amp;&amp;amp; first === third &amp;amp;&amp;amp; second === third) {
    return 10000 + first * 1000;
  } else if (first === second || first === third || second === third) {
    return 1000 + twoSameDice(first, second, third) * 100;
  } else if (first !== second &amp;amp;&amp;amp; first !== third &amp;amp;&amp;amp; second !== third) {
    return theBiggestDice(first, second, third) * 100;
  }
}

console.log(threeDice(a, b, c));&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData&lt;/h4&gt;
&lt;h5&gt;파일 읽어오기&lt;/h5&gt;
&lt;h6&gt;readFileSync()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 36 20 32 20 35&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;작동 시스템 구별&lt;/h5&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;문자열 형식으로 변환&lt;/h5&gt;
&lt;h6&gt;toString()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData); // 6 2 5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;배열 생성&lt;/h5&gt;
&lt;h6&gt;split()&lt;/h6&gt;
&lt;p&gt;first&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;);

console.log(inputData); // [ &amp;#39;6&amp;#39;, &amp;#39;2`, &amp;#39;5&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;를 활용하여 매개변수에 공백을 의미하는 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h5&gt;문자열 배열에서 실수 배열로 변환&lt;/h5&gt;
&lt;h6&gt;map()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;)
  .map((value) =&amp;gt; +value);

console.log(inputData); // [ 6, 2, 5 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드의 callback 함수를 활용하여 &lt;code&gt;string&lt;/code&gt; 형식이었던 배열의 각 값을 &lt;code&gt;number&lt;/code&gt; 형식으로 바꿉니다.&lt;/p&gt;
&lt;h5&gt;배열 구조 분해&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [a, b, c] = inputData;
console.log(a, b, c); // 6 2 5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 통해 &lt;code&gt;inputData&lt;/code&gt;를 각각 세 숫자를 의미하는 &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;, &lt;code&gt;c&lt;/code&gt;에 할당합니다.&lt;/p&gt;
&lt;h4&gt;threeDice()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function threeDice(first, second, third) {
  function twoSameDice(first, second, third) {
    if (first === second &amp;amp;&amp;amp; first !== third) {
      return first;
    } else if (first === third &amp;amp;&amp;amp; first !== second) {
      return first;
    } else if (second === third &amp;amp;&amp;amp; second !== first) {
      return second;
    }
  }

  function theBiggestDice(first, second, third) {
    if (
      (first &amp;gt; second &amp;amp;&amp;amp; second &amp;gt; third) ||
      (first &amp;gt; third &amp;amp;&amp;amp; third &amp;gt; second)
    ) {
      return first;
    } else if (
      (second &amp;gt; first &amp;amp;&amp;amp; first &amp;gt; third) ||
      (second &amp;gt; third &amp;amp;&amp;amp; third &amp;gt; first)
    ) {
      return second;
    } else if (
      (third &amp;gt; first &amp;amp;&amp;amp; first &amp;gt; second) ||
      (third &amp;gt; second &amp;amp;&amp;amp; second &amp;gt; first)
    ) {
      return third;
    }
  }

  if (first === second &amp;amp;&amp;amp; first === third &amp;amp;&amp;amp; second === third) {
    return 10000 + first * 1000;
  } else if (first === second || first === third || second === third) {
    return 1000 + twoSameDice(first, second, third) * 100;
  } else if (first !== second &amp;amp;&amp;amp; first !== third &amp;amp;&amp;amp; second !== third) {
    return theBiggestDice(first, second, third) * 100;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;ol&gt;
&lt;li&gt;같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.&lt;/li&gt;
&lt;li&gt;같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.&lt;/li&gt;
&lt;li&gt;모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;세 주사위를 의미하는 매개변수 &lt;code&gt;first&lt;/code&gt;, &lt;code&gt;second&lt;/code&gt;, &lt;code&gt;third&lt;/code&gt;를 요구하는 &lt;code&gt;threeDice()&lt;/code&gt; 함수를 만듭니다.&lt;/p&gt;
&lt;p&gt;그리고 매개변수 &lt;code&gt;first&lt;/code&gt;, &lt;code&gt;second&lt;/code&gt;, &lt;code&gt;third&lt;/code&gt;를 요구하며 같은 눈이 2개만 나오는 경우를 위해 두 눈만 같은 주사위일때 그 눈의 값을 얻는 함수와, 모두 다른 눈이 나오는 경우일 때 제일 큰 눈의 주사위 값을 얻는 함수를 만듭니다.&lt;/p&gt;
&lt;h5&gt;두 눈만 같은 주사위 값 구하기&lt;/h5&gt;
&lt;h6&gt;twoSameDice()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function twoSameDice(first, second, third) {
  if (first === second &amp;amp;&amp;amp; first !== third) {
    return first;
  } else if (first === third &amp;amp;&amp;amp; first !== second) {
    return first;
  } else if (second === third &amp;amp;&amp;amp; second !== first) {
    return second;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;두 눈만 같은 주사위 값을 얻어야하므로 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/if...else&quot;&gt;if...else&lt;/a&gt;문과 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/return&quot;&gt;return&lt;/a&gt; 명령문을 활용하여&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;1번 다이스와 2번 다이스와 같은 수이면서, 1번 다이스는 3번 다이스와 다른 수이면 &lt;strong&gt;1번 다이스 반환&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;같은 다이스이기 떄문에 1번과 2번, 둘 중에 뭘 반환하든 상관이 없다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1번 다이스와 3번 다이스와 같은 수이면서, 1번 다이스는 2번 다이스와 다른 수이면 &lt;strong&gt;1번 다이스 반환&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2번 다이스와 3번 다이스와 같은 수이면서, 2번 다이스는 1번 다이스와 다른 수이면 &lt;strong&gt;2번 다이스 반환&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;위 세 가지 조건을 가지는 함수를 만듭니다.&lt;/p&gt;
&lt;h5&gt;제일 큰 수의 주사위 값 구하기&lt;/h5&gt;
&lt;h6&gt;theBiggestDice()&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function theBiggestDice(first, second, third) {
  if ((first &amp;gt; second &amp;amp;&amp;amp; second &amp;gt; third) || (first &amp;gt; third &amp;amp;&amp;amp; third &amp;gt; second)) {
    return first;
  } else if (
    (second &amp;gt; first &amp;amp;&amp;amp; first &amp;gt; third) ||
    (second &amp;gt; third &amp;amp;&amp;amp; third &amp;gt; first)
  ) {
    return second;
  } else if (
    (third &amp;gt; first &amp;amp;&amp;amp; first &amp;gt; second) ||
    (third &amp;gt; second &amp;amp;&amp;amp; second &amp;gt; first)
  ) {
    return third;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;제일 큰 수의 주사위 값을 얻어야 하므로 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/if...else&quot;&gt;if...else&lt;/a&gt;문과 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/return&quot;&gt;return&lt;/a&gt; 명령문을 활용하여&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;1번 다이스의 수 &amp;gt; 2번 다이스 수 &amp;gt; 3번 다이스 수&lt;/em&gt; 혹은 &lt;em&gt;1번 다이스의 수 &amp;gt; 3번 다이스 수 &amp;gt; 2번 다이스 수&lt;/em&gt;의 경우 1번 다이스 수 반환&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;2번 다이스의 수 &amp;gt; 1번 다이스 수 &amp;gt; 3번 다이스 수&lt;/em&gt; 혹은 &lt;em&gt;2번 다이스의 수 &amp;gt; 3번 다이스 수 &amp;gt; 1번 다이스 수&lt;/em&gt;의 경우 2번 다이스 수 반환&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;3번 다이스의 수 &amp;gt; 2번 다이스 수 &amp;gt; 1번 다이스 수&lt;/em&gt; 혹은 &lt;em&gt;3번 다이스의 수 &amp;gt; 1번 다이스 수 &amp;gt; 2번 다이스 수&lt;/em&gt;의 경우 3번 다이스 수 반환&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;위 세 가지 조건을 가지는 함수를 만듭니다.&lt;/p&gt;
&lt;h5&gt;상금 계산&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;if (first === second &amp;amp;&amp;amp; first === third &amp;amp;&amp;amp; second === third) {
  return 10000 + first * 1000;
} else if (first === second || first === third || second === third) {
  return 1000 + twoSameDice(first, second, third) * 100;
} else if (first !== second &amp;amp;&amp;amp; first !== third &amp;amp;&amp;amp; second !== third) {
  return theBiggestDice(first, second, third) * 100;
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;ol&gt;
&lt;li&gt;같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.&lt;/li&gt;
&lt;li&gt;같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.&lt;/li&gt;
&lt;li&gt;모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h6&gt;세 주사위 수가 모두 같은 경우&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;if (first === second &amp;amp;&amp;amp; first === third &amp;amp;&amp;amp; second === third) {
  return 10000 + first * 1000;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;주사위 수들이 모두 같은 경우 &lt;code&gt;10000 + first * 1000&lt;/code&gt; 을 반환합니다.&lt;/p&gt;
&lt;h6&gt;두 수의 주사위 수만 같은 경우&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;else if (first === second || first === third || second === third) {
  return 1000 + twoSameDice(first, second, third) * 100;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;두 수의 주사위만 같은 경우 &lt;code&gt;1000 + twoSameDice(first, second, third) * 100&lt;/code&gt;를 반환합니다.&lt;/p&gt;
&lt;h6&gt;모든 주사위 수가 다른 경우&lt;/h6&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;else if (first !== second &amp;amp;&amp;amp; first !== third &amp;amp;&amp;amp; second !== third) {
  return theBiggestDice(first, second, third) * 100;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;모든 주사위 수가 다른 경우 &lt;code&gt;theBiggestDice(first, second, third) * 100&lt;/code&gt;를 반환합니다.&lt;/p&gt;
&lt;h4&gt;결과 출력&lt;/h4&gt;
&lt;h5&gt;console.log()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(threeDice(a, b, c)); // 600&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;console.log()&lt;/a&gt; 메서드를 통해 &lt;code&gt;threeDice(a, b, c)&lt;/code&gt;를 출력하면 &lt;code&gt;3 3 6&lt;/code&gt;일 경우 &lt;code&gt;1300&lt;/code&gt;이 출력되고, &lt;code&gt;2 2 2&lt;/code&gt;인 경우 &lt;code&gt;12000&lt;/code&gt;이 출력되고 &lt;code&gt;6 2 5&lt;/code&gt;인 경우 &lt;code&gt;600&lt;/code&gt;이 출력되는 것을 알 수 있습니다.&lt;/p&gt;</description>
      <category>Nodejs</category>
      <category>Algorithm</category>
      <category>BaekJoon</category>
      <category>nodejs</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/82</guid>
      <comments>https://sukvvon.tistory.com/82#entry82comment</comments>
      <pubDate>Thu, 7 Jul 2022 20:27:20 +0900</pubDate>
    </item>
    <item>
      <title>[Nodejs][백준] 단계별로 풀어보기 - 1. 입출력과 사칙연산</title>
      <link>https://sukvvon.tistory.com/81</link>
      <description>&lt;h2&gt;1. Hello World&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2557&quot;&gt;https://www.acmicpc.net/problem/2557&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;code&gt;Hello World

문제
Hello World!를 출력하시오.

입력
없음

출력
Hello World!를 출력하시오.

예제 입력 1

예제 출력 1
Hello World!&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(&amp;quot;Hello World!&amp;quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;웹 콘솔에 메세지를 출력하는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;console.log()&lt;/a&gt;을 활용하여 풀 수 있습니다.&lt;/p&gt;
&lt;h2&gt;2. We love Kriii&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10718&quot;&gt;https://www.acmicpc.net/problem/10718&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;code&gt;We love kriii

문제
ACM-ICPC 인터넷 예선, Regional, 그리고 World Finals까지 이미 2회씩 진출해버린 kriii는 미련을 버리지 못하고 왠지 모르게 올해에도 파주 World Finals 준비 캠프에 참여했다.

대회를 뜰 줄 모르는 지박령 kriii를 위해서 격려의 문구를 출력해주자.

입력
본 문제는 입력이 없다.

출력
두 줄에 걸쳐 &amp;quot;강한친구 대한육군&amp;quot;을 한 줄에 한 번씩 출력한다.

예제 입력 1

예제 출력 1
강한친구 대한육군
강한친구 대한육군&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;lt;= 1; i++) {
  console.log(&amp;quot;강한친구 대한육군&amp;quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/console/log&quot;&gt;console.log()&lt;/a&gt;의 개념을 알면 풀 수 있는 문제입니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;console.log(&amp;quot;강한친구 대한육군&amp;quot;)&lt;/code&gt;을 두 번 출력하여 문제를 해결할 수 있지만 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/for&quot;&gt;for문&lt;/a&gt;을 활용하여 해결해보았습니다.&lt;/p&gt;
&lt;h2&gt;3. 고양이&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10171&quot;&gt;https://www.acmicpc.net/problem/10171&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;code&gt;고양이

문제
아래 예제와 같이 고양이를 출력하시오.

입력
없음.

출력
고양이를 출력한다.

예제 입력 1

예제 출력 1
\    /\
 )  ( &amp;#39;)
(  /  )
 \(__)|&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(`\\    /\\
 )  ( &amp;#39;)
(  /  )
 \\(__)|`);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals&quot;&gt;Template literals&lt;/a&gt; 즉 백틱키를 활용하여 출력을 해주는데 특정 문자를 나타내야하므로 &lt;a href=&quot;https://docs.microsoft.com/ko-kr/cpp/c-language/escape-sequences?view=msvc-170&quot;&gt;이스케이프 시퀀스&lt;/a&gt;를 활용하여 코드를 작성합니다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;종류&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;\n&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;return&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;\&amp;#39;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;&amp;#39;&lt;/code&gt; 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;\&amp;quot;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;&amp;quot;&lt;/code&gt; 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;\\&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;\&lt;/code&gt; 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;4. 개&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10172&quot;&gt;https://www.acmicpc.net/problem/10172&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;code&gt;개

문제
아래 예제와 같이 개를 출력하시오.

입력
없음.

출력
개를 출력한다.

예제 입력 1

예제 출력 1
|\_/|
|q p|   /}
( 0 )&amp;quot;&amp;quot;&amp;quot;\
|&amp;quot;^&amp;quot;`    |
||_/=\\__|&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(`|\\_/|
|q p|   /}
( 0 )\&amp;quot;\&amp;quot;\&amp;quot;\\
|\&amp;quot;^&amp;quot;\`    |
||_/=\\\\__|`);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals&quot;&gt;Template literals&lt;/a&gt; 즉 백틱키를 활용하여 출력을 해주는데 특정 문자를 나타내야하므로 &lt;a href=&quot;https://docs.microsoft.com/ko-kr/cpp/c-language/escape-sequences?view=msvc-170&quot;&gt;이스케이프 시퀀스&lt;/a&gt;를 활용하여 코드를 작성합니다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;종류&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;\n&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;return&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;\&amp;#39;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;&amp;#39;&lt;/code&gt; 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;\&amp;quot;&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;&amp;quot;&lt;/code&gt; 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;\\&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;code&gt;\&lt;/code&gt; 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;5. A+B&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1000&quot;&gt;https://www.acmicpc.net/problem/1000&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;A+B

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 A와 B가 주어진다. (0 &amp;lt; A, B &amp;lt; 10)

출력
첫째 줄에 A+B를 출력한다.

예제 입력 1
1 2

예제 출력 1
3&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;)
  .map((value) =&amp;gt; +value);

const [a, b] = inputData;

console.log(a + b);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;readFileSync()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 31 20 32&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;process.platform&lt;/h5&gt;
&lt;p&gt;백준의 파일 경로는 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h4&gt;toString()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData); // 1 2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h4&gt;split()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;);

console.log(inputData); // [ &amp;#39;1&amp;#39;, &amp;#39;2&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;를 활용하여 매개변수에 공백을 의미하는 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h4&gt;map()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;)
  .map((value) =&amp;gt; +value);

console.log(inputData); // [ 1, 2 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드의 callback 함수를 활용하여 &lt;code&gt;string&lt;/code&gt; 형식이었던 배열의 각 값을 &lt;code&gt;number&lt;/code&gt; 형식으로 바꿉니다.&lt;/p&gt;
&lt;h4&gt;배열 구조 분해&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [a, b] = inputData;
console.log(a); // 1
console.log(b); // 2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 통해 배열 속의 &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;에 값을 할당합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(a + b); //3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그 후 &lt;code&gt;a&lt;/code&gt;와 &lt;code&gt;b&lt;/code&gt;의 값을 더하여 최종적으로 출력값이 요구하는대로 나오는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;6. A-B&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1001&quot;&gt;https://www.acmicpc.net/problem/1001&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;A-B

문제
두 정수 A와 B를 입력받은 다음, A-B를 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 A와 B가 주어진다. (0 &amp;lt; A, B &amp;lt; 10)

출력
첫째 줄에 A-B를 출력한다.

예제 입력 1
3 2

예제 출력 1
1&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;)
  .map((value) =&amp;gt; +value);

const [a, b] = inputData;

console.log(a - b);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;readFileSync()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 33 20 32&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;process.platform&lt;/h5&gt;
&lt;p&gt;백준의 파일 경로는 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h4&gt;toString()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData); // 3 2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h4&gt;split()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;);

console.log(inputData); // [ &amp;#39;3&amp;#39;, &amp;#39;2&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;를 활용하여 매개변수에 공백을 의미하는 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h4&gt;map()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;)
  .map((value) =&amp;gt; +value);

console.log(inputData); // [ 3, 2 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드의 callback 함수를 활용하여 &lt;code&gt;string&lt;/code&gt; 형식이었던 배열의 각 값을 &lt;code&gt;number&lt;/code&gt; 형식으로 바꿉니다.&lt;/p&gt;
&lt;h4&gt;배열 구조 분해&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [a, b] = inputData;
console.log(a); // 3
console.log(b); // 2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 통해 배열 속의 &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;에 값을 할당합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(a - b); // 1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그 후 &lt;code&gt;a&lt;/code&gt;와 &lt;code&gt;b&lt;/code&gt;의 값을 빼 최종적으로 출력값이 요구하는대로 나오는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;7. AxB&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10998&quot;&gt;https://www.acmicpc.net/problem/10998&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;AxB

문제
두 정수 A와 B를 입력받은 다음, A×B를 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 A와 B가 주어진다. (0 &amp;lt; A, B &amp;lt; 10)

출력
첫째 줄에 A×B를 출력한다.

예제 입력 1
1 2

예제 출력 1
2

예제 입력 2
3 4

예제 출력 2
12&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;)
  .map((value) =&amp;gt; +value);

const [a, b] = inputData;

console.log(a * b);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;readFileSync()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 33 20 34&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;process.platform&lt;/h5&gt;
&lt;p&gt;백준의 파일 경로는 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h4&gt;toString()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData); // 3 4&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h4&gt;split()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;);

console.log(inputData); // [ &amp;#39;3&amp;#39;, &amp;#39;4&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;를 활용하여 매개변수에 공백을 의미하는 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h4&gt;map()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;)
  .map((value) =&amp;gt; +value);

console.log(inputData); // [ 3, 4 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드의 callback 함수를 활용하여 &lt;code&gt;string&lt;/code&gt; 형식이었던 배열의 각 값을 &lt;code&gt;number&lt;/code&gt; 형식으로 바꿉니다.&lt;/p&gt;
&lt;h4&gt;배열 구조 분해&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [a, b] = inputData;
console.log(a); // 3
console.log(b); // 4&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 통해 배열 속의 &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;에 값을 할당합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(a * b); // 12&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그 후 &lt;code&gt;a&lt;/code&gt;와 &lt;code&gt;b&lt;/code&gt;의 값을 곱해 최종적으로 출력값이 요구하는대로 나오는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;8. A/B&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1008&quot;&gt;https://www.acmicpc.net/problem/1008&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;A/B

문제
두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 A와 B가 주어진다. (0 &amp;lt; A, B &amp;lt; 10)

출력
첫째 줄에 A/B를 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-9 이하이면 정답이다.

예제 입력 1
1 3

예제 출력 1
0.33333333333333333333333333333333

10-9 이하의 오차를 허용한다는 말은 꼭 소수 9번째 자리까지만 출력하라는 뜻이 아니다.

예제 입력 2
4 5

예제 출력 2
0.8&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;)
  .map((value) =&amp;gt; +value);

const [a, b] = inputData;

console.log(a / b);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;readFileSync()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 31 20 33&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;process.platform&lt;/h5&gt;
&lt;p&gt;백준의 파일 경로는 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h4&gt;toString()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData); // 1 3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h4&gt;split()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;);

console.log(inputData); // [ &amp;#39;1&amp;#39;, &amp;#39;3&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;를 활용하여 매개변수에 공백을 의미하는 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h4&gt;map()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;)
  .map((value) =&amp;gt; +value);

console.log(inputData); // [ 1, 3 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드의 callback 함수를 활용하여 &lt;code&gt;string&lt;/code&gt; 형식이었던 배열의 각 값을 &lt;code&gt;number&lt;/code&gt; 형식으로 바꿉니다.&lt;/p&gt;
&lt;h4&gt;배열 구조 분해&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [a, b] = inputData;
console.log(a); // 1
console.log(b); // 3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 통해 배열 속의 &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;에 값을 할당합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(a / b); // 0.3333333333333333&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그 후 &lt;code&gt;a&lt;/code&gt;와 &lt;code&gt;b&lt;/code&gt;의 값을 나누어 최종적으로 출력값이 요구하는대로 나오는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;9. 사칙연산&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10869&quot;&gt;https://www.acmicpc.net/problem/10869&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;사칙연산

문제
두 자연수 A와 B가 주어진다. 이때, A+B, A-B, A*B, A/B(몫), A%B(나머지)를 출력하는 프로그램을 작성하시오.

입력
두 자연수 A와 B가 주어진다. (1 ≤ A, B ≤ 10,000)

출력
첫째 줄에 A+B, 둘째 줄에 A-B, 셋째 줄에 A*B, 넷째 줄에 A/B, 다섯째 줄에 A%B를 출력한다.

예제 입력 1
7 3

예제 출력 1
10
4
21
2
1&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);
const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;)
  .map((value) =&amp;gt; +value);

const [a, b] = inputData;

console.log(`${a + b}
${a - b}
${a * b}
${parseInt(a / b)}
${a % b}`);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;readFileSync()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 37 20 33&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;process.platform&lt;/h5&gt;
&lt;p&gt;백준의 파일 경로는 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h4&gt;toString()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData); // 7 3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h4&gt;split()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;);

console.log(inputData); // [ &amp;#39;7&amp;#39;, &amp;#39;3&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;를 활용하여 매개변수에 공백을 의미하는 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h4&gt;map()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;)
  .map((value) =&amp;gt; +value);

console.log(inputData); // [ 7, 3 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드의 callback 함수를 활용하여 &lt;code&gt;string&lt;/code&gt; 형식이었던 배열의 각 값을 &lt;code&gt;number&lt;/code&gt; 형식으로 바꿉니다.&lt;/p&gt;
&lt;h4&gt;배열 구조 분해&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [a, b] = inputData;
console.log(a); // 7
console.log(b); // 3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 통해 배열 속의 &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;에 값을 할당합니다.&lt;/p&gt;
&lt;h4&gt;Template literals&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(`${a + b}
${a - b}
${a * b}
${parseInt(a / b)}
${a % b}`);
// 10
// 4
// 21
// 2
// 1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals&quot;&gt;Template literals&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals#multi-line_strings&quot;&gt;Multi-line strings&lt;/a&gt;와 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals#expression_interpolation%ED%91%9C%ED%98%84%EC%8B%9D_%EC%82%BD%EC%9E%85%EB%B2%95&quot;&gt;Expression interpolation(표현식 삽입법)&lt;/a&gt;으로 문제에서 요구한 사칙연산을 간편하게 표현합니다.&lt;/p&gt;
&lt;h5&gt;parseInt()&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;a/b&lt;/code&gt;에는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/parseInt&quot;&gt;&lt;code&gt;parseInt()&lt;/code&gt;&lt;/a&gt; 함수를 사용하여 &lt;u&gt;실수인 값을 정수로 반환&lt;/u&gt;합니다.&lt;/p&gt;
&lt;p&gt;최종적으로 출력값이 요구하는대로 나오는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;10. ??!&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10926&quot;&gt;https://www.acmicpc.net/problem/10926&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;??!

문제
준하는 사이트에 회원가입을 하다가 joonas라는 아이디가 이미 존재하는 것을 보고 놀랐다. 준하는 놀람을 ??!로 표현한다. 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어졌을 때, 놀람을 표현하는 프로그램을 작성하시오.

입력
첫째 줄에 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어진다. 아이디는 알파벳 소문자로만 이루어져 있으며, 길이는 50자를 넘지 않는다.

출력
첫째 줄에 준하의 놀람을 출력한다. 놀람은 아이디 뒤에 ??!를 붙여서 나타낸다.

예제 입력 1
joonas

예제 출력 1
joonas??!

예제 입력 2
baekjoon

예제 출력 2
baekjoon??!&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .trim();

console.log(`${inputData}??!`);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;readFileSync()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 62 61 65 6b 6a 6f 6f 6e&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;process.platform&lt;/h5&gt;
&lt;p&gt;백준의 파일 경로는 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h4&gt;toString()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData); // baekjoon&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h4&gt;trim()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .trim();

console.log(inputData); // baekjoon&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/Trim&quot;&gt;&lt;code&gt;trim()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 공백 존재 유무를 고려하여 &lt;u&gt;문자열 양 끝 공백을 제거&lt;/u&gt;하도록 합니다.&lt;/p&gt;
&lt;h3&gt;Template literals&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(`${inputData}??!`); // baekjoon??!&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그 후 &lt;a href=&quot;https://tickets.interpark.com/goods/22007901&quot;&gt;Template literals&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals#expression_interpolation%ED%91%9C%ED%98%84%EC%8B%9D_%EC%82%BD%EC%9E%85%EB%B2%95&quot;&gt;Expression interpolation(표현식 삽입법)&lt;/a&gt;으로 &lt;code&gt;inputData&lt;/code&gt;값에 &lt;code&gt;??!&lt;/code&gt;를 이어 적어 출력합니다.&lt;/p&gt;
&lt;h2&gt;11. 1998년생인 내가 태국에서는 2541년생?!&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/18108&quot;&gt;https://www.acmicpc.net/problem/18108&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;1998년생인 내가 태국에서는 2541년생?!

문제
ICPC Bangkok Regional에 참가하기 위해 수완나품 국제공항에 막 도착한 팀 레드시프트 일행은 눈을 믿을 수 없었다. 공항의 대형 스크린에 올해가 2562년이라고 적혀 있던 것이었다.

불교 국가인 태국은 불멸기원(佛滅紀元), 즉 석가모니가 열반한 해를 기준으로 연도를 세는 불기를 사용한다. 반면, 우리나라는 서기 연도를 사용하고 있다. 불기 연도가 주어질 때 이를 서기 연도로 바꿔 주는 프로그램을 작성하시오.

입력
서기 연도를 알아보고 싶은 불기 연도 y가 주어진다. (1000 ≤ y ≤ 3000)

출력
불기 연도를 서기 연도로 변환한 결과를 출력한다.

예제 입력 1
2541

예제 출력 1
1998&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = +fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData - 543);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;readFileSync()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 32 35 34 31&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;process.platform&lt;/h5&gt;
&lt;p&gt;백준의 파일 경로는 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h4&gt;+&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = +fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // 2541&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;code&gt;inputData&lt;/code&gt;로 정의하려는 식 앞에 &lt;code&gt;+&lt;/code&gt;를 붙여 &lt;u&gt;실수 형식으로 변환&lt;/u&gt;하여 불멸기원을 구합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(inputData - 543); // 1998&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그리고 &lt;code&gt;543&lt;/code&gt;을 뺄셈해 서기 연도를 출력합니다.&lt;/p&gt;
&lt;h2&gt;12. 나머지&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10430&quot;&gt;https://www.acmicpc.net/problem/10430&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;나머지

문제
(A+B)%C는 ((A%C) + (B%C))%C 와 같을까?

(A×B)%C는 ((A%C) × (B%C))%C 와 같을까?

세 수 A, B, C가 주어졌을 때, 위의 네 가지 값을 구하는 프로그램을 작성하시오.

입력
첫째 줄에 A, B, C가 순서대로 주어진다. (2 ≤ A, B, C ≤ 10000)

출력
첫째 줄에 (A+B)%C, 둘째 줄에 ((A%C) + (B%C))%C, 셋째 줄에 (A×B)%C, 넷째 줄에 ((A%C) × (B%C))%C를 출력한다.

예제 입력 1
5 8 4

예제 출력 1
1
1
0
0&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;)
  .map((value) =&amp;gt; +value);

const [A, B, C] = inputData;

console.log(`${(A + B) % C}
${((A % C) + (B % C)) % C}
${(A * B) % C}
${((A % C) * (B % C)) % C}`);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;readFileSync()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 35 20 38 20 34&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h5&gt;process.platform&lt;/h5&gt;
&lt;p&gt;백준의 파일 경로는 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h4&gt;toString()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData); // 5 8 4&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h4&gt;split()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;);

console.log(inputData); // [ &amp;#39;5&amp;#39;, &amp;#39;8&amp;#39;, &amp;#39;4&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;를 활용하여 매개변수에 공백을 의미하는 &lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h4&gt;map()&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot; &amp;quot;)
  .map((value) =&amp;gt; +value);

console.log(inputData); // [ 5, 8, 4 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드의 callback 함수를 활용하여 &lt;code&gt;string&lt;/code&gt; 형식이었던 배열의 각 값을 &lt;code&gt;number&lt;/code&gt; 형식으로 바꿉니다.&lt;/p&gt;
&lt;h4&gt;배열 구조 분해&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [A, B, C] = inputData;
console.log(A); // 5
console.log(B); // 8
console.log(C); // 4&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 통해 배열 속의 &lt;code&gt;A&lt;/code&gt;, &lt;code&gt;B&lt;/code&gt;, &lt;code&gt;C&lt;/code&gt;에 값을 할당합니다.&lt;/p&gt;
&lt;h4&gt;Template literals&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(`${(A + B) % C}
${((A % C) + (B % C)) % C}
${(A * B) % C}
${((A % C) * (B % C)) % C}`);
// 1
// 1
// 0
// 0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals&quot;&gt;Template literals&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals#multi-line_strings&quot;&gt;Multi-line strings&lt;/a&gt;와 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals#expression_interpolation%ED%91%9C%ED%98%84%EC%8B%9D_%EC%82%BD%EC%9E%85%EB%B2%95&quot;&gt;Expression interpolation(표현식 삽입법)&lt;/a&gt;을 활용합니다.&lt;/p&gt;
&lt;p&gt;최종적으로 출력값이 요구하는대로 나오는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;13. 곱셈&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2588&quot;&gt;https://www.acmicpc.net/problem/2588&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;문제&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://onlinejudgeimages.s3-ap-northeast-1.amazonaws.com/upload/images/f5NhGHVLM4Ix74DtJrwfC97KepPl27s%20(1).png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;곱셈

문제
(세 자리 수) × (세 자리 수)는 다음과 같은 과정을 통하여 이루어진다.

(1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6)위치에 들어갈 값을 구하는 프로그램을 작성하시오.

입력
첫째 줄에 (1)의 위치에 들어갈 세 자리 자연수가, 둘째 줄에 (2)의 위치에 들어갈 세자리 자연수가 주어진다.

출력
첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.

예제 입력 1
472
385

예제 출력 1
2360
3776
1416
181720&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;해답&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;)
  .map((value) =&amp;gt; +value);

const [a, b] = inputData;

const [hundredsB, tensB, unitsB] = String(b)
  .split(&amp;quot;&amp;quot;)
  .map((value) =&amp;gt; +value);

console.log(`${a * unitsB}
${a * tensB}
${a * hundredsB}
${a * b}`);&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;풀이&lt;/h3&gt;
&lt;h4&gt;inputData&lt;/h4&gt;
&lt;h5&gt;readFileSync()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const fs = require(&amp;quot;fs&amp;quot;);

const inputData = fs.readFileSync(
  process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
);

console.log(inputData); // &amp;lt;Buffer 34 37 32 0a 33 38 35&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.acmicpc.net/language/info&quot;&gt;백준&lt;/a&gt;에서 추천하는 방식은 &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;node.js&lt;/a&gt;에서 fs 모듈의 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/fs.html#fsreadfilesyncpath-options&quot;&gt;&lt;code&gt;readFileSync()&lt;/code&gt;&lt;/a&gt;를 이용하는 것입니다.&lt;/p&gt;
&lt;h6&gt;process.platform&lt;/h6&gt;
&lt;p&gt;백준의 파일 경로는 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/process.html#processplatform&quot;&gt;&lt;code&gt;process.platform&lt;/code&gt;&lt;/a&gt;이 &lt;code&gt;&amp;quot;linux&amp;quot;&lt;/code&gt;인 경우 경로를 &lt;code&gt;&amp;quot;/dev/stdin&amp;quot;&lt;/code&gt;으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.&lt;/p&gt;
&lt;h5&gt;toString()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString();

console.log(inputData);
// 472
// 385&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Buffer 형식으로 출력된 값을 &lt;a href=&quot;https://nodejs.org/docs/latest-v16.x/api/buffer.html#buftostringencoding-start-end&quot;&gt;&lt;code&gt;toString()&lt;/code&gt;&lt;/a&gt;을 통해 기본값인 &lt;code&gt;&amp;quot;utf8&amp;quot;&lt;/code&gt; 형식으로 출력합니다.&lt;/p&gt;
&lt;h5&gt;split()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;);

console.log(inputData); // [ &amp;#39;472&amp;#39;, &amp;#39;385&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt;를 활용하여 매개변수에 &lt;u&gt;줄바꿈을 의미&lt;/u&gt;하는 &lt;code&gt;&amp;quot;\n&amp;quot;&lt;/code&gt;를 넣어 배열을 만듭니다.&lt;/p&gt;
&lt;h5&gt;map()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const inputData = fs
  .readFileSync(
    process.platform === &amp;quot;linux&amp;quot; ? &amp;quot;/dev/stdin&amp;quot; : &amp;quot;../../../../index.txt&amp;quot;
  )
  .toString()
  .split(&amp;quot;\n&amp;quot;)
  .map((value) =&amp;gt; +value);

console.log(inputData); // [ 472, 385 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드의 callback 함수를 활용하여 &lt;code&gt;string&lt;/code&gt; 형식이었던 배열의 각 값을 &lt;code&gt;number&lt;/code&gt; 형식으로 바꿉니다.&lt;/p&gt;
&lt;h5&gt;배열 구조 분해&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [a, b] = inputData;
console.log(a); // 472
console.log(b); // 385&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 통해 배열 속의 &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;에 값을 할당합니다.&lt;/p&gt;
&lt;h4&gt;hundredsB, tensB, unitsB&lt;/h4&gt;
&lt;p&gt;(3), (4), (5)의 값을 구하기 위해서는 &lt;code&gt;b&lt;/code&gt;값의 백의 자리 수, 십의 자리 수, 일의 자리 수를 구하여 &lt;code&gt;a&lt;/code&gt;값에 각각 곱해줘야 합니다.&lt;/p&gt;
&lt;h5&gt;String()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const B = String(b);
console.log(B); // 385&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;number&lt;/code&gt; 형식인 &lt;code&gt;b&lt;/code&gt; 값을 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String&quot;&gt;&lt;code&gt;String()&lt;/code&gt;&lt;/a&gt;을 통해 &lt;u&gt;문자열로 변환&lt;/u&gt;해줍니다.&lt;/p&gt;
&lt;h5&gt;split()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const B = String(b).split(&amp;quot;&amp;quot;);
console.log(B); // [ &amp;#39;3&amp;#39;, &amp;#39;8&amp;#39;, &amp;#39;5&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그 후 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split&quot;&gt;&lt;code&gt;split()&lt;/code&gt;&lt;/a&gt; 메서드를 통해 매개변수 &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;를 통하여 &lt;u&gt;각 자리 수를 나라태는 배열(백의 자리, 십의 자리, 일의 자리)&lt;/u&gt;를 생성합니다.&lt;/p&gt;
&lt;h5&gt;map()&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const B = String(b)
  .split(&amp;quot;&amp;quot;)
  .map((value) =&amp;gt; +value);
console.log(B); // [ 3, 8, 5 ]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot;&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/a&gt; 메서드의 callback 함수를 활용하여 &lt;code&gt;string&lt;/code&gt; 형식이었던 배열의 각 값을 &lt;code&gt;number&lt;/code&gt; 형식으로 바꿔 &lt;u&gt;연산이 가능하도록 합니다.&lt;/u&gt;&lt;/p&gt;
&lt;h5&gt;배열 구조 분해&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const [hundredsOfB, tensOfB, unitsOfB] = String(b)
  .split(&amp;quot;&amp;quot;)
  .map((value) =&amp;gt; +value);
console.log(hundredsOfB); // 3
console.log(tensOfB); // 8
console.log(unitsOfB); // 5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment&quot;&gt;구조 분해 할당&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#%EB%B0%B0%EC%97%B4_%EA%B5%AC%EC%A1%B0_%EB%B6%84%ED%95%B4&quot;&gt;배열 구조 분해&lt;/a&gt;을 통해 &lt;code&gt;b&lt;/code&gt;로부터 각 자리 수를 의미하는 숫자를 배열 속의 &lt;code&gt;hundredsB&lt;/code&gt;, &lt;code&gt;tensB&lt;/code&gt;, &lt;code&gt;unitsB&lt;/code&gt;에 값을 할당합니다.&lt;/p&gt;
&lt;h4&gt;Template literals&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(`${a * unitsOfB}
${a * tensOfB}
${a * hundredsOfB}
${a * b}`);
// 2360
// 3776
// 1416
// 181720&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals&quot;&gt;Template literals&lt;/a&gt;의 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals#multi-line_strings&quot;&gt;Multi-line strings&lt;/a&gt;와 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals#expression_interpolation%ED%91%9C%ED%98%84%EC%8B%9D_%EC%82%BD%EC%9E%85%EB%B2%95&quot;&gt;Expression interpolation(표현식 삽입법)&lt;/a&gt;으로 문제에서 요구한 사칙연산을 간편하게 표현합니다.&lt;/p&gt;
&lt;p&gt;문제에서 요구하는 값이 정상적으로 출력되는 것을 볼 수 있습니다.&lt;/p&gt;</description>
      <category>Nodejs</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/81</guid>
      <comments>https://sukvvon.tistory.com/81#entry81comment</comments>
      <pubDate>Sun, 3 Jul 2022 09:21:21 +0900</pubDate>
    </item>
    <item>
      <title>Tistory(#1) 스크롤시 상단바 숨기고 보이게 하기</title>
      <link>https://sukvvon.tistory.com/80</link>
      <description>&lt;blockquote&gt;
&lt;p&gt;이 포스팅은 tistory 스킨 #1을 기준으로 작성된 것입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;계기&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/157605399-31523d44-566d-4af5-97c3-4b9b7185423e.gif&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;현재 Tistory에서 제공하는 #1 스킨을 사용중입니다.&lt;/p&gt;
&lt;p&gt;평소 모니터를 3대를 사용중인데 이 스킨을 사용하면서 피벗 모니터에서 블로그 글을 보았을 때는 세로가 길어 가독성이 괜찮아 보였다가 반대로 피벗이 아닌 평범한 16:9 비율의 환경에서 글을 보았을 때 글의 내용이 상단바에 가려져 가독성이 좋지 않아 글을 읽기가 불편한 것 같다라는 생각을 하게 되었습니다.&lt;/p&gt;
&lt;p&gt;&amp;#39;글을 읽을 경우 상단바를 없애면 읽기 편하지 않을까?&amp;#39; 라는 호기심에 이 기능을 만들어보게 되었습니다. :)&lt;/p&gt;
&lt;p&gt;github 저장소는 아래에 있습니다! :)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/sukvvon/tistory-top-bar-visible&quot;&gt;sukvvon/tistory-top-bar-visible&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;css&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;.hidden {
  animation: hide 0.1s linear forwards;
}

@keyframes hide {
  from {
    opacity: 1;
  }
  to {
    opacity: 0;
    visibility: hidden;
  }
}

.shown {
  animation: show 0.1s linear forwards;
}

@keyframes show {
  from {
    visibility: hidden;
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;.hidden, .shown&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;.hidden {
  animation: hide 0.1s linear forwards;
}

.shown {
  animation: show 0.1s linear forwards;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;숨김과 보임을 의미하는 &lt;code&gt;hidden&lt;/code&gt;과 &lt;code&gt;shown&lt;/code&gt; 으로 class 이름을 지었습니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/animation&quot;&gt;animation&lt;/a&gt;을 활용하였습니다. &lt;code&gt;hidden&lt;/code&gt;에서는 hide라는 이름의 애니메이션을, &lt;code&gt;shown&lt;/code&gt;에서는 show라는 이름의 애니메이션 효과를 주고,&lt;/p&gt;
&lt;p&gt;&lt;code&gt;hidden&lt;/code&gt;과 &lt;code&gt;shown&lt;/code&gt;에서 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/animation-duration&quot;&gt;animation-duration&lt;/a&gt;은 0.1초로 설정하여 0.1초동안 애니메이션이 실행되도록 하고, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/animation-timing-function#values&quot;&gt;animation-timing-funcion&lt;/a&gt;은 &lt;code&gt;linear&lt;/code&gt;로 설정하여 균일한 속도로 진행되게 하며, &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/animation-fill-mode&quot;&gt;animation-fill-mode&lt;/a&gt;는 &lt;code&gt;forwards&lt;/code&gt;로 설정하여 실행 된 애니메이션의 마지막 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/@keyframes&quot;&gt;@keyframes&lt;/a&gt;에 의해 설정된 계산 된 값을 유지하도록 합니다.&lt;/p&gt;
&lt;h3&gt;@keyframe hide and show&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;@keyframes hide {
  from {
    opacity: 1;
  }
  to {
    opacity: 0;
    visibility: hidden;
  }
}

@keyframes show {
  from {
    visibility: hidden;
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;@keyframes hide&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/@keyframes&quot;&gt;@keyframes&lt;/a&gt; &lt;code&gt;hide&lt;/code&gt;에서 전형적인 오프셋 &lt;code&gt;from&lt;/code&gt;과 &lt;code&gt;to&lt;/code&gt;를 기준으로 &lt;code&gt;opacity: 1&lt;/code&gt;로부터 &lt;code&gt;opacity: 0&lt;/code&gt;과 &lt;code&gt;visibiliy: hidden&lt;/code&gt; 속성으로 가게끔 하여,&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/opacity&quot;&gt;opacity&lt;/a&gt; 즉 요소의 불투명도를 1에서 0으로 하여 &lt;strong&gt;완전히 불투명&lt;/strong&gt;하였다가 &lt;strong&gt;완전히 투명&lt;/strong&gt;하도록 하고,&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/visibility#%EA%B0%92&quot;&gt;visibility&lt;/a&gt; 즉 요소의 보임을 &lt;code&gt;hidden&lt;/code&gt; 즉 숨겨지게 하여 &lt;code&gt;opacity&lt;/code&gt;에 의해서 투명해졌지만 물리적으로 존재했던 요소를 숨김처리를 하여 &lt;u&gt;물리적으로 존재하지 않고 레이아웃 상으로만 존재하게&lt;/u&gt; 합니다.&lt;/p&gt;
&lt;h4&gt;@keyframes show&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;@keyframes show&lt;/code&gt;에서는 &lt;code&gt;@keyframes hide&lt;/code&gt;와 반대가 되도록 합니다.&lt;/p&gt;
&lt;h2&gt;js&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const HIDDEN_CLASSNAME = &amp;quot;hidden&amp;quot;;
const SHOWN_CLASSNAME = &amp;quot;shown&amp;quot;;

const dkHead = document.getElementById(&amp;quot;dkHead&amp;quot;);
const areaMenu = document.querySelector(&amp;quot;.area_menu&amp;quot;);
const areaTitle = document.querySelector(&amp;quot;.area_title&amp;quot;);

let beforeScrollY = [];

const handleTopBar = (useClassName, unuseClassName) =&amp;gt; {
  dkHead.classList.add(useClassName);
  dkHead.classList.remove(unuseClassName);
  areaMenu.classList.add(useClassName);
  areaMenu.classList.remove(unuseClassName);
};

window.addEventListener(&amp;quot;scroll&amp;quot;, () =&amp;gt; {
  if (window.scrollY &amp;gt; areaTitle.offsetHeight) {
    if (beforeScrollY.pop() &amp;lt; window.scrollY) {
      handleTopBar(HIDDEN_CLASSNAME, SHOWN_CLASSNAME);
    } else {
      handleTopBar(SHOWN_CLASSNAME, HIDDEN_CLASSNAME);
    }
    beforeScrollY.push(window.scrollY);
  }
});&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;자주 쓰이는 변수 선언&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const HIDDEN_CLASSNAME = &amp;quot;hidden&amp;quot;;
const SHOWN_CLASSNAME = &amp;quot;shown&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2번 이상 쓰이는 String은 오타가 날 수 있기 때문에 변수 선언을 꼭 해주는 편입니다.&lt;/p&gt;
&lt;p&gt;class의 역활을 가지고 있는 &lt;code&gt;&amp;quot;hidden&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;shown&amp;quot;&lt;/code&gt;을 &lt;code&gt;HIDDEN_CLASSNAME&lt;/code&gt;과 &lt;code&gt;SHOWN_CLASSNAME&lt;/code&gt;으로 대문자만으로 이름을 지어 변수를 선언해줍니다.&lt;/p&gt;
&lt;h3&gt;id 혹은 class 요소를 찾아 변수 선언&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const dkHead = document.getElementById(&amp;quot;dkHead&amp;quot;);
const areaMenu = document.querySelector(&amp;quot;.area_menu&amp;quot;);
const areaTitle = document.querySelector(&amp;quot;.area_title&amp;quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;dkHead&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/157619941-d1a9f184-4315-40b3-b9fb-086719528eac.png&quot; /&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const dkHead = document.getElementById(&amp;quot;dkHead&amp;quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/Document/getElementById&quot;&gt;getElementById&lt;/a&gt; 메서드를 활용하여 &lt;strong&gt;상단바 전체&lt;/strong&gt;를 의미하는 id 속성을 가진 요소 &lt;code&gt;#dkHead&lt;/code&gt;를 찾아서 호출한 후 &lt;code&gt;dkHead&lt;/code&gt;로 변수를 선언합니다.&lt;/p&gt;
&lt;h4&gt;areaMenu&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/157620388-58d8958f-a1ba-4901-b3c0-531870edc519.png&quot; /&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const areaMenu = document.querySelector(&amp;quot;.area_menu&amp;quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/Document/querySelector&quot;&gt;querySelector&lt;/a&gt; 메서드를 활용하여 상단바 전체를 의미하는 &lt;code&gt;dkHead&lt;/code&gt;와 달리 상단바에 독립적으로 위치한 요소인 &lt;code&gt;.area_menu&lt;/code&gt;를 호출한 후 &lt;code&gt;areaMenu&lt;/code&gt;로 변수를 선언합니다.&lt;/p&gt;
&lt;h4&gt;areaTitle&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/157621568-3f8dcbf1-a8ba-4ade-a649-2bb3c9183fa5.png&quot; /&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const areaTitle = document.querySelector(&amp;quot;.area_title&amp;quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/Document/querySelector&quot;&gt;querySelector&lt;/a&gt; 메서드를 활용하여&lt;br&gt;글의 제목을 의미하지만 여기서는 &lt;strong&gt;상단바를 숨기는 기준&lt;/strong&gt;이 되는 요소인 &lt;code&gt;.area_title&lt;/code&gt;을 호출한 후 &lt;code&gt;areaTitle&lt;/code&gt;로 변수를 선언합니다.&lt;/p&gt;
&lt;h3&gt;handleTopBar()&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const handleTopBar = (useClassName, unuseClassName) =&amp;gt; {
  dkHead.classList.add(useClassName);
  dkHead.classList.remove(unuseClassName);
  areaMenu.classList.add(useClassName);
  areaMenu.classList.remove(unuseClassName);
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;상단바를 숨기고 보이게 하는 함수입니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;추가하여 사용할 예정&lt;/strong&gt;이라는 의미인 &lt;code&gt;useClassName&lt;/code&gt;, &lt;strong&gt;삭제하여 사용하지 않을 예정&lt;/strong&gt;이라는 의미인 &lt;code&gt;unuseClassName&lt;/code&gt; 라고 이름지은 두 개의 매개변수를 포함하는 함수로 구성합니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;handelTopBar&lt;/code&gt; 함수가 실행되면 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/Element/classList&quot;&gt;classList&lt;/a&gt;가 사용되며 &lt;code&gt;add&lt;/code&gt;와 &lt;code&gt;remove&lt;/code&gt;를 통해 &lt;code&gt;dkHead&lt;/code&gt;와 &lt;code&gt;areaMenu&lt;/code&gt;의 class 목록에서 &lt;code&gt;useClassName&lt;/code&gt;을 추가하고 &lt;code&gt;unuseClassName&lt;/code&gt;를 삭제시킵니다.&lt;/p&gt;
&lt;h3&gt;beforeScrollY&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let beforeScrollY = [];&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;언제든 새로운 값이 들어올 수 있도록 &lt;code&gt;const&lt;/code&gt;가 아닌 &lt;code&gt;let&lt;/code&gt;으로 이전의 &lt;code&gt;window.scrollY&lt;/code&gt; 값을 받는다는 뜻의 &lt;code&gt;beforeScrollY&lt;/code&gt;로 배열을 선언합니다.&lt;/p&gt;
&lt;h3&gt;addEventListener(&amp;quot;scroll&amp;quot;, () =&amp;gt; {})&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;window.addEventListener(&amp;quot;scroll&amp;quot;, () =&amp;gt; {
  if (window.scrollY &amp;gt; areaTitle.offsetHeight) {
    if (beforeScrollY.pop() &amp;lt; window.scrollY) {
      handleTopBar(HIDDEN_CLASSNAME, SHOWN_CLASSNAME);
    } else {
      handleTopBar(SHOWN_CLASSNAME, HIDDEN_CLASSNAME);
    }
    beforeScrollY.push(window.scrollY);
  }
});&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;addEventListener()&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/EventTarget/addEventListener&quot;&gt;addEventListener()&lt;/a&gt;을 통해 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/Events#%EB%B7%B0_%EC%9D%B4%EB%B2%A4%ED%8A%B8&quot;&gt;scroll&lt;/a&gt;이벤트가 발생할 경우 화살표 함수가 실행되도록 합니다.&lt;/p&gt;
&lt;h4&gt;if else&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/Window/scrollY&quot;&gt;window.scrollY&lt;/a&gt;가 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetHeight&quot;&gt;areaTitle.offsetHeight&lt;/a&gt;보다 클 경우 즉 화면 전체의 세로 방향으로 스크롤된 값이 전체 글의 제목 높이보다 크다는 조건에서&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/pop&quot;&gt;beforeScrollY.pop()&lt;/a&gt;이 &lt;code&gt;window.scrollY&lt;/code&gt; 보다 작을 경우 즉 &lt;strong&gt;페이지가 아래로 스크롤 되면서&lt;/strong&gt; &lt;code&gt;beforeScrollY&lt;/code&gt; 배열의 마지막 값이 화면 전체의 높이보다 작을 경우 &lt;code&gt;handleTopBar(HIDDEN_CLASSNAME, SHOWN_CLASSNAME)&lt;/code&gt; 함수가 실행되며 &lt;strong&gt;상단바를 보이지 않게&lt;/strong&gt; 하고&lt;/p&gt;
&lt;p&gt;아닐 경우 즉 반대로 &lt;strong&gt;페이지가 위로 스크롤 되면서&lt;/strong&gt; &lt;code&gt;beforeScrollY&lt;/code&gt; 배열의 마지막 값이 화면 전체의 높이보다 클 경우 &lt;code&gt;handleTopBar(SHOWN_CLASSNAME, HIDDEN_CLASSNAME)&lt;/code&gt; 함수가 실행되며 &lt;strong&gt;상단바를 보이게&lt;/strong&gt; 합니다.&lt;/p&gt;
&lt;h4&gt;push()&lt;/h4&gt;
&lt;p&gt;위의 과정이 끝난 후 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/push&quot;&gt;beforeScrollY.push(window.scrollY)&lt;/a&gt; 로 인하여 조건문에서 사용되었던 &lt;code&gt;window.scrollY&lt;/code&gt; 값이 &lt;code&gt;beforeScrollY&lt;/code&gt; 배열에 추가됩니다.&lt;/p&gt;
&lt;p&gt;그리고 &lt;code&gt;scroll&lt;/code&gt; 이벤트가 발생될 때마다 모든 과정이 반복됩니다.&lt;/p&gt;</description>
      <category>JavaScript</category>
      <category>CSS</category>
      <category>Javascript</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/80</guid>
      <comments>https://sukvvon.tistory.com/80#entry80comment</comments>
      <pubDate>Sat, 12 Mar 2022 13:52:21 +0900</pubDate>
    </item>
    <item>
      <title>Tistory(#1) icon들을 CSS로 구현하기</title>
      <link>https://sukvvon.tistory.com/79</link>
      <description>&lt;blockquote&gt;
&lt;p&gt;이 Tistory(#1) 아이콘 CSS로 구현하기 포스팅은 &lt;a href=&quot;https://sukvvon.tistory.com/76&quot;&gt;Tistory(#1) theme toggle 구현기&lt;/a&gt;의 내용을 일부 공유합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;계기&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/156522038-06260d5e-0203-45bf-a2ea-e296553125b8.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/156522478-981929db-c540-4901-ac31-66263e52d822.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://sukvvon.tistory.com/76&quot;&gt;theme toggle&lt;/a&gt;을 구현하고 나니 기존 tistory에서 제공하는 아이콘이 깨지는 것을 알았습니다. 미관상 좋지 않다고 판단하여 &lt;a href=&quot;https://fontawesome.com/&quot;&gt;fontawesome&lt;/a&gt;을 쓸 수 있지만 간단하여 직접 CSS를 활용하여 구현해보기로 하였습니다.&lt;/p&gt;
&lt;h2&gt;돋보기 아이콘  &lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/156678884-ce75befe-189a-4e01-975f-af06a9f972f1.png&quot; /&gt;
&lt;/p&gt;

&lt;h3&gt;html&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!--reading-glasses--&amp;gt;
&amp;lt;span class=&amp;quot;reading-glasses&amp;quot;&amp;gt;
  &amp;lt;span class=&amp;quot;reading-glasses__circle&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;span class=&amp;quot;reading-glasses__line&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/span&amp;gt;
&amp;lt;!--reading glasses--&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;css의 이름은 &lt;a href=&quot;http://getbem.com/naming/&quot;&gt;BEM&lt;/a&gt;을 참고하여 정해보았습니다. 모두 &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; 태그를 사용하여 &lt;code&gt;reading-glasses&lt;/code&gt; 클래스를 부모 요소로 하여 자식 요소로 돋보기 모양의 원인 &lt;code&gt;reading-glasses__circle&lt;/code&gt;, 그리고 돋보기 모양의 선에 해당하는 부분인 &lt;code&gt;reading-glasses__line&lt;/code&gt;을 둡니다.&lt;/p&gt;
&lt;h3&gt;css&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;.reading-glasses {
  display: flex;
  flex-direction: column;
  width: 16px;
  height: 16px;
  margin: auto;
}

.reading-glasses__circle {
  width: 8px;
  height: 8px;
  border: 2px solid var(--color-a);
  border-radius: 50%;
}

.reading-glasses__line {
  width: 6px;
  border: 1px solid var(--color-a);
  border-radius: 1px;
  transform: translate3d(8px, -1px, 0) rotate(45deg);
  background-color: var(--color-a);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;.reading-glasses&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/156869532-42059a00-e78c-4714-8822-315e67aa93e3.png&quot; /&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;.reading-glasses {
  display: flex;
  flex-direction: column;
  width: 16px;
  height: 16px;
  margin: auto;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/display&quot;&gt;display&lt;/a&gt;를 flex로 설정하여 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Flexible_Box_Layout&quot;&gt;flexible&lt;/a&gt; 속성을 부여합니다. 또한 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/flex-direction&quot;&gt;flex-direction&lt;/a&gt;을 column으로 설정하여 행이 아닌 열을 기준으로 자식 요소들이 나열되게 합니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/width&quot;&gt;width&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/height&quot;&gt;height&lt;/a&gt; 즉 너비와 높이 또한 16px로 기존에 tistory #1 스킨에서 설정해준 초기 설정값을 지향합니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/margin&quot;&gt;margin&lt;/a&gt;은 auto로 하여 여백을 페이지에서 자동으로 적절하게 설정해주도록 합니다. 즉 돋보기 아이콘이 중앙으로 오게 합니다.&lt;/p&gt;
&lt;h4&gt;.reading-glasses__circle&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/156869647-e7119595-a481-4be0-b6fc-a5812bde0c98.png&quot; /&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/156870489-ce1e0684-8f4c-4b06-b4c6-19b9e9a156a2.png&quot; /&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;.reading-glasses__circle {
  width: 8px;
  height: 8px;
  border: 2px solid var(--color-a);
  border-radius: 50%;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;돋보기 아이콘의 거울입니다. 부모 요소의 클래스인 &lt;code&gt;reading-glasses&lt;/code&gt;의 &lt;code&gt;display: flex&lt;/code&gt;이므로 &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; 태그여서 &lt;code&gt;display: inline&lt;/code&gt;인 속성은 모두 &lt;code&gt;display: block&lt;/code&gt;가 되어 높이가 존재할 수 있게 됩니다.&lt;/p&gt;
&lt;p&gt;돋보기의 원 모양을 담당하는 클래스이므로 &lt;code&gt;width&lt;/code&gt;와 &lt;code&gt;height&lt;/code&gt; 즉 너비와 높이는 모두 8px로 설정해주고 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/border&quot;&gt;border&lt;/a&gt;의 굵기는 2px, solid 즉 직선, &lt;a href=&quot;https://sukvvon.tistory.com/76#h-tag-5&quot;&gt;themes.css&lt;/a&gt;에서 이어지는 &lt;code&gt;var(--color-a)&lt;/code&gt; 즉 &lt;code&gt;#8b949e&lt;/code&gt;, &lt;code&gt;57606a&lt;/code&gt;의 색을 가지게 됩니다. &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/border-radius&quot;&gt;border-radius&lt;/a&gt; 즉 border 테두리 경계를 50% 둥글게 하여 완전한 원이 되게 합니다.&lt;/p&gt;
&lt;h4&gt;.reading-glasses__line&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/156869764-d58779f4-32e2-43da-9ea4-b306c2d91fd2.png&quot; /&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/156870517-60fbaf3c-af2d-41d0-9012-4c6e5bbc6cba.png&quot; /&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;.reading-glasses__line {
  width: 6px;
  border: 1px solid var(--color-a);
  border-radius: 1px;
  transform: translate3d(8px, -1px, 0) rotate(45deg);
  background-color: var(--color-a);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;돋보기 아이콘의 손잡이입니다. &lt;code&gt;reading-glasses__line&lt;/code&gt; 클래스를 가진 &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; 태그 또한 &lt;code&gt;display: block&lt;/code&gt;가 되어 높이를 가질 수 있게 됩니다. 하지만 이 클래스는 높이가 필요가 없는 클래스입니다. 다만 존재함으로서 부모 요소의 &lt;code&gt;display: flex&lt;/code&gt; 속성에 의한 위치를 지켜줍니다.&lt;/p&gt;
&lt;p&gt;직선 형태의 손잡이이므로 &lt;code&gt;width: 6px&lt;/code&gt; 즉 너비를 6px로 설정합니다. &lt;code&gt;border&lt;/code&gt;의 굵기는 1px, &lt;code&gt;solid&lt;/code&gt; 직선, &lt;code&gt;var(--color-a)&lt;/code&gt;의 색상으로 설정합니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/transform&quot;&gt;transform&lt;/a&gt;로 위치를 이동시킵니다. &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/translate3d()&quot;&gt;translate3d(8px, -1px, 0)&lt;/a&gt;으로 설정하여 x축의 오른쪽 방향으로 8px만큼 이동하고, y축으로 위로 1px만큼 이동하여 돋보기의 거울 부분과 연결시킵니다.&lt;/p&gt;
&lt;p&gt;돋보기 직선안에 빈 공간이 생기게 되는데 이 부분은 &lt;code&gt;background-color: var(--color-a)&lt;/code&gt; 속성을 주어 빈 공간을 직선 색상과 동일하게 해주어 없애줍니다.&lt;/p&gt;
&lt;h2&gt;이전, 이후 아이콘 〈〉&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/156870818-52ff0e74-d7e7-4f21-b1fa-251fcc165519.png&quot; /&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/156870850-a2f1391e-99a1-482b-b60d-9a2c92a1768c.png&quot; /&gt;
&lt;/p&gt;

&lt;h3&gt;html&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!-- prev --&amp;gt;
&amp;lt;span class=&amp;quot;prev&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;!-- prev --&amp;gt;

&amp;lt;!-- next --&amp;gt;
&amp;lt;span class=&amp;quot;next&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;!-- next --&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이전 아이콘은 &lt;code&gt;prev&lt;/code&gt;, 다음 아이콘은 &lt;code&gt;next&lt;/code&gt;라고 클래스 이름을 지었습니다.&lt;/p&gt;
&lt;h3&gt;css&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;.prev {
  display: inline-block;
  width: 8px;
  height: 8px;
  border: 2px solid var(--color-a);
  border-top: none;
  border-right: none;
  transform: rotate(45deg);
  margin: 0 0 1px 3px;
}

.next {
  display: inline-block;
  width: 8px;
  height: 8px;
  border: 2px solid var(--color-a);
  border-bottom: none;
  border-left: none;
  transform: rotate(45deg);
  margin: 0 3px 1px 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이전을 의미하는 클래스인 &lt;code&gt;prev&lt;/code&gt;입니다. 높이를 가지는 &lt;code&gt;block&lt;/code&gt; 속성과 한 줄로 늘어서 보이는 속성을 가지는 &lt;code&gt;inline&lt;/code&gt; 합한 &lt;code&gt;display: inline-block&lt;/code&gt; 으로 설정하여 다음 번호들과 일렬로 나열되게 합니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;prev&lt;/code&gt;와 같은 경우 &lt;code&gt;border-top&lt;/code&gt;, &lt;code&gt;border-left&lt;/code&gt;를 &lt;code&gt;none&lt;/code&gt;으로 설정하여 &lt;strong&gt;상단과 좌측 부분 선을 없앱니다.&lt;/strong&gt; &lt;code&gt;next&lt;/code&gt;의 경우는 반대로 &lt;code&gt;border-bottom&lt;/code&gt;, &lt;code&gt;border-right&lt;/code&gt;를 &lt;code&gt;none&lt;/code&gt;으로 설정하여 &lt;strong&gt;하단과 우측 부분 선을 없앱니다.&lt;/strong&gt; 그리고 &lt;code&gt;transform: rotate(45deg)]&lt;/code&gt;로 중심을 기준으로 시계방향으로 45도 회전시킵니다.&lt;/p&gt;
&lt;p&gt;마지막으로 &lt;code&gt;margin: 0 3px 1px 0&lt;/code&gt;, 우측 여백을 3px, 하단 여백을 1px으로 설정해 기준축과 교차축에 대하여 중앙으로 온 것처럼 보이게끔 합니다.&lt;/p&gt;</description>
      <category>CSS</category>
      <category>CSS</category>
      <category>HTML</category>
      <category>Icon</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/79</guid>
      <comments>https://sukvvon.tistory.com/79#entry79comment</comments>
      <pubDate>Sat, 5 Mar 2022 14:44:00 +0900</pubDate>
    </item>
    <item>
      <title>[Git] Fork repository 최신화하기</title>
      <link>https://sukvvon.tistory.com/78</link>
      <description>&lt;h2&gt;github에서 fork 후 PR(pull requset)&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/156322258-7d7943b0-61ae-4f8d-b122-d546b8ab17ce.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;Tistory #1 스킨을 사용하던 중 TOC의 필요성을 느꼈습니다. &lt;a href=&quot;https://github.com/wbluke&quot;&gt;wbluke&lt;/a&gt; 님의 &lt;a href=&quot;https://github.com/wbluke/tistory-table-of-contents&quot;&gt;tistory-table-of-contents&lt;/a&gt; 프로젝트를 발견하여 감사하며 사용하던 중 추가하고 싶은 사항이 생각나 fork 후 pull request 하였습니다.&lt;/p&gt;
&lt;p&gt;다행히 &lt;a href=&quot;https://github.com/wbluke&quot;&gt;wbluke&lt;/a&gt;님께서 저의 PR을 merge 해 주셔습니다. 감사합니다.&lt;/p&gt;
&lt;p&gt;그리고 fork된 repo에 원본으로부터 오늘까지 업데이트된 최신 사항을 반영해야하는데 처음 해보는 과정이어서 한 번 정리해 보았습니다.&lt;/p&gt;
&lt;h2&gt;git remote -v&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/156323636-7e04cbdc-d8b0-4cf3-91f1-ebb66d1a30e6.png&quot; /&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;git remote add upstream https://github.com/wbluke/tistory-table-of-contents.git&lt;/code&gt; 가 이미 된 상태입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt; sukvvon  ~/Desktop/tistory-table-of-contents   master  git remote -v
origin  https://github.com/sukvvon/tistory-table-of-contents.git (fetch)
origin  https://github.com/sukvvon/tistory-table-of-contents.git (push)
upstream        https://github.com/wbluke/tistory-table-of-contents.git (fetch)
upstream        https://github.com/wbluke/tistory-table-of-contents.git (push)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;git romote -v&lt;/code&gt;를 통해 현재 &lt;code&gt;remote&lt;/code&gt; 된 주소를 확인합니다. 여기서 &lt;code&gt;origin&lt;/code&gt;은 &lt;code&gt;fork&lt;/code&gt;된 자신의 원격 repo의 주소이고 &lt;code&gt;upstream&lt;/code&gt;은 &lt;code&gt;fork&lt;/code&gt;하기 전 원본 원격 repo의 주소입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;origin&lt;/code&gt; = &lt;code&gt;fork&lt;/code&gt;된 자신의 원격 repo의 주소&lt;/li&gt;
&lt;li&gt;&lt;code&gt;upstream&lt;/code&gt; = &lt;code&gt;fork&lt;/code&gt;하기 전 원본 원격 repo의 주소&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;git fetch upstream&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/156323095-bbc8d918-cb29-4f92-a1d3-3fe7381e8ebd.png&quot; /&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt; sukvvon  ~/Desktop/tistory-table-of-contents   master  git fetch upstream
remote: Enumerating objects: 17, done.
remote: Counting objects: 100% (15/15), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 9 (delta 3), reused 8 (delta 3), pack-reused 0
Unpacking objects: 100% (9/9), 1.65 KiB | 112.00 KiB/s, done.
From https://github.com/wbluke/tistory-table-of-contents
 * [new branch]      develop         -&amp;gt; upstream/develop
 * [new branch]      initial-feature -&amp;gt; upstream/initial-feature
 * [new branch]      master          -&amp;gt; upstream/master
 * [new tag]         v0.1.8          -&amp;gt; v0.1.8&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;git fetch upstream&lt;/code&gt;을 통해 upstream의 최신 커밋까지 내용을 가져오기만 합니다.(&lt;a href=&quot;https://backlog.com/git-tutorial/kr/stepup/stepup3_2.html&quot;&gt;fetch&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;이력을 받아오기만 한 것이므로 &lt;code&gt;fetch&lt;/code&gt; 한 내용을 적용하기 위해선 &lt;code&gt;merge&lt;/code&gt;를 해야합니다.&lt;/p&gt;
&lt;h2&gt;git checkout master&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/156384163-cfc3b75e-4a18-4463-97ff-cc9c0a963fb3.png&quot; /&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt; sukvvon  ~/Desktop/tistory-table-of-contents   develop  git checkout master
Switched to branch &amp;#39;master&amp;#39;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;현재 brnach가 &lt;code&gt;master&lt;/code&gt;가 아닌 다른 branch라면 &lt;code&gt;git checkout master&lt;/code&gt;를 통해 &lt;code&gt;master&lt;/code&gt;로 branch를 변경해야합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;master로 merge를 할 예정&lt;/strong&gt;이기 때문입니다.&lt;/p&gt;
&lt;h2&gt;git merge upstream/master&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/156324917-5ad08d9a-fbd5-4f0b-b480-30e97f3fca6a.png&quot; /&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt; sukvvon  ~/Desktop/tistory-table-of-contents   master  git merge upstream/master
Updating e34391e..14b04ed
Fast-forward
 .gitignore      | 1 +
 README.md       | 6 +++++-
 dev/dev-toc.css | 1 +
 dev/dev-toc.js  | 4 ++--
 toc.css         | 1 +
 toc.js          | 6 +++---
 6 files changed, 13 insertions(+), 6 deletions(-)
 create mode 100644 .gitignore&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;fetch&lt;/code&gt;를 통해 가져오기만 한 내용을 &lt;code&gt;git merge upstream/master&lt;/code&gt;를 통해 &lt;code&gt;upstream/master&lt;/code&gt;에 &lt;code&gt;merge&lt;/code&gt; 즉 병합합니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fetch&lt;/code&gt;한 내용을 그대로 local repo에 반영하는 것을 볼 수 있습니다.&lt;/p&gt;
&lt;h2&gt;git push origin master&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/156325948-05a5eef5-434e-4a1e-93a1-2361d233ccb7.png&quot; /&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt; sukvvon  ~/Desktop/tistory-table-of-contents   master  git push origin master
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/sukvvon/tistory-table-of-contents.git
   e34391e..14b04ed  master -&amp;gt; master&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;fetch&lt;/code&gt;와 &lt;code&gt;merge&lt;/code&gt;한 것은 현재 local repo에서 일어난 일입니다. local repo에서 한 과정을 &lt;code&gt;git push origin master&lt;/code&gt;를 통해 remote repo에 적용시켜주도록 합니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/156346975-0fdc92d0-897f-4731-8f4b-1475a065915d.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;전에는 뒤쳐저 있다고 나왔었는데 현재는 원본 repo와 현재 fork된 repo의 커밋 위치가 동일하게 된 것을 알 수 있어 성공적으로 최신화가 이루어진 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork&quot;&gt;https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/configuring-a-remote-for-a-fork&quot;&gt;https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/configuring-a-remote-for-a-fork&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Git</category>
      <category>fetch</category>
      <category>git</category>
      <category>upstream</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/78</guid>
      <comments>https://sukvvon.tistory.com/78#entry78comment</comments>
      <pubDate>Wed, 2 Mar 2022 23:53:12 +0900</pubDate>
    </item>
    <item>
      <title>Tistory(#1) 간단하게 로딩 창 구현하기</title>
      <link>https://sukvvon.tistory.com/77</link>
      <description>&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/155837498-0e2c2cee-5d15-47d5-86c3-127f55d7cec2.gif&quot; /&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;이 TisTory(#1) 간단하게 로딩 창 구현하기 포스팅은 &lt;a href=&quot;https://sukvvon.tistory.com/76&quot;&gt;Tistory(#1) theme toggle 구현하기&lt;/a&gt;를 일부 공유합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;html&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!--loading--&amp;gt;
&amp;lt;div id=&amp;quot;loading&amp;quot;&amp;gt;
  &amp;lt;div id=&amp;quot;loading-circle&amp;quot;&amp;gt;
    &amp;lt;div id=&amp;quot;loading-empty&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;!--loading--&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;html 코드는 크게 3개의 요소로 이루어집니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;#loading&lt;/em&gt; → loading 화면 전체&lt;/li&gt;
&lt;li&gt;&lt;em&gt;#loading-circle&lt;/em&gt; → loading을 의미하는 원&lt;/li&gt;
&lt;li&gt;&lt;em&gt;#loading-empty&lt;/em&gt; → #loading-circle에서 원의 미완성 부분&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;loading.css&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;#loading {
  display: flex;
  justify-content: center;
  align-items: center;
  z-index: 32;
  position: fixed;
  top: 0;
  width: 100vw;
  height: 100vh;
  background-color: var(--background-color-body);
  animation: hideLoadingScreen 0.3s linear forwards;
  animation-delay: 0.7s;
}

@keyframes hideLoadingScreen {
  from {
    opacity: 1;
  }
  to {
    opacity: 0;
    visibility: hidden;
  }
}

#loading-circle {
  position: relative;
  width: 2rem;
  height: 2rem;
  border: 0.3rem solid var(--color-a);
  border-radius: 50%;
  display: flex;
  justify-content: center;
  animation: loadingCircle 1s ease-in-out infinite;
}

@keyframes loadingCircle {
  from {
    transform: none;
  }
  to {
    transform: rotate(360deg);
  }
}

#loading-empty {
  position: absolute;
  background-color: var(--background-color-body);
  width: 1rem;
  height: 2rem;
  top: -1rem;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;#loading&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;#loading {
  display: flex;
  justify-content: center;
  align-items: center;
  z-index: 32;
  position: fixed;
  top: 0;
  width: 100vw;
  height: 100vh;
  background-color: var(--background-color-body);
  animation: hideLoadingScreen 0.3s linear forwards;
  animation-delay: 0.7s;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;#loading&lt;/em&gt;의 역활은 &lt;strong&gt;loading 전체화면&lt;/strong&gt;입니다.&lt;/p&gt;
&lt;h4&gt;width, height&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;#loading {
  width: 100vw;
  height: 100vh;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;너비(&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/width&quot;&gt;width&lt;/a&gt;)와 높이(&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/height&quot;&gt;height&lt;/a&gt;)를 각각 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/length#vw&quot;&gt;100vw&lt;/a&gt; &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/length#vh&quot;&gt;100vh&lt;/a&gt;로 설정하여 &lt;strong&gt;화면 전체가 해당&lt;/strong&gt;되게 합니다.&lt;/p&gt;
&lt;h4&gt;display&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/155838090-71aa8069-1547-4e66-9ee4-09d73170156d.png&quot; /&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;#loading {
  display: flex;
  justify-content: center;
  align-items: center;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/display&quot;&gt;display&lt;/a&gt;를 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Flexible_Box_Layout&quot;&gt;flexible&lt;/a&gt;하게 만듭니다. 기본 축(&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/justify-content&quot;&gt;justify-content&lt;/a&gt;)과 교차 축(&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/align-items&quot;&gt;align-items&lt;/a&gt;) &lt;code&gt;center&lt;/code&gt;로 해 &lt;strong&gt;자식 요소가 화면의 정중앙&lt;/strong&gt;에 오도록 합니다.&lt;/p&gt;
&lt;h4&gt;z-index&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;#loading {
  z-index: 32;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/z-index&quot;&gt;z-index&lt;/a&gt; 속성을 32로 하여 현재 레이어 층이 32층이며 가장 &lt;strong&gt;최상위 층&lt;/strong&gt;이라고 설정합니다. 최상위 층이라는 것은 곧 이 loading 창 위에 아무것도 없다는 것입니다.&lt;/p&gt;
&lt;h4&gt;position&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;#loading {
  position: fixed;
  top: 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/position&quot;&gt;position&lt;/a&gt;을 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/position#fixed&quot;&gt;fixed&lt;/a&gt;로 하여 &lt;strong&gt;요소를 일반적인 흐름에서 제거하고, 공간 또한 배정하지 않게&lt;/strong&gt; 한 후 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/top&quot;&gt;top: 0&lt;/a&gt;을 통해 &lt;strong&gt;전체 화면의 최상단에 위치&lt;/strong&gt;하게 합니다.&lt;/p&gt;
&lt;h4&gt;animation&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;#loading {
  animation: hideLoadingScreen 0.3s linear forwards;
  animation-delay: 0.7s;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;hideLoadingScreen&lt;/code&gt; 애니메이션을 0.3초(&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/animation-duration&quot;&gt;animation-duration&lt;/a&gt;)동안 실행하고 애니메이션 진행 방식(&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/animation-timing-function&quot;&gt;animation-timing-function&lt;/a&gt;)을 &lt;code&gt;linear&lt;/code&gt; 즉 선형성 직선적으로 바르게 진행하도록 합니다. 그리고 &lt;code&gt;forwards&lt;/code&gt; 속성을 줌으로(&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/animation-fill-mode&quot;&gt;animation-fill-mode&lt;/a&gt;) 애니메이션이 &lt;strong&gt;끝난 후에도 지속&lt;/strong&gt;되게 합니다.&lt;/p&gt;
&lt;p&gt;또한 애니메이션 지연(&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/animation-delay&quot;&gt;animation-delay&lt;/a&gt;)을 0.7초로 하여 애니메이션이 0.7초 뒤에 실행하도록 합니다.&lt;/p&gt;
&lt;h3&gt;hideLoadingScreen animation&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;@keyframes hideLoadingScreen {
  from {
    opacity: 1;
  }
  to {
    opacity: 0;
    visibility: hidden;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/@keyframes&quot;&gt;@keyframes&lt;/a&gt; 규칙을 생성합니다. 애니메이션 이름(&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/animation-name&quot;&gt;animation-name&lt;/a&gt;)을 &lt;code&gt;hideLoadingScreen&lt;/code&gt;으로 정합니다. &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/opacity&quot;&gt;opacity&lt;/a&gt;를 통해 불투명 정도를 &lt;strong&gt;완전히 없음(1)&lt;/strong&gt; 에서 &lt;strong&gt;완전히 있음(0)&lt;/strong&gt; 으로 합니다. 하지만 불투명할 뿐이지 존재하므로 요소의 보임(&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/visibility&quot;&gt;visibility&lt;/a&gt;)을 &lt;code&gt;hidden&lt;/code&gt;으로 &lt;strong&gt;숨김처리&lt;/strong&gt; 하여 loading 창이 없는 효과를 줘 loading 창 밑 층에 있는 요소들을 제어 할 수 있게 합니다.&lt;/p&gt;
&lt;h3&gt;#loading-circle&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;#loading-circle {
  position: relative;
  width: 2rem;
  height: 2rem;
  border: 0.3rem solid var(--color-a);
  border-radius: 50%;
  display: flex;
  justify-content: center;
  animation: loadingCircle 1s ease-in-out infinite;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;#loading-circle&lt;/em&gt; 원에 관한 요소입니다.&lt;/p&gt;
&lt;h4&gt;position&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;#loading-circle {
  position: relative;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/position&quot;&gt;position&lt;/a&gt;을 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/position#relative&quot;&gt;relative&lt;/a&gt;로 설정하여 &lt;em&gt;#loading-empty&lt;/em&gt; 의 &lt;strong&gt;기준이 되는 조상&lt;/strong&gt;은 &lt;em&gt;#loading-circle&lt;/em&gt; 인 것이라고 지정합니다.&lt;/p&gt;
&lt;h4&gt;width, height&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;#loading-circle {
  width: 2rem;
  height: 2rem;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;width&lt;/code&gt;와 &lt;code&gt;height&lt;/code&gt;를 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Learn/CSS/Building_blocks/Values_and_units#%EC%83%81%EB%8C%80_%EA%B8%B8%EC%9D%B4_%EB%8B%A8%EC%9C%84&quot;&gt;2rem&lt;/a&gt;으로 하여 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Learn/CSS/Building_blocks/Values_and_units#%EC%A0%88%EB%8C%80_%EA%B8%B8%EC%9D%B4_%EB%8B%A8%EC%9C%84&quot;&gt;px&lt;/a&gt;과 같은 절대적인 길이가 아닌 상대적인 길이 설정을 통해 &lt;strong&gt;웹과 모바일을 모두 호환이 가능&lt;/strong&gt;하게끔 합니다.&lt;/p&gt;
&lt;h4&gt;border&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/155838697-0a8a20ef-d47d-43ae-86f1-67982ba61213.png&quot; /&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/155838767-3a411691-58c6-4cbe-9e32-ff26e9c5e53c.png&quot; /&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;#loading-circle {
  border: 0.3rem solid var(--color-a);
  border-radius: 50%;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;마찬가지로 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/border&quot;&gt;border&lt;/a&gt;의 굵기 또한 상대적인 척도인 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Learn/CSS/Building_blocks/Values_and_units#%EC%83%81%EB%8C%80_%EA%B8%B8%EC%9D%B4_%EB%8B%A8%EC%9C%84&quot;&gt;rem&lt;/a&gt;을 사용합니다. 색상은 &lt;a href=&quot;https://sukvvon.tistory.com/76#h-tag-22&quot;&gt;dataTheme.css&lt;/a&gt;의 &lt;code&gt;--color-a&lt;/code&gt;인 &lt;code&gt;#8b949e&lt;/code&gt;와 &lt;code&gt;#57606a&lt;/code&gt;를 사용합니다. 그리고 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/border-radius&quot;&gt;border-radius&lt;/a&gt;는 원이 되어야 하므로 &lt;em&gt;50%&lt;/em&gt; 로 합니다.&lt;/p&gt;
&lt;h4&gt;display&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;#loading-circle {
  display: flex;
  justify-content: center;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/display&quot;&gt;display&lt;/a&gt;는 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Flexible_Box_Layout&quot;&gt;flexible&lt;/a&gt; 속성을 주고 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/justify-content&quot;&gt;justify-content&lt;/a&gt;을 &lt;code&gt;center&lt;/code&gt;로 설정해 자식 요소인 &lt;em&gt;#loading-empty&lt;/em&gt; 가 &lt;strong&gt;중앙&lt;/strong&gt;으로 오게 합니다.&lt;/p&gt;
&lt;h4&gt;animation&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;#loading-circle {
  animation: loadingCircle 1s ease-in-out infinite;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;loadingCircle&lt;/code&gt; 애니메이션을 1초(&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/animation-duration&quot;&gt;animation-duration&lt;/a&gt;)동안 실행하고 애니메이션 진행 방식(&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/animation-timing-function&quot;&gt;animation-timing-function&lt;/a&gt;)을 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/transition-timing-function#ease-in-out&quot;&gt;ease-in-out&lt;/a&gt; 즉 &lt;strong&gt;시작과 끝의 속도를 천천히 진행하도록&lt;/strong&gt; 합니다. 그리고 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/animation-iteration-count#infinite&quot;&gt;infinite&lt;/a&gt; 속성을 줌으로(&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/animation-fill-mode&quot;&gt;animation-fill-mode&lt;/a&gt;) 애니메이션이 끝나고도 계속 &lt;strong&gt;무한으로 반복&lt;/strong&gt;되게 합니다.&lt;/p&gt;
&lt;h3&gt;loadingCircle animation&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;@keyframes loadingCircle {
  from {
    transform: none;
  }
  to {
    transform: rotate(360deg);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/@keyframes&quot;&gt;@keyframes&lt;/a&gt; 규칙을 생성합니다. 애니메이션 이름(&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/animation-name&quot;&gt;animation-name&lt;/a&gt;)을 &lt;code&gt;loadingCircle&lt;/code&gt;로 정합니다. &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/transform&quot;&gt;transform&lt;/a&gt;을 &lt;code&gt;none&lt;/code&gt;으로 설정하여 효과가 없는 상태에서 시작하여 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/rotate()&quot;&gt;rotate(360deg)&lt;/a&gt; 즉 &lt;strong&gt;360도로 시계방향으로 회전&lt;/strong&gt;하게 합니다.&lt;/p&gt;
&lt;h3&gt;#loading-empty&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;#loading-empty {
  position: absolute;
  background-color: var(--background-color-body);
  width: 1rem;
  height: 2rem;
  top: -1rem;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;width, height&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/155838634-c3f02790-9451-44c5-ab56-df850197f2b3.png&quot; /&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;#loading-empty {
  width: 1rem;
  height: 2rem;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;너비(&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/width&quot;&gt;width&lt;/a&gt;)와 높이(&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/height&quot;&gt;height&lt;/a&gt;)를 1rem, 2rem으로 여유롭게 설정하여 원 상단의 일부분을 가리게 합니다.&lt;/p&gt;
&lt;h4&gt;position&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;#loading-empty {
  position: absolute;
  top: -1rem;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/position&quot;&gt;position&lt;/a&gt;을 &lt;code&gt;absolute&lt;/code&gt;로 설정하여 가장 가까운 위치의 조상인 #loading-circle을 기준으로부터 &lt;code&gt;top: -1rem&lt;/code&gt; 즉 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Learn/CSS/Building_blocks/Values_and_units#%EC%83%81%EB%8C%80_%EA%B8%B8%EC%9D%B4_%EB%8B%A8%EC%9C%84&quot;&gt;1rem&lt;/a&gt;만큼 상단으로 위치가 이동합니다.&lt;/p&gt;
&lt;h4&gt;background-color&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/155838697-0a8a20ef-d47d-43ae-86f1-67982ba61213.png&quot; /&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/155838767-3a411691-58c6-4cbe-9e32-ff26e9c5e53c.png&quot; /&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;#loading-empty {
  background-color: var(--background-color-body);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;background-color&lt;/code&gt; 즉 배경색은 &lt;a href=&quot;https://sukvvon.tistory.com/76#h-tag-5&quot;&gt;themes.css&lt;/a&gt;의 &lt;code&gt;--background-color-body&lt;/code&gt;인 &lt;code&gt;#0d1117&lt;/code&gt;과 &lt;code&gt;#57606a&lt;/code&gt;를 사용합니다.&lt;/p&gt;</description>
      <category>CSS</category>
      <category>CSS</category>
      <category>HTML</category>
      <category>loading screen</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/77</guid>
      <comments>https://sukvvon.tistory.com/77#entry77comment</comments>
      <pubDate>Sat, 26 Feb 2022 21:44:24 +0900</pubDate>
    </item>
    <item>
      <title>Tistory(#1) theme toggle 구현기</title>
      <link>https://sukvvon.tistory.com/76</link>
      <description>&lt;h2&gt;나만 없는 다크모드,,,&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/157015289-27dfa697-b013-4ab9-bb1d-16661aa00633.gif&quot; /&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;본 포스팅은 티스토리 &lt;em&gt;#1&lt;/em&gt;을 기준으로 합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;velog나 notion 그리고 github.io를 이용하는 블로거분들의 페이지를 방문할 때가 있습니다. 그리고 이 분들과 저의 차이점, 그리고 부러운 점이 하나 있었습니다. 바로 &lt;strong&gt;다크모드 테마&lt;/strong&gt;가 있다는 것이었습니다...&lt;/p&gt;
&lt;p&gt;평소 tistory에서 제공하는 &lt;em&gt;#1&lt;/em&gt; 스킨을 사용하는 저는 다크모드 그리고 다크모드와 라이트모드를 사용자 기호에 맞게 사용할 수 있는 토글도 없었습니다.&lt;/p&gt;
&lt;p&gt;그래서 저의 티스토리 블로그 테마에 다크모드와 라이트모드 토글을 구현하였습니다.&lt;/p&gt;
&lt;h2&gt;FOCU 현상&lt;/h2&gt;
&lt;h3&gt;문제&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/157166538-e154558e-a769-4fdc-a750-eac9f0099d6e.gif&quot; /&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;body&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;!-- 블로그 컨텐츠 내용 --&amp;gt;
    ...
  &amp;lt;/div&amp;gt;
  &amp;lt;!-- 테마 및 토글 관련 코드 --&amp;gt;
  &amp;lt;script src=&amp;quot;themeToggle.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;처음에 구현할 때 &lt;code&gt;theme.js&lt;/code&gt;와 &lt;code&gt;themeToggle.js&lt;/code&gt;의 내용을 모두 합하여 코드를 작성하고 &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;태그 제일 하단에 &lt;code&gt;&amp;lt;srcipt&amp;gt;&lt;/code&gt;태그를 추가하고 테스트를 하였습니다.&lt;/p&gt;
&lt;p&gt;그랬더니 lihgt 테마와 dark 테마에서 페이지를 로딩할 때 화면이 번쩍이는 현상을 발견했습니다. 알고보니 이 현상은 &lt;a href=&quot;https://ko.wikipedia.org/wiki/FOUC&quot;&gt;FOCU(Flash Of Unstyled Content)&lt;/a&gt;였습니다.&lt;/p&gt;
&lt;p&gt;테마 및 토글 관련 제어 코드를 담은 &lt;code&gt;&amp;lt;srcipt&amp;gt;&lt;/code&gt;태그가 마지막에 실행되어서 화면이 반짝이는 것이었습니다.&lt;/p&gt;
&lt;h3&gt;해결&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/157170545-3a651153-d7f1-4f95-a326-94aef4f09ada.gif&quot; /&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;body&amp;gt;
  &amp;lt;!-- body 태그 생성 이후 블로그 컨텐츠 내용을 받기 전에 삽입 --&amp;gt;
  &amp;lt;script src=&amp;quot;theme.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;!-- 블로그 컨텐츠 내용 --&amp;gt;
    ...
  &amp;lt;/div&amp;gt;
  &amp;lt;script src=&amp;quot;themeToggle.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;문제를 해결하기 위해 통합된 코드를 테마 관련 코드인 &lt;code&gt;theme.js&lt;/code&gt;, 테마 토글 관련 코드인 &lt;code&gt;themeToggle.js&lt;/code&gt;로 나누어 리펙토링하였습니다. 그리고 위와 같이 &lt;code&gt;script&lt;/code&gt; 태그들을 삽입하였습니다.&lt;/p&gt;
&lt;p&gt;브라우저 랜더링 과정은 간단하게 설명하면 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; 태그가 생성되자마자 &lt;code&gt;theme.js&lt;/code&gt;가 포함된 스크립트를 삽입하여 &lt;strong&gt;html 파싱&lt;/strong&gt;을 중지하고 제어권을 &lt;strong&gt;js엔진&lt;/strong&gt;에 넘긴 후 &lt;strong&gt;js엔진이 파싱&lt;/strong&gt;합니다. js엔진이 파싱을 마친 후 &lt;strong&gt;html 파싱은 다시 시작&lt;/strong&gt;되고 모두 끝난 후 마지막에 &lt;code&gt;themeToggle.js&lt;/code&gt;가 포함된 스크립트 코드를 만나 &lt;strong&gt;js엔진이 파싱을 처리&lt;/strong&gt;하게 됩니다.&lt;/p&gt;
&lt;p&gt;위와 같은 과정으로 테마 관련 스크립트를 중간에 미리 처리하였기 때문에 화면 깜빡임 현상(FOCU)은 발생하지 않게 되었습니다.&lt;/p&gt;
&lt;h2&gt;구성&lt;/h2&gt;
&lt;p&gt;theme 파트&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;themes.css&lt;/li&gt;
&lt;li&gt;theme.js&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;toggle 파트&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;html&lt;/li&gt;
&lt;li&gt;theme-toggle.css&lt;/li&gt;
&lt;li&gt;themeToggle.js&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;크게 theme에 대한 코드와 toggle에 대한 코드로 구성하였습니다.&lt;/p&gt;
&lt;p&gt;light, dark 테마에 대한 css 설정을 다룬 &lt;code&gt;themes.css&lt;/code&gt;, 사용자나 브라우저가 설정한 것에 의하여 light, dark 테마 중 하나를 적용시키는 &lt;code&gt;theme.js&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;toggle을 구현하는 html 코드, toggle을 구현하는 html 코드를 꾸민 css인 &lt;code&gt;theme-toggle.css&lt;/code&gt;, 마지막으로 light, dark 테마에 따른 toggle의 반응을 나타낸 &lt;code&gt;themeToggle.js&lt;/code&gt;입니다.&lt;/p&gt;
&lt;h2&gt;themes.css&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;html[theme=&amp;quot;dark&amp;quot;] {
  --background-color-body: #0d1117;
  --background-color-head-foot: #161b22;
  --border-bottom-h2: 1px solid #21262d;
  --color: #c9d1d9;
  --color-accent: #58a6ff;
  --blockquote-border-left: 5px solid #30363d !important;
  --tag-background-color: #222;
  --color-a: #8b949e;
  --background-color-inline-code: rgba(110, 118, 129, 0.4);
}

html[theme=&amp;quot;light&amp;quot;] {
  --background-color-body: #fff;
  --background-color-head-foot: #f6f8fa;
  --border-bottom-h2: 1px solid #d8dee4;
  --color: #24292f;
  --color-accent: #0969da;
  --blockquote-border-left: 5px solid #d0d7de !important;
  --tag-background-color: #f0f0f0;
  --color-a: #57606a;
  --background-color-inline-code: rgba(175, 184, 193, 0.2);
}

/* utterance */
html[theme=&amp;quot;dark&amp;quot;] .utterance-light {
  display: none;
}

html[theme=&amp;quot;light&amp;quot;] .utterance-dark {
  display: none;
}

/* scrollbar */
html,
.skin_view .area_view pre code.hljs {
  scrollbar-width: thin;
  scrollbar-color: var(--color-a) var(--background-color-body);
}

.skin_view .area_view pre code.hljs::-webkit-scrollbar {
  background-color: var(--background-color-body);
  height: 6px;
}

body::-webkit-scrollbar {
  background-color: var(--background-color-body);
  width: 6px;
}

body::-webkit-scrollbar-thumb,
.skin_view .area_view pre code.hljs::-webkit-scrollbar-thumb {
  background-color: var(--color-a);
  border-radius: 6px;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;html[theme=&amp;quot;COLOR&amp;quot;]&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;html[theme=&amp;quot;dark&amp;quot;] {
  --background-color-body: #0d1117;
  --background-color-head-foot: #161b22;
  --border-bottom-h2: 1px solid #21262d;
  --color: #c9d1d9;
  --color-accent: #58a6ff;
  --blockquote-border-left: 5px solid #30363d !important;
  --tag-background-color: #222;
  --color-a: #8b949e;
  --background-color-inline-code: rgba(110, 118, 129, 0.4);
}

html[theme=&amp;quot;light&amp;quot;] {
  --background-color-body: #fff;
  --background-color-head-foot: #f6f8fa;
  --border-bottom-h2: 1px solid #d8dee4;
  --color: #24292f;
  --color-accent: #0969da;
  --blockquote-border-left: 5px solid #d0d7de !important;
  --tag-background-color: #f0f0f0;
  --color-a: #57606a;
  --background-color-inline-code: rgba(175, 184, 193, 0.2);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/155140472-ee2596ba-bf7d-43c8-b777-52697c41f380.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;dark 테마와 light 테마에서 적용하기 원하는 색상을 예를 들어 &lt;code&gt;--color: #c9d1d9&lt;/code&gt;, &lt;code&gt;--color: #24292f&lt;/code&gt;와 같이 정의 한 후 &lt;code&gt;var(--color)&lt;/code&gt;로 css에서 사용합니다.&lt;/p&gt;
&lt;p&gt;자세한 사항은 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/--*&quot;&gt;Custom properties (--*): CSS variables&lt;/a&gt;에서 확인할 수 있습니다.&lt;/p&gt;
&lt;h3&gt;댓글(utterances) 테마 설정&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/157035333-86bd2971-a3cf-485d-9f0b-f9c89a7d7cbd.gif&quot; /&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;선택사항입니다. 만약 utterances를 사용중이라면 참고하시면 되겠습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;utterances html and css code&lt;/h4&gt;
&lt;h5&gt;html&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;div class=&amp;quot;utterance-light&amp;quot;&amp;gt;
  &amp;lt;script
    src=&amp;quot;https://utteranc.es/client.js&amp;quot;
    repo=&amp;quot;sukvvon/blog-comments&amp;quot;
    issue-term=&amp;quot;pathname&amp;quot;
    theme=&amp;quot;github-light&amp;quot;
    crossorigin=&amp;quot;anonymous&amp;quot;
    async
  &amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;div class=&amp;quot;utterance-dark&amp;quot;&amp;gt;
  &amp;lt;script
    src=&amp;quot;https://utteranc.es/client.js&amp;quot;
    repo=&amp;quot;sukvvon/blog-comments&amp;quot;
    issue-term=&amp;quot;pathname&amp;quot;
    theme=&amp;quot;dark-blue&amp;quot;
    crossorigin=&amp;quot;anonymous&amp;quot;
    async
  &amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;만약 &lt;a href=&quot;https://utteranc.es/&quot;&gt;utterances&lt;/a&gt;를 사용중이라면 간단하게 light, dark 테마별로 적용시킬 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;area_reply &amp;quot;&amp;gt;&lt;/code&gt; 태그 밑에 위와 같은 html 코드를 추가합니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;theme=&amp;quot;github-light&amp;quot;&lt;/code&gt;가 포함된 항목은 &lt;code&gt;utterance-light&lt;/code&gt; 클래스가 포함된 div 태그로 감싸주고, &lt;code&gt;&amp;quot;theme=&amp;quot;dark-blue&amp;quot;&lt;/code&gt;가 포함된 항목은 &lt;code&gt;utterance-dark&lt;/code&gt; 클래스가 포함된 div 태그로 감싸주면 테마 별로 댓글 창을 테마별로 구현할 수 있습니다.&lt;/p&gt;
&lt;h5&gt;css&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;/* utterance */
html[theme=&amp;quot;dark&amp;quot;] .utterance-light {
  display: none;
}

html[theme=&amp;quot;light&amp;quot;] .utterance-dark {
  display: none;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;display: none&lt;/code&gt; 속성을 부여하여 dark 테마일 경우엔 light utterances 테마가 보이지 않게 하고 light 테마일 경우 dark utterances 테마가 보이지 않게 합니다.&lt;/p&gt;
&lt;h3&gt;scrollbar&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;/* scrollbar */
html,
.skin_view .area_view pre code.hljs {
  scrollbar-width: thin;
  scrollbar-color: var(--color-a) var(--background-color-body);
}

.skin_view .area_view pre code.hljs::-webkit-scrollbar {
  background-color: var(--background-color-body);
  height: 6px;
}

body::-webkit-scrollbar {
  background-color: var(--background-color-body);
  width: 6px;
}

body::-webkit-scrollbar-thumb,
.skin_view .area_view pre code.hljs::-webkit-scrollbar-thumb {
  background-color: var(--color-a);
  border-radius: 6px;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;dark 테마와 light 테마에 맞게 scrollbar 또한 테마를 적용하였습니다.&lt;/p&gt;
&lt;h4&gt;firefox(gaeko)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;html,
.skin_view .area_view pre code.hljs {
  scrollbar-width: thin;
  scrollbar-color: var(--color-a) var(--background-color-body);
}

.skin_view .area_view pre code.hljs::-webkit-scrollbar {
  background-color: var(--background-color-body);
  height: 6px;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;영향을 받는 대상인 전체 화면을 의미하는 &lt;code&gt;html&lt;/code&gt;과 블로그 내 코드블럭코드 &lt;code&gt;.skin_view .area_view pre code.hljs&lt;/code&gt;를 기준으로&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/scrollbar-width&quot;&gt;scrollbar-width: thin&lt;/a&gt;으로 설정하여 스크롤바가 두껍지 않게 하여 가독성을 높여주도록 하고&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/scrollbar-color&quot;&gt;scrollbar-color: var(--color-a) var(--background-color-body)&lt;/a&gt;으로 설정하여 light, dark 테마에 따라서 firefox(gaeko) 브라우저에서 동작할 수 있도록 합니다.&lt;/p&gt;
&lt;h4&gt;chrome, safari, edge, etc...(webkit)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;body::-webkit-scrollbar {
  background-color: var(--background-color-body);
  width: 6px;
}

body::-webkit-scrollbar-thumb,
.skin_view .area_view pre code.hljs::-webkit-scrollbar-thumb {
  background-color: var(--color-a);
  border-radius: 6px;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;firefox(gaeko)와는 다르게 chrome, safari, edge 등 webkit 기반의 엔진을 기반으로 삼는 브라우저는 &lt;code&gt;html&lt;/code&gt;이 아닌 &lt;code&gt;body&lt;/code&gt; 태그를 중심으로 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/::-webkit-scrollbar&quot;&gt;::-webkit-scrollbar&lt;/a&gt; 선택자를 활용하여 &lt;code&gt;width: 6px&lt;/code&gt;, &lt;code&gt;background-color: var(--color-a)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;즉 &lt;strong&gt;전체 스크롤바&lt;/strong&gt;의 너비는 6px, 배경색상은 &lt;code&gt;var(--background-color-body)&lt;/code&gt;로 설정합니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;body&lt;/code&gt;뿐만이 아닌 &lt;code&gt;.skin_view .area_view pre code.hljs&lt;/code&gt;도 포함해 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/::-webkit-scrollbar&quot;&gt;::-webkit-scrollbar-thumb&lt;/a&gt; 선택자를 활용하여 &lt;code&gt;background-color: var(--color-a)&lt;/code&gt;, &lt;code&gt;border-radius: 6px&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;즉 &lt;strong&gt;스크롤 핸들&lt;/strong&gt;의 배경 색상을 &lt;code&gt;var(--color-a)&lt;/code&gt;로 설정하고, &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/border-radius&quot;&gt;border-radius&lt;/a&gt;를 6px로 설정해 꼭짓점을 6px 정도 둥글게 합니다.&lt;/p&gt;
&lt;h2&gt;theme.js&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const DARK = &amp;quot;dark&amp;quot;;
const LIGHT = &amp;quot;light&amp;quot;;
const THEME_KEY = &amp;quot;theme&amp;quot;;

const userTheme = sessionStorage.getItem(THEME_KEY);
const osTheme = window.matchMedia(&amp;quot;(prefers-color-scheme: light)&amp;quot;).matches
  ? LIGHT
  : DARK;

const getTheme = () =&amp;gt; {
  const Theme = userTheme ? userTheme : osTheme;
  return Theme;
};

const setTheme = (color) =&amp;gt; {
  sessionStorage.setItem(THEME_KEY, color);
  document.documentElement.setAttribute(THEME_KEY, color);
};

if (getTheme() === DARK) {
  setTheme(DARK);
} else {
  setTheme(LIGHT);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;페이지에 접속했을 때 light 테마와 dark 테마 중 &lt;strong&gt;컴퓨터나 사용자가 선호하는 색상 테마를 적용&lt;/strong&gt;하는 코드입니다.&lt;/p&gt;
&lt;h3&gt;자주 쓰이는 변수 선언&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const DARK = &amp;quot;dark&amp;quot;;
const LIGHT = &amp;quot;light&amp;quot;;
const THEME_KEY = &amp;quot;theme&amp;quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;dark&lt;/code&gt;, &lt;code&gt;light&lt;/code&gt;, &lt;code&gt;theme&lt;/code&gt;와 같은 자주 사용하는 단어들을 &lt;code&gt;DARK&lt;/code&gt;, &lt;code&gt;LIGHT&lt;/code&gt;, &lt;code&gt;THEME_KEY&lt;/code&gt;로 선언하여 코드를 적을 때 &lt;strong&gt;오타를 방지&lt;/strong&gt;합니다.&lt;/p&gt;
&lt;h3&gt;현재 설정된 theme 확인&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const userTheme = sessionStorage.getItem(THEME_KEY);
const osTheme = window.matchMedia(&amp;quot;(prefers-color-scheme: light)&amp;quot;).matches
  ? LIGHT
  : DARK;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;userTheme&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const userTheme = sessionStorage.getItem(THEME_KEY);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/Window/sessionStorage&quot;&gt;sessionStorage&lt;/a&gt;에 &lt;code&gt;THEME_KEY&lt;/code&gt; 즉 &lt;code&gt;&amp;quot;theme&amp;quot;&lt;/code&gt;에 저장된 값이 있는지 확인합니다. 그리고 그 값을 &lt;code&gt;userTheme&lt;/code&gt; 변수로 선언합니다.&lt;/p&gt;
&lt;h4&gt;osTheme&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const osTheme = window.matchMedia(&amp;quot;(prefers-color-scheme: light)&amp;quot;).matches
  ? LIGHT
  : DARK;&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;prefer-colors-scheme&lt;/h5&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/154646391-aa8d736c-b7a9-433d-8c52-8d342cbbc532.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/@media/prefers-color-scheme&quot;&gt;&amp;quot;(prefers-color-scheme: light)&amp;quot;&lt;/a&gt; css 요소를 통하여 현재 사용자가 시스템에 &lt;code&gt;light&lt;/code&gt; 테마를 사용하는 것을 선호하는지를 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/Window/matchMedia&quot;&gt;window.matchMedia().matches&lt;/a&gt;를 통해 확인합니다.&lt;/p&gt;
&lt;p&gt;dark 테마를 페이지의 기본 설정으로 할 것이므로 &lt;code&gt;prefers-color-scheme: light&lt;/code&gt;을 기준으로 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Conditional_Operator&quot;&gt;삼항연산자&lt;/a&gt;를 활용하여 &lt;code&gt;true&lt;/code&gt;라면 &lt;code&gt;LIGHT&lt;/code&gt; 즉 &lt;code&gt;&amp;quot;light&amp;quot;&lt;/code&gt;를,&lt;/p&gt;
&lt;p&gt;&lt;code&gt;false&lt;/code&gt;라면 &lt;code&gt;DARK&lt;/code&gt; 즉 &lt;code&gt;&amp;quot;dark&amp;quot;&lt;/code&gt;와 선호하는 테마가 없는 경우인 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/@media/prefers-color-scheme#no-preference&quot;&gt;no-preference&lt;/a&gt;을 &lt;code&gt;osTheme&lt;/code&gt;에 넣으며 변수로 선언합니다.&lt;/p&gt;
&lt;h3&gt;getTheme()&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const getTheme = () =&amp;gt; {
  const theme = userTheme ? userTheme : osTheme;
  return theme;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;삼항연산자를 활용하여 &lt;code&gt;theme&lt;/code&gt;을 기준으로 &lt;code&gt;userTheme&lt;/code&gt;이 참(true), 존재한다면 &lt;code&gt;userTheme&lt;/code&gt;을&lt;/p&gt;
&lt;p&gt;반대로 거짓(false), 존재하지 않는다면 &lt;code&gt;osTheme&lt;/code&gt;를 택하게 하여 &lt;code&gt;theme&lt;/code&gt; 변수를 선언합니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;getTheme()&lt;/code&gt;의 순환 과정을 자세히 정리하자면 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;처음 사이트에 들어오게 되어 &lt;code&gt;theme.js&lt;/code&gt;가 실행이 되어 &lt;code&gt;getTheme()&lt;/code&gt; 함수를 호출하면 &lt;code&gt;theme&lt;/code&gt; 값을 반환(return)하게 되는데 &lt;code&gt;sessionStorage&lt;/code&gt;의 키 값은 없어 &lt;code&gt;userTheme&lt;/code&gt; 값은 존재하지 않으므로 삼항연산자에 의하여 &lt;code&gt;theme = osTheme&lt;/code&gt;이 됩니다.&lt;/p&gt;
&lt;p&gt;블로그 내에 페이지를 이동하는 등 새로고침이 되었을 때 &lt;code&gt;sessionStorage&lt;/code&gt; 값은 존재하므로 &lt;code&gt;getTheme()&lt;/code&gt; 함수 내의 &lt;code&gt;theme = userTheme&lt;/code&gt;이 되어 &lt;code&gt;getTheme()&lt;/code&gt; 함수는 &lt;code&gt;userTheme&lt;/code&gt;을 반환하게 됩니다.&lt;/p&gt;
&lt;p&gt;페이지를 빠져 나갈 경우 session은 초기화가 됩니다.&lt;/p&gt;
&lt;h3&gt;setTheme()&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const setTheme = (color) =&amp;gt; {
  sessionStorage.setItem(THEME_KEY, color);
  document.documentElement.setAttribute(THEME_KEY, color);
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/Window/sessionStorage#%EC%98%88%EC%A0%9C&quot;&gt;sessionStorage.setItem&lt;/a&gt;을 통해 키 이름과 키 값을 &lt;code&gt;THEME_KEY&lt;/code&gt; 즉 &lt;code&gt;&amp;quot;theme&amp;quot;&lt;/code&gt;와 매개변수인 color로 초기화합니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/Document/documentElement&quot;&gt;document.documentElement&lt;/a&gt;가 가리키는 &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;태그에 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Element/setAttribute&quot;&gt;setAttribute&lt;/a&gt;을 통해 &lt;code&gt;THEME_KEY&lt;/code&gt; 즉 &lt;code&gt;theme&lt;/code&gt; 속성 이름과 &lt;code&gt;color&lt;/code&gt;라는 매개 변수로 값을 초기화합니다.&lt;/p&gt;
&lt;p&gt;함수를 사용할 때 &lt;code&gt;color&lt;/code&gt;라는 매개변수를 통해 &lt;code&gt;DARK&lt;/code&gt; 나 &lt;code&gt;LIGHT&lt;/code&gt;로 값을 입력합니다.&lt;/p&gt;
&lt;h3&gt;if else&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;if (getTheme() === DARK) {
  setTheme(DARK);
} else {
  setTheme(LIGHT);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;getTheme()&lt;/code&gt;가 &lt;code&gt;DARK&lt;/code&gt; 즉 &lt;code&gt;&amp;quot;dark&amp;quot;&lt;/code&gt;일 경우와 선호하는 테마가 없는 경우인 &lt;code&gt;no-preferece&lt;/code&gt;인 경우 &lt;code&gt;setTheme(DARK)&lt;/code&gt; 함수를 실행하고,&lt;/p&gt;
&lt;p&gt;반대로 &lt;code&gt;LIGHT&lt;/code&gt; 즉 &lt;code&gt;&amp;quot;lignt&amp;quot;&lt;/code&gt;일 경우 &lt;code&gt;setTheme(LIGNT)&lt;/code&gt; 함수를 실행합니다.&lt;/p&gt;
&lt;h2&gt;theme toggle에 해당하는 html&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;!--toggle button--&amp;gt;
&amp;lt;label class=&amp;quot;switch-button&amp;quot;&amp;gt;
  &amp;lt;input class=&amp;quot;check&amp;quot; type=&amp;quot;checkbox&amp;quot; /&amp;gt;
  &amp;lt;span class=&amp;quot;onoff-switch&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/label&amp;gt;
&amp;lt;!--toggle button--&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTML/Element/label&quot;&gt;label&lt;/a&gt; 태그를 통해 토글 버튼 관련 항목의 공간을 만듭니다. 그 안에 &lt;code&gt;checkbox&lt;/code&gt; type의 &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;, 그리고 토글 버튼의 역활을 하는 &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; 태그를 추가합니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt; 태그의 특성에 의해서 &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt; 태그 안에 있는 부분에 이벤트가 발생하였을 때 &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; 태그에 이벤트가 발생한 것과 같은 효과를 볼 수 있습니다.&lt;/p&gt;
&lt;h2&gt;theme-toggle.css&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;.switch-button {
  position: relative;
  display: inline-block;
  width: 56px;
  height: 38px;
  bottom: 5.22px;
  margin: 0 2px;
}

.switch-button input {
  opacity: 0;
}

.onoff-switch {
  position: absolute;
  cursor: pointer;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  border-radius: 20px;
  background-color: #ddd;
  -webkit-transition: 0.4s;
  transition: 0.4s;
}

.onoff-switch::before {
  position: absolute;
  content: &amp;quot;&amp;quot;;
  height: 24px;
  width: 22px;
  top: 7px;
  left: 4px;
  border-radius: 20px;
  background-color: #fff;
  -webkit-transition: 0.5s;
  transition: 0.5s;
}

.switch-button input:checked + .onoff-switch {
  background-color: #238636;
}

.switch-button input:checked + .onoff-switch::before {
  -webkit-transform: translateX(26px);
  -ms-transform: translateX(26px);
  transform: translateX(26px);
}

@media only screen and (max-width: 820px) {
  .switch-button {
    margin: 21px 0 -6px 15px;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;theme에 대한 toggle 버튼에 관한 css입니다.&lt;/p&gt;
&lt;h3&gt;.swich-button input&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;.switch-button input {
  opacity: 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/opacity&quot;&gt;opacity: 0&lt;/a&gt; 을 통해서 checkbox가 표시되지 않게 합니다.&lt;/p&gt;
&lt;h3&gt;.onoff-switch&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;.onoff-switch {
  position: absolute;
  cursor: pointer;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  border-radius: 20px;
  background-color: #ddd;
  -webkit-transition: 0.4s;
  transition: 0.4s;
}

.switch-button input:checked + .onoff-switch {
  background-color: #238636;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;-webkit-transition: 0.4s&lt;/code&gt;, &lt;code&gt;transition: 0.4s&lt;/code&gt;을 통해 &lt;code&gt;input&lt;/code&gt;이 &lt;code&gt;checked&lt;/code&gt; 즉 체크박스가 체크가 된 경우 토글 버튼의 바탕화면 색상이 &lt;code&gt;#ddd&lt;/code&gt;에서 &lt;code&gt;#238636&lt;/code&gt;으로 바뀔 때 0.4초가 걸리는 효과를 줍니다.&lt;/p&gt;
&lt;h3&gt;.onoff-switch::before&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;.onoff-switch::before {
  position: absolute;
  content: &amp;quot;&amp;quot;;
  height: 24px;
  width: 22px;
  top: 7px;
  left: 4px;
  border-radius: 20px;
  background-color: #fff;
  -webkit-transition: 0.5s;
  transition: 0.5s;
}

.switch-button input:checked + .onoff-switch::before {
  -webkit-transform: translateX(26px);
  -ms-transform: translateX(26px);
  transform: translateX(26px);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;마찬가지로 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/@media/-webkit-transition&quot;&gt;-webkit-transition: 0.5s&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/transition&quot;&gt;transition: 0.5s&lt;/a&gt;을 통해 &lt;code&gt;switch-button&lt;/code&gt; class의 &lt;code&gt;input&lt;/code&gt;이 &lt;code&gt;checked&lt;/code&gt; 즉 체크박스가 체크가 된 경우 토글 버튼의 위치가 &lt;code&gt;-webkit-transform: translateX(26px)&lt;/code&gt;, &lt;code&gt;-ms-transform: translateX(26px)&lt;/code&gt;, &lt;code&gt;transform: translateX(26px)&lt;/code&gt;에 의해서 26px만큼 우로 이동하고 이동 할 때 0.5초가 걸리는 효과를 줍니다.&lt;/p&gt;
&lt;h3&gt;@media&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;@media only screen and (max-width: 820px) {
  .switch-button {
    margin: 21px 0 -6px 15px;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/max-width&quot;&gt;max-width: 820px&lt;/a&gt;으로 820px로 최대 너비를 설정하여 모바일 환경에서의 토글 버튼의 위치를 설정합니다.&lt;/p&gt;
&lt;h2&gt;themeToggle.js&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const checkbox = document.querySelector(&amp;quot;.check&amp;quot;);

const themeToggle = (event) =&amp;gt; {
  if (event.target.checked) {
    setTheme(DARK);
  } else {
    setTheme(LIGHT);
  }
};

checkbox.addEventListener(&amp;quot;click&amp;quot;, themeToggle);

if (getTheme() === DARK) {
  checkbox.setAttribute(&amp;quot;checked&amp;quot;, &amp;quot;&amp;quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;theme에 관한 toggle 버튼에 대한 js 코드 설명입니다.&lt;/p&gt;
&lt;h3&gt;checkbox&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const checkbox = document.querySelector(&amp;quot;.check&amp;quot;);

checkbox.addEventListener(&amp;quot;click&amp;quot;, themeToggle);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;check&lt;/code&gt; 클래스가 포함된 태그를 선택하여 &lt;code&gt;checkbox&lt;/code&gt;로 선언합니다. 그리고 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/EventTarget/addEventListener&quot;&gt;addEventListener()&lt;/a&gt; 메서드를 통해서 &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/Events#%EB%A7%88%EC%9A%B0%EC%8A%A4_%EC%9D%B4%EB%B2%A4%ED%8A%B8&quot;&gt;click&lt;/a&gt; 이벤트 발생 시 &lt;code&gt;themeToggle&lt;/code&gt; 함수를 실행하도록 합니다.&lt;/p&gt;
&lt;h3&gt;themeToggle()&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const themeToggle = (event) =&amp;gt; {
  if (event.target.checked) {
    setTheme(DARK);
  } else {
    setTheme(LIGHT);
  }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;toggle 버튼에 관한 함수입니다. &lt;code&gt;event&lt;/code&gt; 매개변수를 통하여 &lt;code&gt;event.target.checked&lt;/code&gt; 즉 html 코드가 &lt;code&gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; checked&amp;gt;&lt;/code&gt;라면 &lt;code&gt;setTheme(DARK)&lt;/code&gt;를&lt;/p&gt;
&lt;p&gt;반대로 &lt;code&gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot;&amp;gt;&lt;/code&gt;라면 &lt;code&gt;setTheme(LIGHT)&lt;/code&gt;를 호출하도록 합니다.&lt;/p&gt;
&lt;h3&gt;if&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;if (getTheme() === DARK) {
  checkbox.setAttribute(&amp;quot;checked&amp;quot;, &amp;quot;&amp;quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;getTheme()&lt;/code&gt;가 &lt;code&gt;DARK&lt;/code&gt; 즉 &lt;code&gt;&amp;quot;dark&amp;quot;&lt;/code&gt;일 경우와 선호하는 테마가 없는 경우인 &lt;code&gt;no-preferece&lt;/code&gt;인 경우 토글은 &lt;code&gt;checked&lt;/code&gt;가 되게 합니다.&lt;/p&gt;
&lt;h2&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://fe-developers.kakaoent.com/2021/211118-dark-mode/&quot;&gt;https://fe-developers.kakaoent.com/2021/211118-dark-mode/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@juxgsiroo/darkmode&quot;&gt;https://velog.io/@juxgsiroo/darkmode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ordinary-code.tistory.com/53&quot;&gt;https://ordinary-code.tistory.com/53&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devcecy.com/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%A0%8C%EB%8D%94%EB%A7%81-%EB%90%A0%EA%B9%8C/&quot;&gt;https://devcecy.com/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%A0%8C%EB%8D%94%EB%A7%81-%EB%90%A0%EA%B9%8C/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>JavaScript</category>
      <category>CSS</category>
      <category>HTML</category>
      <category>Javascript</category>
      <category>theme toggle</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/76</guid>
      <comments>https://sukvvon.tistory.com/76#entry76comment</comments>
      <pubDate>Tue, 22 Feb 2022 23:20:04 +0900</pubDate>
    </item>
    <item>
      <title>[React] React에서 Firebase 연동 오류 해결하기(v8 -&amp;gt; v9)</title>
      <link>https://sukvvon.tistory.com/75</link>
      <description>&lt;h2&gt;firebase 연동 오류&lt;/h2&gt;
&lt;h3&gt;오류 발생 코드&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gw13gql0ggj30dn09nmxx.jpg&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;import firebase from &amp;quot;firebase/app&amp;quot;;
import &amp;#39;firebase/auth&amp;#39;;

const firebaseConfig = {
  apiKey: process.env.REACT_APP_APT_KEY,
  authDomain: process.env.REACT_APP_AUTH_DOMAIN,
  projectId: process.env.REACT_APP_PROJECT_ID,
  storageBucket: process.env.REACT_APP_STORAGE_BUCKET,
  messagingSenderId: process.env.REACT_APP_MESSAGING_SENDER_ID,
  appId: process.env.REACT_APP_APP_ID
};

firebase.initializeApp(firebaseConfig);

export const authService = firebase.auth();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;노마드코더의 &lt;a href=&quot;https://nomadcoders.co/nwitter&quot;&gt;클론코딩 트위터(nwitter)&lt;/a&gt; 책을 보면서 공부를 하다가 React 기반의 환경에서 firebase를 연동하는 과정이 있었는데 정상적으로 진행이 되지 않았습니다. 혹시 실수를 해 오타가 존재하나 살펴보았더니 그런 부분은 존재하지 않았습니다.&lt;/p&gt;
&lt;h3&gt;Failed to compile&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gw13nnm8xkj30in03ojrg.jpg&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;./src/fbase.js
Attempted import error: &amp;#39;firebase/app&amp;#39; does not contain a default export (imported as &amp;#39;firebase&amp;#39;).&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Failed to compile&lt;/code&gt;을 살펴보자면 &lt;code&gt;firebase/app&lt;/code&gt; 은 &lt;code&gt;firebase&lt;/code&gt; 라는 명칭으로 export 할 수가 없다는 것이었습니다.&lt;/p&gt;
&lt;h2&gt;해결 방안 탐색&lt;/h2&gt;
&lt;h3&gt;Nomad corders&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
&lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gw1vph79khj30mv0vzwi8.jpg&quot;&gt;
&lt;/p&gt;

&lt;p&gt;다행히 &lt;a href=&quot;https://nomadcoders.co/nwitter/lectures/1908/issues/1792&quot;&gt;nwitter - React + Firebase Setup(issue)&lt;/a&gt;에서 해결방안을 찾을 수 있었습니다. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import firebase from &amp;#39;firebase/compat/app&amp;#39;;
import &amp;#39;firebase/compat/auth&amp;#39;;
import &amp;#39;firebase/compat/firestore&amp;#39;;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/serranoarevalo&quot;&gt;serranoarevalo&lt;/a&gt; 님께선 v9을 사용하고 있으니 위와 같은 코드로 기존에 있던 코드에서 사이에 &lt;code&gt;compat&lt;/code&gt; 를 추가하라고 코멘트를 남기셨습니다.&lt;/p&gt;
&lt;h3&gt;firebase 공식 홈페이지&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
&lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gw1x7pflrdj30m00dfwfo.jpg&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// Before: version 8
import firebase from &amp;#39;firebase/app&amp;#39;;
import &amp;#39;firebase/auth&amp;#39;;
import &amp;#39;firebase/firestore&amp;#39;;

// After: version 9 compat
// v9 compat packages are API compatible with v8 code
import firebase from &amp;#39;firebase/compat/app&amp;#39;;
import &amp;#39;firebase/compat/auth&amp;#39;;
import &amp;#39;firebase/compat/firestore&amp;#39;;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;In order to keep your code functioning after updating your dependency from v8 to v9 beta, change your import statements to use the &amp;quot;compat&amp;quot; version of each import. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;더 나아가 공식적으로 알기 위해 &lt;a href=&quot;https://firebase.google.com/docs/web/modular-upgrade?hl=en&amp;amp;authuser=0#update_imports_to_v9_compat&quot;&gt;firebase Update imports to v9 compat&lt;/a&gt;를 접속했더니 v8에서 v9으로 업데이트를 한 경우 import를 할 때 &lt;code&gt;compat&lt;/code&gt; 를 사용해야한다고 명시하고 있었습니다.&lt;/p&gt;
&lt;h2&gt;firebase 연동 완료&lt;/h2&gt;
&lt;h3&gt;코드 수정&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
&lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gw11r4vjuyj30dx0a5my1.jpg&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;import firebase from &amp;quot;firebase/compat/app&amp;quot;;
import &amp;#39;firebase/compat/auth&amp;#39;;
import &amp;#39;firebase/compat/firestore&amp;#39;;

const firebaseConfig = {
  apiKey: process.env.REACT_APP_APT_KEY,
  authDomain: process.env.REACT_APP_AUTH_DOMAIN,
  projectId: process.env.REACT_APP_PROJECT_ID,
  storageBucket: process.env.REACT_APP_STORAGE_BUCKET,
  messagingSenderId: process.env.REACT_APP_MESSAGING_SENDER_ID,
  appId: process.env.REACT_APP_APP_ID
};

export default firebase.initializeApp(firebaseConfig);

export const authService = firebase.auth();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;nomad corders의 &lt;a href=&quot;https://github.com/serranoarevalo&quot;&gt;serranoarevalo&lt;/a&gt; 그리고 &lt;a href=&quot;https://nomadcoders.co/nwitter/lectures/1908/issues/1792&quot;&gt;nwitter - React + Firebase Setup(issue)&lt;/a&gt;에서 설명한대로 수정을 하고 &lt;code&gt;npm run start&lt;/code&gt; 를 하였습니다.&lt;/p&gt;
&lt;h3&gt;결과&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
&lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gw13au19tsj30do0a4q3p.jpg&quot;&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
&lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gw13czviotj30w10u0777.jpg&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;console.log(authService.currentUser);&lt;/code&gt; 의 결과대로 다행히 &lt;code&gt;null&lt;/code&gt; 값이 출력되어 정상적으로 실행되는 것을 확인할 수 있었습니다.&lt;/p&gt;
&lt;h2&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://firebase.google.com/docs/web/modular-upgrade?hl=en&amp;amp;authuser=0#update_imports_to_v9_compat&quot;&gt;firebase Update imports to v9 compat&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://nomadcoders.co/nwitter/lectures/1908/issues/1792&quot;&gt;nwitter - React + Firebase Setup(issue)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>React</category>
      <category>Firebase</category>
      <category>react</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/75</guid>
      <comments>https://sukvvon.tistory.com/75#entry75comment</comments>
      <pubDate>Wed, 3 Nov 2021 19:55:36 +0900</pubDate>
    </item>
    <item>
      <title>Tistory 블로그에 github-markdown-css 적용하기</title>
      <link>https://sukvvon.tistory.com/74</link>
      <description>&lt;h2&gt;적용하게 된 계기&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvznmg4ojzj30oa183dki.jpg&quot;&gt;
&lt;/p&gt;

&lt;p&gt;Tistory 플랫폼을 이용하면서 markdown 문법을 이용하여 포스팅을 합니다. 하지만 뭔가 필자에겐 tistory 블로그에서 기존에 제공해주는 css가 부자연스럽고 가독성을 해친다는 생각이 들었습니다. 그리하여 수정을 해야겠다는 생각을 하였습니다.&lt;/p&gt;
&lt;p&gt;직접 css 파일을 수정할 수 있지만 더 쉽고 간단하게 편하게 적용할 수 있는 방법이 뭐가 있을까 생각을  하였더니 github-markdown-css 프로젝트를 알게 되었습니다. github를 이용하는 필자에게도 매우 친숙한 css 스타일이기에 최종적으로 github-markdown-css 양식을 tistory 블로그에 적용하기로 마음을 먹었습니다.  &lt;/p&gt;
&lt;h2&gt;github-markdown-css&lt;/h2&gt;
&lt;h3&gt;GitHub 사이트 접속&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvx4o9mqgwj30vr0nitc5.jpg&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/sindresorhus/github-markdown-css&quot;&gt;github-markdown-css&lt;/a&gt; 에 접속합니다.&lt;/p&gt;
&lt;h3&gt;CDNJS 접속&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvx4q5j15sj30m80kxq4b.jpg&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install github-markdown-css&lt;/code&gt; 를 작성하여 node의 node package manager를 활용하여 이 github-markdown-css 를 활용할 수 있고 CDNJS를 이용하여 link를 걸 수도 있습니다. &lt;/p&gt;
&lt;p&gt;필자는 기존에 있던 html 양식에 link를 걸어 불러올 것이기 때문에 CDNJS를 활용할 것입니다. 그러므로 &lt;a href=&quot;https://cdnjs.com/libraries/github-markdown-css&quot;&gt;CDNJS&lt;/a&gt;를 클릭합니다.&lt;/p&gt;
&lt;h3&gt;CDNJS 선택&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvznmg4ojzj30oa183dki.jpg&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.0.0/github-markdown-light.min.css&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt; &lt;code&gt;github-markdown-light.min.css&lt;/code&gt; 가 포함되어 있는 cdnjs를 선택합니다. 필자는 light 테마를 사용할 예정이어서 light 테마를 선택했지만 dark 테마 사용을 원하신다면 &lt;code&gt;github-markdown-dark.min.css&lt;/code&gt; 를 사용하시면 됩니다. &lt;/p&gt;
&lt;p&gt;Tistory의 HTML에 적용할 예정입니다.&lt;/p&gt;
&lt;h3&gt;.markdown-body&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvzmjfde8lj30m70iotag.jpg&quot;&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Import the &lt;code&gt;github-markdown.css&lt;/code&gt; file and add a &lt;code&gt;markdown-body&lt;/code&gt; class to the container of your rendered Markdown and set a width for it. GitHub uses &lt;code&gt;980px&lt;/code&gt; width and &lt;code&gt;45px&lt;/code&gt; padding, and &lt;code&gt;15px&lt;/code&gt; padding for mobile.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;cdnjs 링크를 적용한다고 github-markdown-css를 사용할 수 있는 것이 아닙니다. markdown-body 클래스 또한 적용해야지만 사용할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;.markdown-body {
        box-sizing: border-box;
        min-width: 200px;
        max-width: 980px;
        margin: 0 auto;
        padding: 45px;
    }

    @media (max-width: 767px) {
        .markdown-body {
            padding: 15px;
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위의 코드를 tistory 블로그 css에 삽입을 할 예정입니다.&lt;/p&gt;
&lt;h2&gt;Tistory 블로그에 적용&lt;/h2&gt;
&lt;h3&gt;꾸미기 -&amp;gt; 스킨 편집&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvzmn8klvij306105o0sm.jpg&quot;&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tistory 블로그를 예시로 설명합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;사용자의 티스토리 블로그의 관리에서 &lt;strong&gt;꾸미기&lt;/strong&gt;의 &lt;strong&gt;스킨 편집&lt;/strong&gt;을 클릭합니다.&lt;/p&gt;
&lt;h3&gt;html 편집&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvzmn7v250j30ge0743ys.jpg&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;html 편집&lt;/strong&gt;을 클릭합니다.&lt;/p&gt;
&lt;h3&gt;CDNJS 삽입&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvzmsi39ljj30ib0evtbe.jpg&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.0.0/github-markdown-light.min.css&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같은 코드를 &lt;strong&gt;HTML&lt;/strong&gt;에 삽입합니다.&lt;/p&gt;
&lt;h3&gt;markdown-body 삽입&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvzn99miyqj30io08s74o.jpg&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;.markdown-body {
        box-sizing: border-box;
        min-width: 200px;
        max-width: 980px;
        margin: 0 auto;
        padding: 0px;
    }

    @media (max-width: 767px) {
        .markdown-body {
            padding: 15px;
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;CSS&lt;/strong&gt;에 markdown-body 클래스를 삽입합니다. 필자는 &lt;u&gt;공간을 전부 활용&lt;/u&gt;하기를 원하기 때문에 padding: 45px가 아닌 0px으로 수정하여 적용하였습니다.&lt;/p&gt;
&lt;h3&gt;markdown-body 적용&lt;/h3&gt;
&lt;h4&gt;마크다운에서 글 작성 후 완성 X&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvznwziwerj30vp0m7mzn.jpg&quot;&gt;
&lt;/p&gt;

&lt;p&gt;기존처럼 &lt;strong&gt;마크다운&lt;/strong&gt;에서 작성한 글을 그대로 완성하는 것이 아닌&lt;/p&gt;
&lt;h4&gt;마크다운 -&amp;gt; HTML&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvznxwugupj30vs0c8q44.jpg&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvzo15fw0lj30vq0bj3za.jpg&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;div class=&amp;quot;markdown-body&amp;quot;&amp;gt;
  . 
  .
  .
  .
  .
  .
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;HTML&lt;/strong&gt; 로 이동하여 &lt;u&gt;첫 번째 줄&lt;/u&gt;에 &lt;code&gt;&amp;lt;div class=&amp;quot;markdown-body&amp;quot;&amp;gt;&lt;/code&gt; 그리고 &lt;u&gt;마지막 줄&lt;/u&gt;에 &lt;code&gt;&amp;lt;/div&amp;gt;&lt;/code&gt; 를 작성합니다.&lt;/p&gt;
&lt;h2&gt;결과&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvznmq31ovj30oa183dki.jpg&quot;&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;before&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvznulrpggj30oe18ntdi.jpg&quot;&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;after&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;기존 티스토리 스킨인 &lt;strong&gt;#1&lt;/strong&gt;에서 제공했던 css와 비교를 해 보니 다음과 같이 github-markdown-css가 적용되어 전보다 가독성이 좋아진 것을 확인 할 수 있습니다.&lt;/p&gt;</description>
      <category>Etc</category>
      <category>github-markdown-css</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/74</guid>
      <comments>https://sukvvon.tistory.com/74#entry74comment</comments>
      <pubDate>Mon, 1 Nov 2021 16:47:45 +0900</pubDate>
    </item>
    <item>
      <title>블로그에 코드 하이라이트 적용하기(highlight.js)</title>
      <link>https://sukvvon.tistory.com/73</link>
      <description>&lt;h2&gt;수동으로 적용하게 된 계기&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvsz9ugi6cj30pp0g8ta9.jpg&quot;&gt;
&lt;/p&gt;

&lt;p&gt;포스팅을 하면서 github-markdown.css를 활용하여 작성을 해 오고, syntax highlight는 tistory에서 제공하는 플러그인을 활용하였습니다. &lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvszxegd23j30ng0hajt1.jpg&quot;&gt;
&lt;/p&gt;

&lt;p&gt;하지만 블로그 테마를 &lt;strong&gt;Book Club&lt;/strong&gt;에서 &lt;strong&gt;#1&lt;/strong&gt;으로 변경하니 syntax highlight의 첫 줄에서 공백이 일어나는 현상이 발생했습니다. &lt;/p&gt;
&lt;p&gt;기술 블로그를 운영하는 입장에서 code highlight는 매우 중요한 요소이므로 자동으로 적용이 잘 되지 않는 이 현상을 &lt;u&gt;수동으로 적용&lt;/u&gt;시켜 해결하고, 기본적으로 tistory에서 제공하는 것 외에 다양한 syntax highlight을 선택해 적용해야겠다고 생각하였습니다.&lt;/p&gt;
&lt;h2&gt;highlight.js 설정&lt;/h2&gt;
&lt;h3&gt;highlight.org 접속&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvt0bu5kb9j305k05kdfp.jpg&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://highlightjs.org/&quot;&gt;highlight.org&lt;/a&gt; 공식사이트로 이동합니다.&lt;/p&gt;
&lt;h3&gt;Get version 11.3.1&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvt0ez0in0j30p10gm0ud.jpg&quot;&gt;
&lt;/p&gt;

&lt;p&gt;현재 가장 최신 버전인 &lt;code&gt;Get version 11.3.1&lt;/code&gt; 버튼을 클릭합니다.&lt;/p&gt;
&lt;h3&gt;con.js 코드 복사&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvt0ght1fqj30pw0ooq61.jpg&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.3.1/styles/default.min.css&amp;quot;&amp;gt;
&amp;lt;script src=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.3.1/highlight.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;cdnjs&lt;/code&gt;, &lt;code&gt;jsdelivr&lt;/code&gt;, &lt;code&gt;uppkg&lt;/code&gt;이렇게 3가지 방법이 있지만 &lt;code&gt;cdnjs&lt;/code&gt; 를 활용할 것이므로 &lt;code&gt;cdnjs&lt;/code&gt; 코드를 복사합니다. &lt;/p&gt;
&lt;p&gt;하지만 이 코드만 있다고 실행이 되는 것이 아닙니다. 링크를 받아오기만 한 것이므로 이 코드를 실행시기기 위한 javaScript 코드 또한 필요합니다.&lt;/p&gt;
&lt;h3&gt;highlight.js GitHub 접속&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvt0pk6ijbj30nh0jejt6.jpg&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/highlightjs&quot;&gt;highlight.js&lt;/a&gt; GitHub 사이트에 접속한 후 &lt;code&gt;highlight.js&lt;/code&gt; repository에 접속합니다.&lt;/p&gt;
&lt;h3&gt;highlightAll()&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvu59qpq7vj30me0cegn2.jpg&quot;&gt;
&lt;/p&gt;

&lt;p&gt;repository를 접속한 후 하단으로 화면을 내리다보면 &lt;code&gt;Basic Usage&lt;/code&gt; 가 나옵니다. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The bare minimum for using highlight.js on a web page is linking to the library along with one of the themes and calling &lt;a href=&quot;http://highlightjs.readthedocs.io/en/latest/api.html#highlightall&quot;&gt;&lt;code&gt;highlightAll&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;웹 페이지에서 highlight.js을 사용하려면 &lt;code&gt;highlightAll&lt;/code&gt; 코드를 사용해야한다고 명시하고 있습니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This will find and highlight code inside of &lt;code&gt;&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&lt;/code&gt; tags; it tries to detect the language automatically. If automatic detection doesn’t work for you, or you simply prefer to be explicit, you can specify the language manually in the using the &lt;code&gt;class&lt;/code&gt; attribute:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&lt;/code&gt; 태그 안의 hightlight code를 찾아주고 자동으로 언어를 감지하여 설정해주고 만약 적용되지 않았다면 사용자가 원하는 언어를 &lt;code&gt;class&lt;/code&gt; 속성에 추가를 하면 된다고 합니다.&lt;/p&gt;
&lt;h3&gt;highlight.js 코드 완성&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.3.1/styles/default.min.css&amp;quot;&amp;gt;
&amp;lt;script src=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.3.1/highlight.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;hljs.highlightAll();&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://highlightjs.org/download/&quot;&gt;highlight.org&lt;/a&gt;의 복사한 cdnjs 코드를 실행시키기 위해서  &lt;code&gt;&amp;lt;script&amp;gt;hljs.highlightAll();&amp;lt;/script&amp;gt;&lt;/code&gt; 를 추가하여 위와 같은 형태의 코드를 만듭니다.&lt;/p&gt;
&lt;h3&gt;사용자가 원하는 css 선택&lt;/h3&gt;
&lt;h4&gt;highlight.js -&amp;gt; src -&amp;gt; styles&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvu7yfcearj30mh0hwdhw.jpg&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;src&lt;/code&gt; 파일을 클릭합니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvu80i5659j30mm0gogn5.jpg&quot;&gt;
&lt;/p&gt;

&lt;p&gt;그리고 &lt;code&gt;styles&lt;/code&gt; 파일을 클릭합니다.&lt;/p&gt;
&lt;h4&gt;css 파일 종류 파악&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvu81hp2r4j30vn0kkn05.jpg&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvu86a0divj30vk0lotbp.jpg&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/highlightjs/highlight.js/tree/main/src/styles&quot;&gt;highlight.js/src/styles/&lt;/a&gt; 혹은 &lt;a href=&quot;https://github.com/highlightjs/highlight.js/tree/main/src/styles/base16&quot;&gt;highlight.js/src/styles/base16&lt;/a&gt; 에서 다양한 css 파일들을 볼 수 있습니다. &lt;/p&gt;
&lt;h2&gt;블로그에 highlight.js 적용&lt;/h2&gt;
&lt;h3&gt;css 바꾸는 예시&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.3.1/styles/default.min.css&amp;quot;&amp;gt;
&amp;lt;script src=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.3.1/highlight.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;hljs.highlightAll();&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같은 코드에서 css가 &lt;code&gt;default&lt;/code&gt; 로 되어있습니다. 기본 설정을 사용하는 것이 아니기 때문에 css를 바꿔서 적용을 하여야 합니다. &lt;/p&gt;
&lt;p&gt;적용을 할 때 GitHub에 올라와 있는 파일명이 default.css 파일이더라도 코드에 작성을 할 땐 &lt;u&gt;min을 추가하여서 default.min.css 라고 써야 합니다.&lt;/u&gt;&lt;/p&gt;
&lt;h4&gt;&lt;a href=&quot;https://github.com/highlightjs/highlight.js/tree/main/src/styles&quot;&gt;highlight.js/src/styles/&lt;/a&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.3.1/styles/vs.min.css&amp;quot;&amp;gt;
&amp;lt;script src=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.3.1/highlight.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;hljs.highlightAll();&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;vs.css를 적용하는 예시입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;앞에서 보았던 &lt;a href=&quot;https://github.com/highlightjs/highlight.js/tree/main/src/styles&quot;&gt;highlight.js/src/styles/&lt;/a&gt; 에서 사용자가 원하는 css를 선택해 &lt;code&gt;styles/default.min.css&lt;/code&gt; 라고 되어있는 부분을 예를 들어 &lt;code&gt;styles/vs.min.css&lt;/code&gt; 로 바꿉니다.&lt;/p&gt;
&lt;h4&gt;&lt;a href=&quot;https://github.com/highlightjs/highlight.js/tree/main/src/styles/base16&quot;&gt;highlight.js/src/styles/base16&lt;/a&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.3.1/styles/base16/github.min.css&amp;quot;&amp;gt;
&amp;lt;script src=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.3.1/highlight.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;hljs.highlightAll();&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;base16/github.css를 적용하는 예시입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;마찬가지로 &lt;a href=&quot;https://github.com/highlightjs/highlight.js/tree/main/src/styles/base16&quot;&gt;highlight.js/src/styles/base16&lt;/a&gt; 에서 사용자가 원하는 css 파일을 적용하고 싶다면  &lt;code&gt;styles/default.min.css&lt;/code&gt; 라고 되어있는 부분을 예를 들어 &lt;code&gt;styles/base16/github.min.css&lt;/code&gt; 로 바꿉니다.&lt;/p&gt;
&lt;p&gt;필자는 &lt;code&gt;base16/github.css&lt;/code&gt; 를 선택했습니다.&lt;/p&gt;
&lt;h3&gt;꾸미기 -&amp;gt; 스킨 편집&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvusjk7s81j306105o0sm.jpg&quot;&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tistory 블로그를 예시로 설명합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;사용자의 티스토리 블로그의 관리에서 &lt;strong&gt;꾸미기&lt;/strong&gt;의 &lt;strong&gt;스킨 편집&lt;/strong&gt;을 클릭합니다.&lt;/p&gt;
&lt;h3&gt;html 편집&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvusjl0quoj30ge07474k.jpg&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;html 편집&lt;/strong&gt;을 클릭합니다.&lt;/p&gt;
&lt;h3&gt;highlight.js script 삽입&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvusn57cerj30gp0gzju4.jpg&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.3.1/styles/base16/github.min.css&amp;quot;&amp;gt;
&amp;lt;script src=&amp;quot;//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.3.1/highlight.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;hljs.highlightAll();&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;HTML&lt;/strong&gt; 내에 삽입을 합니다. 그리고 적용 버튼을 누릅니다.&lt;/p&gt;
&lt;h2&gt;결과&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gvut97no71j30nh0j2abx.jpg&quot;&gt;
&lt;/p&gt;

&lt;p&gt;초반에 발생 했던 들여쓰기 즉 공백 현상이 일어나지 않고 잘 적용된 모습을 볼 수 있습니다.&lt;/p&gt;</description>
      <category>Etc</category>
      <category>highlight.js</category>
      <category>블로그</category>
      <category>코드 하이라이트</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/73</guid>
      <comments>https://sukvvon.tistory.com/73#entry73comment</comments>
      <pubDate>Thu, 28 Oct 2021 12:27:16 +0900</pubDate>
    </item>
    <item>
      <title>블로그에 GitHub 댓글 적용하기(utterances)</title>
      <link>https://sukvvon.tistory.com/72</link>
      <description>&lt;h2&gt;utterances를 적용하게 된 계기&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/24/h61YesSAqT5xjZl.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://utteranc.es/&quot;&gt;이미지 출처:  utterances&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;여러 개발자들의 기술 블로그들을 보니 댓글창이 저와 다르다는 것을 느꼈습니다. 타 플랫폼의 기술 블로그라면 그려려니 했지만 같은 티스토리 기반의 기술 블로그여도 기본 댓글창을 사용하는 것이 아닌 GitHub와 관련된 어떤 무언가를 쓰는 것 같다고 생각했습니다. &lt;/p&gt;
&lt;p&gt;대다수의 기술 블로그 개발자분들이 &lt;a href=&quot;https://utteranc.es/&quot;&gt;utterances&lt;/a&gt;를 쓴다는 것을 알아냈습니다. 또한 이 utterances가 markdown 형식까지 지원한다고 하여 코멘트를 하더라도 markdown 형식으로 하면 틀에 억압되지 않고 좀 더 편하게 표현하며 소통할 수 있겠다고 생각하여 기존의 티스토리 기본 댓글을 비활성화하고 utterances을 적용하자는 생각을 했습니다. &lt;/p&gt;
&lt;h2&gt;GitHub에 repository 생성&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/22/SQjyEiet5UITrWh.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;보통 생성을 할 때 &lt;code&gt;blog-comments&lt;/code&gt; 라는 이름으로 생성을 많이 하십니다. 필자는 낙타법 표기가 편하여서 낙타법으로 생성하였습니다. 이렇게 꼭 지정된 이름이 아니고 각자 &lt;u&gt;자신이 원하는 임의의 이름&lt;/u&gt;을 짓습니다.&lt;/p&gt;
&lt;h2&gt;Repository에 utterance.json 파일 생성&lt;/h2&gt;
&lt;h3&gt;creating a new file&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/22/pn5bQftXud9JryZ.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;Repository를 생성하면 위의 이미지와 같은 화면이 바로 처음에 보입니다. 여기서 &lt;code&gt;creating a new file&lt;/code&gt; 을 클릭합니다. &lt;/p&gt;
&lt;h3&gt;utterances.json&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/22/IvPonuAxbwa6qyF.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;origins&amp;quot;: [&amp;quot;https://sukvvon.tistory.com&amp;quot;]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;utterance.json&lt;/code&gt; 파일이라고 이름을 짓고, 위의 코드를 내용에 기입합니다. 그리고 &lt;code&gt;Commit new file&lt;/code&gt; 버튼을 클릭하여 파일을 생성합니다.&lt;/p&gt;
&lt;h2&gt;Repository에 utterances 설치&lt;/h2&gt;
&lt;h3&gt;utterances 설치&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/22/zOc4VqpETdBibIt.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/apps/utterances&quot;&gt;github.com/apps/utterances&lt;/a&gt; 로 이동하여 utterance를 설치하는 &lt;code&gt;install&lt;/code&gt; 버튼을 클릭합니다.&lt;/p&gt;
&lt;h3&gt;Only select repositories&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/22/8zr1mfTZEOXFjkP.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;utterances를 설치하는데 All repositorty가 아닌 &lt;strong&gt;Only select reposotories&lt;/strong&gt;를 선택해 필자 기준 생성한 repository인 &lt;strong&gt;sukvvon/blogComments&lt;/strong&gt;만 해당되게 합니다.&lt;/p&gt;
&lt;h2&gt;utterances script code 생성&lt;/h2&gt;
&lt;h3&gt;Repo에 사용자 repository 주소 작성&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/22/aJ5BdfGxgz1MkmD.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;repo라고 되어있는 부분에 사용자의 repo 이름 즉 필자 기준으로 sukvvon/blogComments를 기입합니다.&lt;/p&gt;
&lt;h3&gt;Theme 선택&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/24/qlTnuPFeBsz7X4W.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Theme list&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Github Light&lt;/li&gt;
&lt;li&gt;Github Dark&lt;/li&gt;
&lt;li&gt;Preferred Color Scheme&lt;/li&gt;
&lt;li&gt;GitHub Dark Orange&lt;/li&gt;
&lt;li&gt;Icy Dark&lt;/li&gt;
&lt;li&gt;Dark Blue&lt;/li&gt;
&lt;li&gt;Photon Dark&lt;/li&gt;
&lt;li&gt;Boxy Light&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Theme list에서 자신이 원하는 스타일의 테마를 선택합니다.&lt;/p&gt;
&lt;h3&gt;Mapping 방식 선택 및 script 복사&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/22/M2lCBJmxpfGT6W8.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;script src=&amp;quot;https://utteranc.es/client.js&amp;quot;
        repo=&amp;quot;sukvvon/blogComments&amp;quot;
        issue-term=&amp;quot;pathname&amp;quot;
        theme=&amp;quot;github-light&amp;quot;
        crossorigin=&amp;quot;anonymous&amp;quot;
        async&amp;gt;
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;각자 맞는 mapping 방식을 설정하면 됩니다. 필자는 포스팅 주소가 각각 존재하기 때문에 &lt;strong&gt;Issue title contains page pathname&lt;/strong&gt;을 그대로 선택했습니다.&lt;/p&gt;
&lt;p&gt;그리고 완성된 &lt;strong&gt;Enable Utterances&lt;/strong&gt;의 script를 복사합니다.&lt;/p&gt;
&lt;h2&gt;블로그에 utterance 설정&lt;/h2&gt;
&lt;h3&gt;꾸미기 -&amp;gt; 스킨 편집&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/22/urhWn4NPSjLeKyF.png&quot;&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;티스토리 블로그를 예시로 설명합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;사용자의 티스토리 블로그의 관리에서 &lt;strong&gt;꾸미기&lt;/strong&gt;의 &lt;strong&gt;스킨 편집&lt;/strong&gt;을 클릭합니다.&lt;/p&gt;
&lt;h3&gt;html 편집&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/22/GfpXlNF951EA67M.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;html 편집&lt;/strong&gt;을 클릭합니다.&lt;/p&gt;
&lt;h3&gt;복사한 utterances script 삽입&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/22/GKnSRcMo3hXiJyZ.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;script src=&amp;quot;https://utteranc.es/client.js&amp;quot;
        repo=&amp;quot;sukvvon/blogComments&amp;quot;
        issue-term=&amp;quot;pathname&amp;quot;
        theme=&amp;quot;github-light&amp;quot;
        crossorigin=&amp;quot;anonymous&amp;quot;
        async&amp;gt;
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;스킨마다 다르지만 티스토리의 Book Club 스킨을 기준으로 commend + F 키를 통해 &lt;code&gt;댓글&lt;/code&gt;을 검색하거나 &lt;code&gt;comment&lt;/code&gt;를 검색하여 &lt;u&gt;댓글 창 관련 div 태그를 찾습니다&lt;/u&gt;. &lt;/p&gt;
&lt;p&gt;그 후 복사한 script를 해당하는 div 태그 안에 붙여넣기 합니다.&lt;/p&gt;
&lt;h3&gt;utterances width 제한 푸는 script 삽입&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/22/5DteHEAJyOm1jaB.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;.utterances {
    max-width: 100% !important;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;기본적으로 utterances의 &lt;code&gt;max-width: 760px&lt;/code&gt;가 설정되어 가로가 최대 760px만 보여지게 되어 있습니다.  &lt;code&gt;max-width: 100% !important&lt;/code&gt;로 설정하는 script를 블로그 css 파일 맨 하단 혹은 자신이 기억할 수 있는 위치에 작성하여 &lt;u&gt;너비 제한을 우선적으로 해제&lt;/u&gt;하여 너비를 100% 활용하도록 합니다. 100%가 아니더라도 자신의 블로그에 맞게 width를 설정합니다.&lt;/p&gt;
&lt;h2&gt;utterances 적용 확인&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/22/R2qJyAijlezm1QH.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;적용한 utterances가 잘 작동하는지 가장 최근 포스팅한 게시물에 들어가서 태스트 댓글을 남겨보았습니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/22/qXVRGOI6uN7FkKD.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;댓글이 달리는대로 utterances bot이 이를 실시간으로 파악해 메일로 보내어 사용자에게 통보하고&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/22/z2IXUHmgplvxZnG.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;GitHub에서 또한 sukvvon/blogComments repository의 issues에 댓글이 달리는 것을 확인할 수 있었습니다.&lt;/p&gt;
&lt;h2&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://baek.dev/post/4/&quot;&gt;utterances를 블로그 댓글로 적용하기&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Etc</category>
      <category>utterences</category>
      <category>블로그 댓글</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/72</guid>
      <comments>https://sukvvon.tistory.com/72#entry72comment</comments>
      <pubDate>Sun, 24 Oct 2021 16:00:35 +0900</pubDate>
    </item>
    <item>
      <title>[Git] GitHub Personal access token 생성 및 사용하기</title>
      <link>https://sukvvon.tistory.com/71</link>
      <description>&lt;h2&gt;Warning&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/20/qDVdJ4NvafRoElG.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;Warning: Error searching on GitHub: GitHub API Error: Bad credentials
The GitHub credentials in the macOS keychain may be invalid.
Clear them with:
  printf &amp;quot;protocol=https\nhost=github.com\n&amp;quot; | git credential-osxkeychain erase
Create a GitHub personal access token:
    https://github.com/settings/tokens/new?scopes=gist,public_repo,workflow&amp;amp;description=Homebrew
  echo &amp;#39;export HOMEBREW_GITHUB_API_TOKEN=your_token_here&amp;#39; &amp;gt;&amp;gt; ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;평상시처럼 Homebrew를 사용하여 search 명령어를 사용하였더니 위와 같은 경고 문구가 나타났습니다. 해당하는 정보들은 무리 없이 출력되었으나 서두에 나오는 경고 문구를 해결하기 위해 알아보기 시작하였습니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Warning: Error searching on GitHub: GitHub API Error: Bad credentials&lt;br&gt;The GitHub credentials in the macOS keychain may be invalid.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;다음 문구에서 GitHub API가 에러가 발생했는데 증명이 되지 않는다. GitHub 증명에 관련된 masOS의 키체인이 유효하지 않은 것 같다라고 합니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/20/ICptmGOylMnF7kE.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/20/i5RhSYuaWzjLPrD.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;키체인 그리고 토큰이라고 해서 2021.07.05 Github로부터 메일이 하나 왔던 것이 생각나 메일에서 명시한 링크를 타고 들어가보니 github에서 자사 블로그를 통해 공지한 사항이 보였습니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.blog/2020-07-30-token-authentication-requirements-for-api-and-git-operations/&quot;&gt;In July 2020&lt;/a&gt;, we announced our intent to require the use of token-based authentication (for example, a personal access, OAuth, or GitHub App installation token) for all authenticated Git operations. Beginning August 13, 2021, we will no longer accept account passwords when authenticating Git operations on GitHub.com.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/&quot;&gt;GitHub 블로그&lt;/a&gt;에서 공지한 내용은 2021.08.13 일자로 git 관련 작업을 할 경우 계정 암호를 사용하지 않고 &lt;u&gt;토큰을 기반으로 사용한다는 것&lt;/u&gt;이었습니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/20/oXihBJ7QDE5zVCa.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;그리고 전에 2021.08.14 일에 만들어 놓은 personal access token이 만료가 되었다는 것을 깨닫고&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;Clear them with:
  printf &amp;quot;protocol=https\nhost=github.com\n&amp;quot; | git credential-osxkeychain erase
Create a GitHub personal access token:
    https://github.com/settings/tokens/new?scopes=gist,public_repo,workflow&amp;amp;description=Homebrew
  echo &amp;#39;export HOMEBREW_GITHUB_API_TOKEN=your_token_here&amp;#39; &amp;gt;&amp;gt; ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 경고문구에서 지향하는 메뉴얼대로 진행하여 Homebrew 토큰을 따로 설정하는 것이 아닌 &lt;u&gt;기존에 있던 personal access token의 기간을 갱신&lt;/u&gt;하면 되겠다고 생각했습니다.&lt;/p&gt;
&lt;h2&gt;Github 접속 및 로그인&lt;/h2&gt;
&lt;h3&gt;Settings 접근&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/20/GRxHulAtbWpNEyY.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt; 에 들어간 후 로그인을 하고 우측 상단의 빨간색 네모 박스 아이콘을 클릭한 후 &lt;code&gt;Setting&lt;/code&gt;을 클릭합니다.&lt;/p&gt;
&lt;h3&gt;Developer Settings 접근&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/21/AvsQUNDxnbW8PdX.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;그 후 &lt;code&gt;Developer settings&lt;/code&gt;를 클릭합니다.&lt;/p&gt;
&lt;h3&gt;Personal access tokens -&amp;gt; Generate new token&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/20/SL2cTKqB8jIPEad.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Personal access tokens&lt;/code&gt;를 클릭한 후 &lt;code&gt;Generate new token&lt;/code&gt;을 클릭합니다.&lt;/p&gt;
&lt;h3&gt;Access token 생성&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/21/aKS13qT5HLMBXGP.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/21/KgBq8zQoVELHCZF.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Note&lt;/code&gt;에 자신이 원하는 토큰의 명칭을 적고, &lt;code&gt;Expiration&lt;/code&gt; 즉 만료기간을 7, 30, 60, 90 등의 기간으로 설정합니다. &lt;code&gt;repo, workflow, gist&lt;/code&gt; 항목을 체크 한 후 &lt;code&gt;Generate token&lt;/code&gt;을 클릭하여 토큰을 생성합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;Warning: Error searching on GitHub: GitHub API Error: Bad credentials
The GitHub credentials in the macOS keychain may be invalid.
Clear them with:
  printf &amp;quot;protocol=https\nhost=github.com\n&amp;quot; | git credential-osxkeychain erase
Create a GitHub personal access token:
    https://github.com/settings/tokens/new?scopes=gist,public_repo,workflow&amp;amp;description=Homebrew
  echo &amp;#39;export HOMEBREW_GITHUB_API_TOKEN=your_token_here&amp;#39; &amp;gt;&amp;gt; ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;물론 Homebrew에서 경고한 문구에서&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;https://github.com/settings/tokens/new?scopes=gist,public_repo,workflow&amp;amp;description=Homebrew&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 주소를 들어가도 똑같이 설정을 할 수 있습니다.&lt;/p&gt;
&lt;h3&gt;Token 복사 및 기억하기&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/21/G9okBeJK3TYxC2X.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;다음과 같이 토큰이 생성이 됩니다. 이 토큰 값은 초기 생성하였을 경우에만 값이 나타나고 그 후 접속하였을 경우 제가 평상시 사용하고 있는 defaultToken 처럼 나타나지 않습니다. 그러므로 &lt;u&gt;토큰 값을 복사하여 자신의 메모장 같은 기억하기 쉬운 곳에 붙여넣기하여 기억&lt;/u&gt;합니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/21/s9ET2iCpuV3WfAN.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;다시 접속하였을 경우 토큰 값이 나타나지 않는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;github.com 키체인 수정&lt;/h2&gt;
&lt;h3&gt;키체인 접근 애플리케이션 실행&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/21/OP3qoDeNhxtv4uz.png&quot;&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;macOS 기준입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;macOS 기본 어플인 &lt;code&gt;키체인 접근&lt;/code&gt; 애플리케이션을 실행합니다.&lt;/p&gt;
&lt;h3&gt;github.com 항목 접근&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/21/DVSrARnEIilJMfb.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;github&lt;/code&gt;를 검색한 후 이름은 &lt;code&gt;github.com&lt;/code&gt;이고 종류는 &lt;code&gt;인터넷 암호&lt;/code&gt;이며 키체인은 &lt;code&gt;로그인&lt;/code&gt;으로 된 항목을 클릭합니다.&lt;/p&gt;
&lt;h3&gt;암호 보기 체크 상자 설정&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/21/mf5QMvztdSyFhKR.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/21/CFJAl6KcDmZfeqx.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;암호 보기&lt;/code&gt; 항목을 체크한 후 암호를 입력하여 &lt;code&gt;허용&lt;/code&gt; 버튼 클릭합니다.&lt;/p&gt;
&lt;h3&gt;Token 입력 후 저장&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/21/J14YFrZguHme7A9.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;Token 을 입력한 후 &lt;code&gt;변경사항 저장&lt;/code&gt; 버튼을 클릭합니다.&lt;/p&gt;
&lt;h2&gt;Result&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/10/21/3CODRdWHZ1ruXje.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;다시 &lt;code&gt;brew search zsh&lt;/code&gt; 입력해보니 경고 문구가 뜨지 않고 깔끔하게 출력되는 것을 확인할 수 있습니다.&lt;/p&gt;</description>
      <category>Git</category>
      <category>git</category>
      <category>github</category>
      <category>token</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/71</guid>
      <comments>https://sukvvon.tistory.com/71#entry71comment</comments>
      <pubDate>Thu, 21 Oct 2021 13:45:44 +0900</pubDate>
    </item>
    <item>
      <title>CSR(Clinet-Side Rendering) vs SSR(Server-Side Rendering)</title>
      <link>https://sukvvon.tistory.com/70</link>
      <description>&lt;h2&gt;SPA&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;SPA :  Single Page Application&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;하나의 HTML파일을 기반으로 JavaScript를 이용해 동적으로 재작성하는 최초 한 번 페이지 전체를 로딩하고, 그 속에 있는데 데이터만 변경해서 사용하는 애플리케이션입니다.&lt;/p&gt;
&lt;p&gt;Gmail, Google Maps, AirBNB, Netflix, Paypal 등의 기업에서 SPA를 사용하여 만듭니다.&lt;/p&gt;
&lt;h2&gt;CSR&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/145145115-c0e5be69-2b0b-4813-9ce5-daea59fa9b2d.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://medium.com/@adamzerner/client-side-rendering-vs-server-side-rendering-a32d2cf3bfcc&quot;&gt;이미지 출처&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;CSR: Client Side Rendering&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;브라우저가 HTML과 JS 파일을 요청을 하고 로드가 되면 그 후 사용자의 기호에 따라 동적으로 렌더링을 시키는 것입니다.&lt;/p&gt;
&lt;p&gt;실생활 예로 들자면 서점에 방문하여 필요한 책을 구입하는데 1시간을 소요하고 집에서 &lt;u&gt;필요한 책이 있을 때 책장에서 꺼내서 보는 것&lt;/u&gt;입니다.&lt;/p&gt;
&lt;h3&gt;장점&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;필요한 데이터만 받으므로 트래픽이 감소합니다.&lt;/li&gt;
&lt;li&gt;새로고침을 할 필요가 없어 사용자 경험(UX)이 좋아져 네이티브 앱과 같은 느낌의 경험을 할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;단점&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;검색 봇의 크롤러가 데이터 수집에 어려움을 겪어 검색엔진 최적화(SEO)에 문제가 될 수 있습니다.&lt;/li&gt;
&lt;li&gt;해당하는 모든 스크립트 파일들이 로드가 될 때까지 기다려야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;SSR&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/145144949-bffe6cd5-de1f-4271-849f-a109ba10a794.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://medium.com/@adamzerner/client-side-rendering-vs-server-side-rendering-a32d2cf3bfcc&quot;&gt;이미지 출처&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;SSR: Server Side Rendering&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;브라우저가 페이지를 요청할 때마다 해당 페이지에 맞는 HTML, CSS, JS 파일 그리고 데이터를 받아와서 렌더링을 시킵니다.&lt;/p&gt;
&lt;p&gt;실생활 예로 들자면 &lt;u&gt;필요한 책이 있을 때마다 서점을 수시로 방문하는 것&lt;/u&gt;과 같습니다.&lt;/p&gt;
&lt;h3&gt;장점&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;렌더링을 이용한 것이 아니므로 검색엔진을 최적화(SEO)시킵니다.&lt;/li&gt;
&lt;li&gt;초기로딩의 성능을 개선하기 때문에 컨텐츠를 빨리 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;단점&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;라우터를 사용하여 프로젝트가 복잡해집니다.&lt;/li&gt;
&lt;li&gt;서버에 요청을 수시로 하기 때문에 성능이 악화될 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;참고&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://velog.io/@zansol/%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0-%EC%84%9C%EB%B2%84%EC%82%AC%EC%9D%B4%EB%93%9C%EB%A0%8C%EB%8D%94%EB%A7%81SSR-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%EC%82%AC%EC%9D%B4%EB%93%9C%EB%A0%8C%EB%8D%94%EB%A7%81CSR&quot;&gt;[주니어탈출기] 서버사이드렌더링(SSR) &amp;amp; 클라이언트사이드렌더링(CSR)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://medium.com/@adamzerner/client-side-rendering-vs-server-side-rendering-a32d2cf3bfcc&quot;&gt;Client-side rendering vs. server-side rendering&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/baeharam/Must-Know-About-Frontend/blob/main/Notes/frontend/csr-ssr.md&quot;&gt;Must-Know-About-Frontend&lt;/a&gt;&lt;/p&gt;</description>
      <category>CS</category>
      <category>CSR</category>
      <category>spa</category>
      <category>SSR</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/70</guid>
      <comments>https://sukvvon.tistory.com/70#entry70comment</comments>
      <pubDate>Sun, 3 Oct 2021 12:37:35 +0900</pubDate>
    </item>
    <item>
      <title>[Nodejs] nvm으로 Nodejs 버전 관리하기</title>
      <link>https://sukvvon.tistory.com/69</link>
      <description>&lt;h2&gt;nvm이란?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nvm-sh/nvm&quot;&gt;nvm&lt;/a&gt;은 node version manager의 줄임말입니다. Node.js을 비공식적으로 여러 버전을 하나의 컴퓨터에 설치할 수 있도록 도와주며 사용자는 손쉽게 여러 개의 버전을 제약 없이 사용할 수 있습니다.  POSIX-compliant shell (sh, dash, ksh, zsh, bash)에서 호환되며 unix, macOS, 그리고 windows WSL 플랫폼에서 작동합니다.&lt;/p&gt;
&lt;h2&gt;nvm 설치&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/09/11/M48oJ9ZREy1neFl.png&quot;&gt;
&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew install nvm&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;macOS 기준으로 nvm을 설치하기 가장 간단한 방법은 homebrew를 통하여 설치하는 것입니다. 위 명령어 &lt;code&gt;brew install nvm&lt;/code&gt; 을 통해서 nvm을 설치합니다.&lt;/p&gt;
&lt;h2&gt;nvm 설치 후 초기 설정&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/09/11/OpmtN6W2ZMH8XlK.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;Please note that upstream has asked us to make explicit managing
nvm via Homebrew is unsupported by them and you should check any
problems against the standard nvm install method prior to reporting.

You should create NVM&amp;#39;s working directory if it doesn&amp;#39;t exist:

  mkdir ~/.nvm

Add the following to ~/.zshrc or your desired shell
configuration file:

  export NVM_DIR=&amp;quot;$HOME/.nvm&amp;quot;
  [ -s &amp;quot;/usr/local/opt/nvm/nvm.sh&amp;quot; ] &amp;amp;&amp;amp; . &amp;quot;/usr/local/opt/nvm/nvm.sh&amp;quot;  # This loads nvm
  [ -s &amp;quot;/usr/local/opt/nvm/etc/bash_completion.d/nvm&amp;quot; ] &amp;amp;&amp;amp; . &amp;quot;/usr/local/opt/nvm/etc/bash_completion.d/nvm&amp;quot;  # This loads nvm bash_completion

You can set $NVM_DIR to any location, but leaving it unchanged from
/usr/local/opt/nvm will destroy any nvm-installed Node installations
upon upgrade/reinstall.

Type `nvm help` for further information.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;homebrew를 통해 nvm을 설치하게 되면 위와 같은 주의 사항 및 안내 문구가 나옵니다.&lt;/p&gt;
&lt;h3&gt;.nvm 디렉토리 생성&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;mkdir ~/.nvm&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;make directory를 의미하는 &lt;code&gt;mkdir&lt;/code&gt; 명령어를 사용하여 &lt;code&gt;~&lt;/code&gt; 즉 home directory에 &lt;code&gt;.nvm&lt;/code&gt; 파일을 만듭니다.  &lt;code&gt;.nvm&lt;/code&gt; 파일은 nvm&amp;#39;s working directory 즉 nvm을 활용하여 이루어진 모든 것이 존재하게 되는 곳이므로 이 &lt;code&gt;.nvm&lt;/code&gt; 파일이 없다면 우선적으로 만들어야만합니다.&lt;/p&gt;
&lt;h3&gt;.zshrc에 환경변수 추가&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;vi ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;.zshrc&lt;/code&gt; 파일을 vim 에디터를 활용하여 연 후&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/09/27/Bk2LdXRhb8mYjKe.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;#nvm
export NVM_DIR=&amp;quot;$HOME/.nvm&amp;quot;
  [ -s &amp;quot;/usr/local/opt/nvm/nvm.sh&amp;quot; ] &amp;amp;&amp;amp; . &amp;quot;/usr/local/opt/nvm/nvm.sh&amp;quot;  # This loads nvm
  [ -s &amp;quot;/usr/local/opt/nvm/etc/bash_completion.d/nvm&amp;quot; ] &amp;amp;&amp;amp; . &amp;quot;/usr/local/opt/nvm/etc/bash_completion.d/nvm&amp;quot;  # This loads nvm bash_completion&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위의 코드를 제일 끝 줄에 붙여넣기 하여 &lt;code&gt;:wq&lt;/code&gt; 를 하여 저장 후 빠져나옵니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;source ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그리고 &lt;code&gt;source ~/.zhsrc&lt;/code&gt; 를 통해서 쉘을 재시작 해줍니다.&lt;/p&gt;
&lt;p&gt;vim 관련해서 생소하시다면 아래 간단하게 정리된 설명을 보시기 바랍니다.&lt;/p&gt;
&lt;h4&gt;vim 간단 사용법&lt;/h4&gt;
&lt;p&gt;i, a, o는  &lt;u&gt;명령모드에서 삽입모드로 전환&lt;/u&gt;하는 대표적인 키입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;i : 현재 커서 앞에 삽입합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a : 현재 커서 뒤에 삽입합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;o : 현재 커서 행 아래에 새 행을 삽입합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;u&gt;삽입모드&lt;/u&gt;가 끝나고 난 후 &lt;u&gt;명령모드로 전환&lt;/u&gt;을 합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;ESC : &lt;u&gt;편집모드에서 명령모드&lt;/u&gt;로 전환합니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;h, j, k, l : 좌, 아래, 위, 우로 한 칸씩 움직일 수 있습니다. 기존 화살표로도 사용할 수  있으나 권장하지 않습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/09/29/l9PZJmwd8p4Gze7.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;$ nvm --version
0.38.0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;nvm --version&lt;/code&gt; 을 하였을 경우 버전 정보가 출력된다면 정상적으로 환경변수가 적용이 완료되고 nvm을 사용할 수 있는 것입니다.&lt;/p&gt;
&lt;h2&gt;nvm을 활용하여 lts 버전 설치하기&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/09/11/3UYobnXHKW94FCA.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;nvm ls | list&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;우선 &lt;code&gt;nvm ls&lt;/code&gt; 을 통하여 목록을 확인해봅니다. 당연히 &lt;code&gt;nvm&lt;/code&gt; 설치 후 아무것도 설치를 하지 않았으니 목록에 &lt;code&gt;N/A&lt;/code&gt; 가 뜨면서 아직 node가 어떤 버전도 설치가 되지 않았음을 알 수 있습니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/09/27/xv2TBojfZqYm7pb.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;만약 nvm을 이용하지 않는다면 공식 홈페이지에서는 LTS버전 즉 Long Term Support인 14.17.6 와 현재 버전인 16.10.0 두 가지를 쉽게 다운 받을 수 있습니다.&lt;/p&gt;
&lt;p&gt;가장 최신 버전인 16.10.0은 &lt;u&gt;기능이 불안정하거나 일부 모듈이 작동하지 않을 수 있지만&lt;/u&gt; 최신14.17.6 LTS 버전은 앞에 14와 같이 4, 6, 8, 10, 12, 14 즉 앞이 짝수 단위 숫자의 버전이 지정되며 보다 더 &lt;u&gt;안정적이고 오랜 기간 지원&lt;/u&gt;합니다.&lt;/p&gt;
&lt;p&gt;그러므로 필자는 LTS 버전을 nvm을 이용하여 설치를 할 것입니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/09/11/KnRt3YWCdeZMTmP.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;nvm install --lts&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;nvm으로 가장 최근 LTS 버전을 설치합니다. 즉 14.17.6 버전을 설치합니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/09/29/AVaheWdtYjH59Mx.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;nvm list-remote&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;nvm list-remote&lt;/code&gt; 명령어를 통해서 설치 가능한 node 목록을 확인할 수 있습니다. 꼭 최신 LTS 버전이 아니더라도 자신이 원하는 버전을 예를 들어 &lt;code&gt;nvm install 12.13.0&lt;/code&gt; 처럼 찾아서 설치를 할 수 있습니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/09/11/6lSLDGnWtgOVZ4I.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;그 후 &lt;code&gt;nvm ls&lt;/code&gt; 을 통해서 확인하면 다음과 같이 확인하면 최신 LTS 버전이 설치가 되고 v14.17.6 버전을 사용중이라는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;nvm 명령어 간단한 예시&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/09/29/9WkEzSw7PsQ1dZV.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;Example:
  nvm install 8.0.0                     Install a specific version number
  nvm use 8.0                           Use the latest available 8.0.x release
  nvm run 6.10.3 app.js                 Run app.js using node 6.10.3
  nvm exec 4.8.3 node app.js            Run `node app.js` with the PATH pointing to node 4.8.3
  nvm alias default 8.1.0               Set default node version on a shell
  nvm alias default node                Always default to the latest available node version on a shell

  nvm install node                      Install the latest available version
  nvm use node                          Use the latest version
  nvm install --lts                     Install the latest LTS version
  nvm use --lts                         Use the latest LTS version

  nvm set-colors cgYmW                  Set text colors to cyan, green, bold yellow, magenta, and white

Note:
  to remove, delete, or uninstall nvm - just remove the `$NVM_DIR` folder (usually `~/.nvm`)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 코드는 &lt;code&gt;nvm help&lt;/code&gt; 에서 설명하는 예입니다. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;nvm install 8.0.0                     Install a specific version number&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;nvm으로 사용자가 원하는 버전을 지정하여 설치하는 것입니다. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;nvm use 8.0                           Use the latest available 8.0.x release&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;nvm으로 8버전 중 가장 최신의 버전을 사용하는 것입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;nvm run 6.10.3 app.js                 Run app.js using node 6.10.3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;nvm을 활용하여 6.10.3 버전으로 app.js 파일을 실행하는 것입니다. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;nvm exec 4.8.3 node app.js            Run `node app.js` with the PATH pointing to node 4.8.3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;nvm을 활용하여 node app.js 를 4.8.3 버전을 사용하여 실행하는 것입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;nvm alias default 8.1.0               Set default node version on a shell&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;nvm을 활용하여 shell에 8.1.0 버전을 기본으로 설정하는 것입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;nvm alias default node                Always default to the latest available node version on a shell&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;nvm을 활용하여 항상 최신의 node 버전을 shell에 기본으로 설정하는 것입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;nvm install node                      Install the latest available version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;nvm을 활용하여 최신 node 버전을 설치하는 것입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;nvm use node                          Use the latest version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;설치한 최신 버전의 node를 사용하는 것입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;nvm install --lts                     Install the latest LTS version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;nvm을 활용하여 최신 버전의 LTS를 설치하는 것입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;nvm use --lts                         Use the latest LTS version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;설치한 최신 버전의 LTS를 사용하는 것입니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/09/29/pAeWYEf27TRVQoS.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;nvm set-colors cgYmW                  Set text colors to cyan, green, bold yellow, magenta, and white&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;nvm의 텍스트 색상을 cgYmw 즉 청록, 녹, 볼드체 노랑, 마젠타, 흰색으로 지정하는 것입니다. &lt;/p&gt;</description>
      <category>Nodejs</category>
      <category>nodejs</category>
      <category>NVM</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/69</guid>
      <comments>https://sukvvon.tistory.com/69#entry69comment</comments>
      <pubDate>Wed, 29 Sep 2021 22:48:08 +0900</pubDate>
    </item>
    <item>
      <title>[Git] 이전 commit message 수정하기(reword)</title>
      <link>https://sukvvon.tistory.com/68</link>
      <description>&lt;h2&gt;계기&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/ulQYTS6qFfcRvxa.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/L1BEVMZaxIyKC9A.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;전에 commit 하였던 message가 다시 보니 마음에 들지 않아 수정을 해야겠다는 생각을 하였습니다. 가장 최근에 commit을 했다면 &lt;code&gt;git commit --amend&lt;/code&gt; 를 통해 수정을 할 수 있었겠지만 가장 최근에 한 것이 아니어서 다른 방법을 통해 수정을 해야만 했습니다.&lt;/p&gt;
&lt;h2&gt;git rebase -i HEAD~[number]&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/ExIbKvG1Tn69dFg.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/v65SgPjK4UiChAb.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;git rebase -i HEAD~10&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;git rebase -i HEAD~10&lt;/code&gt; 명령어를 입력하면 위 이미지와 같은 창이 나옵니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HEAD는 첫 번째를 의미&lt;/strong&gt;하고 &lt;strong&gt;10은 HEAD를 포함하여 시작하여 10번째 commit 항목을 의미&lt;/strong&gt;합니다. 여기서 2,3,7번째 항목의 commit message를 바꾸기 위하여 &lt;code&gt;pick&lt;/code&gt; 을 &lt;code&gt;reword&lt;/code&gt; 으로 수정을 하였습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;pick -&amp;gt; reword&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;pick&lt;/code&gt; 에서 &lt;code&gt;reword&lt;/code&gt; 으로 수정을 마친후 vim 에디터를 사용 중이므로 &lt;code&gt;:wq&lt;/code&gt; 를 통해서 저장 후 빠져나옵니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/nZrAbuzCfwoBhvk.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/aAm5oqk2EYhzXTD.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/rcvRQOgSHUiP4GL.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;빠져나온다면 바로 &lt;code&gt;pick&lt;/code&gt; 을 &lt;code&gt;reword&lt;/code&gt; 로 바꾼 항목에 해당하는 창이 나옵니다. 수정 후 &lt;code&gt;:wq&lt;/code&gt; 를 하여 빠져나오면 차례대로 &lt;code&gt;reword&lt;/code&gt; 로 바꾼 항목들에 해당하는 창이 순차적으로 나옵니다. 즉 &lt;code&gt;reword&lt;/code&gt; 로 바꾼 항목의 수만큼 창이 연달아 나옵니다.&lt;/p&gt;
&lt;h2&gt;git push --force origin master&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/L6uKaznymWbX17Q.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;git log --online --decoreate --graph | glog&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;glog&lt;/code&gt; 명령어를 통하여 log를 확인해보니 수정된 항목들이 새로 commit이 되어있는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/09/DpHYrNiCX6hWIzd.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/09/PIEgG915fZVLyNs.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;git push --force origin master&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;명령어 실행 후 &lt;code&gt;glog&lt;/code&gt; 를 실행해 log를 확인해보니 깔끔하게 수정한대로 정리가 되어 올라가있는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;conclusion&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/11/xNqwZGPkr2Et6RJ.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git rebase -i HEAD~[number]&lt;/code&gt; 실행 후 &lt;a href=&quot;https://sukvvon.tistory.com/67&quot;&gt;&lt;em&gt;pick -&amp;gt; edit&lt;/em&gt;&lt;/a&gt; 으로 바꾸는 것과 과정을 비교해보니 &lt;em&gt;pick -&amp;gt; reword&lt;/em&gt; 로 하는 것은 위 이미지와 같이 &lt;em&gt;pick -&amp;gt; edit&lt;/em&gt; 의 과정인 &lt;code&gt;git commit --amend&lt;/code&gt; 와 &lt;code&gt;git rebase --continue&lt;/code&gt; 명령어를 실행시킬 필요가 없이 간단하였습니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/ExIbKvG1Tn69dFg.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;edit&lt;/code&gt;의 stop for amending 즉 &lt;strong&gt;개정하기 위해 멈추는 것&lt;/strong&gt;이고, &lt;code&gt;reword&lt;/code&gt;의 edit the commit message 즉 &lt;strong&gt;커밋 메시지를 편집하는 것&lt;/strong&gt;의 차이여서 edit을 할 때는 &lt;code&gt;git commit --amend&lt;/code&gt; 와 &lt;code&gt;git rebase --continue&lt;/code&gt; 와 같은 과정을 거쳐야 하는 것이고, &lt;code&gt;reword&lt;/code&gt; 는 그렇지 않다는 생각을 하였습니다.&lt;/p&gt;</description>
      <category>Git</category>
      <category>git</category>
      <category>git commit message</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/68</guid>
      <comments>https://sukvvon.tistory.com/68#entry68comment</comments>
      <pubDate>Mon, 9 Aug 2021 20:14:08 +0900</pubDate>
    </item>
    <item>
      <title>[Git] 이전 commit message 수정하기(edit)</title>
      <link>https://sukvvon.tistory.com/67</link>
      <description>&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/11/ENY29TAkhJUBmPl.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;전에 commit 하였던 message가 다시 보니 마음에 들지 않아 수정을 해야겠다는 생각을 하였습니다. 가장 최근에 commit을 했다면 &lt;code&gt;git commit --amend&lt;/code&gt; 를 통해 수정을 할 수 있었겠지만 가장 최근에 한 것이 아닌 HEAD로부터 3번째 항목이이서 다른 방법을 통해 수정을 해야만 했습니다.&lt;/p&gt;
&lt;h2&gt;git rebase -i HEAD~[number]&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/11/DlYwBC2c5g6F4fb.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;git rebase -i HEAD~5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;git rebase -i HEAD~5&lt;/code&gt; 명령어를 입력하면 위 사진과 같은 화면이 나옵니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HEAD는 첫 번째를 의미&lt;/strong&gt;하고 &lt;strong&gt;5는 HEAD를 포함하여 시작하여 5번째 commit 항목을 의미&lt;/strong&gt;합니다. 여기서 3번째 항목의 commit message를 바꾸기 위하여 &lt;code&gt;pick&lt;/code&gt; 을 &lt;code&gt;edit&lt;/code&gt; 으로 수정을 합니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/11/7WN4aGQhouCVw2k.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;pick -&amp;gt; edit&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;pick&lt;/code&gt; 에서 &lt;code&gt;edit&lt;/code&gt; 으로 수정을 마친후 vim 에디터를 사용 중이므로 &lt;code&gt;:wq&lt;/code&gt; 를 통해서 저장 후 빠져나옵니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/11/xNqwZGPkr2Et6RJ.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;빠져나온다면 위와 같은 화면을 보실 수 있습니다. &lt;code&gt;master&lt;/code&gt;가 &lt;code&gt;- 87760db &amp;gt;R&amp;gt;&lt;/code&gt; 로 바뀐 것을 볼 수 있습니다. 그리고 &lt;code&gt;git commit --amend&lt;/code&gt; 를 통해 &lt;code&gt;edit&lt;/code&gt; 한 항목에 대해 수정을 하고 &lt;code&gt;git rebase --continue&lt;/code&gt; 를 하면 된다는 것 또한 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;git commit --amend&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/11/mCpPwBVSq4eWfXQ.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;git commit --amend&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;기존에는 가장 최근 commit message를 수정할 때 사용하였으나 &lt;code&gt;git rebase -i HEAD~5&lt;/code&gt; 를 통해 &lt;code&gt;pick&lt;/code&gt; 을 &lt;code&gt;edit&lt;/code&gt; 으로 수정하였으므로 이에 대해 수정을 할 수 있습니다. 자신이 수정하고 싶은 message를 입력하고 &lt;code&gt;:wq&lt;/code&gt;를 통해 저장후 빠져나옵니다.&lt;/p&gt;
&lt;h2&gt;git rebase --continue&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/11/U1JAlIBZ3iHafVF.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;git rebase --continue&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;git rebase --continue&lt;/code&gt; 를 통해 커밋을 적용시킵니다. 다른 항목을 수정하고 싶다면 위와 같은 과정을 반복하면 됩니다.&lt;/p&gt;
&lt;h2&gt;git log --stat&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/11/kbrEpZWCvIO72KD.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;git log --stat | gst&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;git log --stat&lt;/code&gt; 즉 &lt;code&gt;gst&lt;/code&gt;를 통해 log를 확인해보니 정상적으로 수정을 완료하였다는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;git push --force origin master&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/11/cLSyIB9Mb6FsR73.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;git push --force origin master&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이미 github에 push한 상태로 commit message를 수정한 것이므로 &lt;code&gt;git push --force origin master&lt;/code&gt;를 통해 다시 push를 함으로써 재정렬해줍니다.&lt;/p&gt;
&lt;h2&gt;conclusion&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/11/84DV1sjLyJPeAMK.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;해당하는 github repository로 이동을 해보니 제가 원하는대로 commit message가 변경된 것을 알 수 있었습니다.&lt;/p&gt;
&lt;p&gt;참고 : &lt;a href=&quot;https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-%ED%9E%88%EC%8A%A4%ED%86%A0%EB%A6%AC-%EB%8B%A8%EC%9E%A5%ED%95%98%EA%B8%B0&quot;&gt;git-scm&lt;/a&gt;&lt;/p&gt;</description>
      <category>Git</category>
      <category>commit</category>
      <category>git</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/67</guid>
      <comments>https://sukvvon.tistory.com/67#entry67comment</comments>
      <pubDate>Sun, 11 Jul 2021 14:16:12 +0900</pubDate>
    </item>
    <item>
      <title>[Homebrew] SHA256 mismatch</title>
      <link>https://sukvvon.tistory.com/66</link>
      <description>&lt;h2&gt;brew install IntelliJ-idea&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/01/8ViovUF1E2pQRqy.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;Intellij-idea가 새로운 버전이 나와서 &lt;code&gt;brew upgrade&lt;/code&gt; 를 한 후 &lt;code&gt;brew upgrade --greedy&lt;/code&gt; 명령어를 통해 IntelliJ-idea 및 다른 formula 및 cask 들을 업데이트 하려고 하였습니다. 하지만 위 사진과 같이 &lt;code&gt;Error: SHA256 mismatch&lt;/code&gt; 문구가 뜨면서 업데이트를 실패했습니다. &lt;/p&gt;
&lt;p&gt;오류인가 싶어서 &lt;code&gt;brew rm Intellij-idea&lt;/code&gt; 명령어를 통해 기존 intellij-idea를 삭제하고 다시 설치를 시도 하였으나 다음과 같이 설치에 실패했습니다.&lt;/p&gt;
&lt;h2&gt;github&amp;#39;s IntelliJ-idea.rb&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/01/qdIbSZi3RVl59CN.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/01/InbYXh1PFK6OTRx.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/intellij-idea.rb&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;github에 올라온 intellij-idea.rb 파일을 일부 발췌하여 보니 필자는 인텔맥을 사용하므로 기준으로 말씀드리자면 sha256 값이 제가 &lt;code&gt;brew&lt;/code&gt; 를 통해서 다운 받은 &lt;code&gt;sha256&lt;/code&gt; 값과 다른 &lt;code&gt;860c712fdd645229375ec3d091eeb98f8f9ea9b955a2e5cfc4e8f5c276485e46&lt;/code&gt; 를 요구한다는 것을 알 수 있었습니다. &lt;/p&gt;
&lt;p&gt;다르기 때문에 dmg 파일을 다운 받더라도 dismatch 현상이 일어나서 설치가 되지 않았다는 것을 확인하였습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;Expected: 860c712fdd645229375ec3d091eeb98f8f9ea9b955a2e5cfc4e8f5c276485e46 // github에서 요구하는 sha256 값
  Actual: 156f5f12ae5c45b6d3c0b72af9105cdb6a610b0e7dfb32f26686f74b9bcf5ed4 // 필자가 요구하는 sha256 값&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;다음과 같이 다르다는 것을 알고 이것을 수정해야겠다는 생각을 했습니다.&lt;/p&gt;
&lt;h2&gt;brew edit intellij-idea&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/01/xOuGp3KL6XsZTYJ.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew edit intellij-idea&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;brew edit&lt;/code&gt; 명령어를 입력하니 vim 에디터가 호출되어 vim을 이용하여 기존 sha256 값 &lt;code&gt;860c712fdd645229375ec3d091eeb98f8f9ea9b955a2e5cfc4e8f5c276485e46&lt;/code&gt; 을 빨간 박스와 같이 &lt;code&gt;156f5f12ae5c45b6d3c0b72af9105cdb6a610b0e7dfb32f26686f74b9bcf5ed4&lt;/code&gt; 로 수정하고 저장하였습니다.&lt;/p&gt;
&lt;h2&gt;brew install Intellij-idea&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/01/4GBnkSvzMchOKxF.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew install intellij-idea&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;brew install intellij-idea&lt;/code&gt; 명령어를 실행하였더니 정상적으로 설치가 되었습니다.&lt;/p&gt;</description>
      <category>Homebrew</category>
      <category>homebrew</category>
      <category>sha256</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/66</guid>
      <comments>https://sukvvon.tistory.com/66#entry66comment</comments>
      <pubDate>Thu, 1 Jul 2021 13:01:01 +0900</pubDate>
    </item>
    <item>
      <title>[Git] commit message 효율적으로 작성하기</title>
      <link>https://sukvvon.tistory.com/57</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.ull.im/engineering/2019/03/10/logs-on-git.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.ull.im/engineering/2019/03/10/logs-on-git.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1621226400041&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;ull.im&quot; data-og-description=&quot;울려 퍼지다.&amp;lt;br/&amp;gt; 반향하다.&amp;lt;br/&amp;gt; 공명하다.&quot; data-og-host=&quot;blog.ull.im&quot; data-og-source-url=&quot;https://blog.ull.im/engineering/2019/03/10/logs-on-git.html&quot; data-og-url=&quot;https://blog.ull.im&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tr0nL/hyKe1TlgKJ/XkXkhPSSVlsdUkbBOkk0V0/img.png?width=612&amp;amp;height=605&amp;amp;face=0_0_612_605,https://scrap.kakaocdn.net/dn/b8W9xH/hyKdKeDL4R/OnFyMNtmJ37SEkKNzVlpN0/img.png?width=612&amp;amp;height=605&amp;amp;face=0_0_612_605,https://scrap.kakaocdn.net/dn/mPi2E/hyKe59iiky/Rdxq3kuuqATMxOa7GWR44k/img.png?width=392&amp;amp;height=392&amp;amp;face=63_152_133_228&quot;&gt;&lt;a href=&quot;https://blog.ull.im/engineering/2019/03/10/logs-on-git.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.ull.im/engineering/2019/03/10/logs-on-git.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tr0nL/hyKe1TlgKJ/XkXkhPSSVlsdUkbBOkk0V0/img.png?width=612&amp;amp;height=605&amp;amp;face=0_0_612_605,https://scrap.kakaocdn.net/dn/b8W9xH/hyKdKeDL4R/OnFyMNtmJ37SEkKNzVlpN0/img.png?width=612&amp;amp;height=605&amp;amp;face=0_0_612_605,https://scrap.kakaocdn.net/dn/mPi2E/hyKe59iiky/Rdxq3kuuqATMxOa7GWR44k/img.png?width=392&amp;amp;height=392&amp;amp;face=63_152_133_228');&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;ull.im&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;울려 퍼지다.&lt;br /&gt;반향하다.&lt;br /&gt;공명하다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.ull.im&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git을 사용하면서 commit message를 형식에 맞게 사용해야 한다는 필요성을 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 글을 작성해주신 작성자분께 감사하고 연습하면서 commit message를 작성을 해야겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Git</category>
      <category>git</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/57</guid>
      <comments>https://sukvvon.tistory.com/57#entry57comment</comments>
      <pubDate>Mon, 17 May 2021 13:42:00 +0900</pubDate>
    </item>
    <item>
      <title>[Vim] vim 명령어 모음집</title>
      <link>https://sukvvon.tistory.com/56</link>
      <description>&lt;h2&gt;일반&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;:h[elp] keyword - 도움말 열기&lt;/li&gt;
&lt;li&gt;:sav[eas] file - 다른 이름으로 저장&lt;/li&gt;
&lt;li&gt;:clo[se] - 현재 창 닫기&lt;/li&gt;
&lt;li&gt;:ter[minal] - 터미널 열기&lt;/li&gt;
&lt;li&gt;K - 커서가 가리키는 단어의 설명글 열기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;커서이동&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;h - 왼쪽으로 한 칸 이동&lt;/li&gt;
&lt;li&gt;j - 아래로 한 칸 이동&lt;/li&gt;
&lt;li&gt;k - 위로 한 칸 이동&lt;/li&gt;
&lt;li&gt;l - 오른쪽으로 한 칸 이동&lt;/li&gt;
&lt;li&gt;H - 현재화면 상단으로 점프&lt;/li&gt;
&lt;li&gt;M - 현재화면 중단으로 점프&lt;/li&gt;
&lt;li&gt;L - 현재화면 하단으로 점프&lt;/li&gt;
&lt;li&gt;w - 다음 단어 시작으로 점프&lt;/li&gt;
&lt;li&gt;W - 다음 단어 시작으로 점프 (특수문자 포함)&lt;/li&gt;
&lt;li&gt;e - 다음 단어 끝으로 점프&lt;/li&gt;
&lt;li&gt;E - 다음 단어 끝으로 점프 (특수문자 포함)&lt;/li&gt;
&lt;li&gt;b - 이전 단어 시작으로 점프&lt;/li&gt;
&lt;li&gt;B - 이전 단어 시작으로 점프 (특수문자 포함)&lt;/li&gt;
&lt;li&gt;% - 현재 괄호의 짝으로 점프 (:h matchpairs를 통해 더 많은 정보를 얻을 수 있습니다.)&lt;/li&gt;
&lt;li&gt;0 - 현재 행 시작으로 점프 (공백 포함)&lt;/li&gt;
&lt;li&gt;^ - 현재 행 시작으로 점프&lt;/li&gt;
&lt;li&gt;$ - 현재 행 끝으로 점프 (공백 포함)&lt;/li&gt;
&lt;li&gt;g_ - 현재 행 끝으로 점프&lt;/li&gt;
&lt;li&gt;gg - 문서 첫 줄 시작으로 점프&lt;/li&gt;
&lt;li&gt;G - 문서 끝 줄 시작으로 점프&lt;/li&gt;
&lt;li&gt;5gg or 5G - 5번째 행 시작으로 점프&lt;/li&gt;
&lt;li&gt;gd - 지역변수 선언위치로 점프&lt;/li&gt;
&lt;li&gt;gD - 전역변수 선언위치로 점프&lt;/li&gt;
&lt;li&gt;fx - 다음 검색 문자 x로 점프&lt;/li&gt;
&lt;li&gt;tx - 다음 검색 문자 x 앞에 점프&lt;/li&gt;
&lt;li&gt;Fx - 이전 검색 문자 x로 점프&lt;/li&gt;
&lt;li&gt;Tx - 이전 검색 문자 x 뒤에 점프&lt;/li&gt;
&lt;li&gt;; - 최근 f/t/F/T 명령어 실행&lt;/li&gt;
&lt;li&gt;, - 최근 F/T/f/t 명령어 실행&lt;/li&gt;
&lt;li&gt;} - 다음 단락으로 점프&lt;/li&gt;
&lt;li&gt;{ - 이전 단락으로 점프&lt;/li&gt;
&lt;li&gt;zz - 화면 위치 중간으로 조정&lt;/li&gt;
&lt;li&gt;Ctrl + e - 한 줄 아래로 화면 조정&lt;/li&gt;
&lt;li&gt;Ctrl + y - 한 줄 위로 화면 조정&lt;/li&gt;
&lt;li&gt;Ctrl + b - 한 화면 위로 조정&lt;/li&gt;
&lt;li&gt;Ctrl + f - 한 화면 아래로 조정&lt;/li&gt;
&lt;li&gt;Ctrl + d - 반 화면 아래로 조정&lt;/li&gt;
&lt;li&gt;Ctrl + u - 반 화면 위로 조정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이동 명령 앞에 숫자를 붙이면 그 수만큼 반복합니다.&lt;/p&gt;
&lt;p&gt;4j는 4행 아래로 이동할 수 있습니다.&lt;/p&gt;
&lt;h2&gt;삽입 모드&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;i - 현재 커서 앞에 삽입&lt;/li&gt;
&lt;li&gt;I - 현재 커서 행 시작에 삽입&lt;/li&gt;
&lt;li&gt;a - 현재 커서 뒤에 삽입&lt;/li&gt;
&lt;li&gt;A - 현재 커서 행 끝에 삽입&lt;/li&gt;
&lt;li&gt;o - 현재 커서 행 아래에 새 행을 삽입&lt;/li&gt;
&lt;li&gt;O - 현재 커서 행 위에 새 행을 삽입&lt;/li&gt;
&lt;li&gt;ea - 단어 끝 뒤에 삽입&lt;/li&gt;
&lt;li&gt;Ctrl + h - 이전 문자 제거&lt;/li&gt;
&lt;li&gt;Ctrl + w - 이전 단어 제거&lt;/li&gt;
&lt;li&gt;Ctrl + j - 한 줄 바꿈&lt;/li&gt;
&lt;li&gt;Ctrl + t - 한 탭 들여쓰기&lt;/li&gt;
&lt;li&gt;Ctrl + d - 한 탭 내어쓰기&lt;/li&gt;
&lt;li&gt;Ctrl + n - 다음 단어 탐색 (자동완성)&lt;/li&gt;
&lt;li&gt;Ctrl + p - 이전 단어 탐색 (자동완성)&lt;/li&gt;
&lt;li&gt;Ctrl + rx - 레지스터 x의 내용 삽입&lt;/li&gt;
&lt;li&gt;Esc - 삽입모드 종료&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;편집 모드&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;r - 한 글자 바꾸기&lt;/li&gt;
&lt;li&gt;J - 현재 행과 다음 행 연결&lt;/li&gt;
&lt;li&gt;gJ - 현재 행과 다음 행 연결 (공백무시)&lt;/li&gt;
&lt;li&gt;gwip - 단락 리플로우&lt;/li&gt;
&lt;li&gt;g~ - 커서 이동으로 대·소문자 전환&lt;/li&gt;
&lt;li&gt;gu - 커서 이동으로 소문자 전환&lt;/li&gt;
&lt;li&gt;gU - 커서 이동으로 대문자 전환&lt;/li&gt;
&lt;li&gt;cc - 한 행 전체 새로 쓰기&lt;/li&gt;
&lt;li&gt;C - 한 행 끝까지 새로 쓰기&lt;/li&gt;
&lt;li&gt;c$ - 한 행 끝까지 새로 쓰기&lt;/li&gt;
&lt;li&gt;ciw - 한 단어 전체 새로 쓰기&lt;/li&gt;
&lt;li&gt;cw - 한 단어 끝까지 새로 쓰기&lt;/li&gt;
&lt;li&gt;s - 한 문자 새로 쓰기&lt;/li&gt;
&lt;li&gt;S - 한 행 전체 새로 쓰기 (cc와 동일)&lt;/li&gt;
&lt;li&gt;xp - 잘라내고 붙여넣기&lt;/li&gt;
&lt;li&gt;u - 실행취소&lt;/li&gt;
&lt;li&gt;U - 최근 수정한 줄 복원(실행취소)&lt;/li&gt;
&lt;li&gt;Ctrl + r - 다시실행&lt;/li&gt;
&lt;li&gt;. - 최근 명령어 반복&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;선택 모드 (비주얼 모드)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;v - 비주얼 모드&lt;/li&gt;
&lt;li&gt;V - 비주얼 라인&lt;/li&gt;
&lt;li&gt;o - 선택 영역 반대쪽 끝으로 점프&lt;/li&gt;
&lt;li&gt;Ctrl + v - 비주얼 블록&lt;/li&gt;
&lt;li&gt;O - 블록의 반대쪽 모서리로 이동&lt;/li&gt;
&lt;li&gt;aw - 단어 선택&lt;/li&gt;
&lt;li&gt;ab - 소괄호() 구간 선택&lt;/li&gt;
&lt;li&gt;aB - 중괄호{} 구간 선택&lt;/li&gt;
&lt;li&gt;at - 태그&amp;lt;&amp;gt; 구간 선택&lt;/li&gt;
&lt;li&gt;ib - 소괄호() 내부 선택&lt;/li&gt;
&lt;li&gt;iB - 중괄호{} 내부 선택&lt;/li&gt;
&lt;li&gt;it - 태그&amp;lt;&amp;gt; 내부 선택&lt;/li&gt;
&lt;li&gt;Esc - 선택 모드 종료&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;b 또는 B 대신에 ( 또는 { 사용가능.&lt;/p&gt;
&lt;h2&gt;선택 모드 명령&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&amp;gt; - 선택 행 들여쓰기&lt;/li&gt;
&lt;li&gt;&amp;lt; - 선택 행 내어쓰기&lt;/li&gt;
&lt;li&gt;y - 선택 구간 복사&lt;/li&gt;
&lt;li&gt;d - 선택 구간 삭제&lt;/li&gt;
&lt;li&gt;~ - 대소문자 반전&lt;/li&gt;
&lt;li&gt;u - 선택 구간 소문자 전환&lt;/li&gt;
&lt;li&gt;U - 선택 구간 대문자 전환&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;레지스터&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;:reg[isters] - 레지스터 내용 확인&lt;/li&gt;
&lt;li&gt;&amp;quot;xy - 레지스터 x 복사&lt;/li&gt;
&lt;li&gt;&amp;quot;xp - 레지스터 x 붙여넣기&lt;/li&gt;
&lt;li&gt;&amp;quot;+y - 클립보드 복사&lt;/li&gt;
&lt;li&gt;&amp;quot;+p - 클립보드 붙여넣기&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;레지스터는 ./viminfo에 저장되고, 다음 Vim 재시작 때 다시 읽어들입니다.&lt;/p&gt;
&lt;p&gt;특수 레지스터:&lt;/p&gt;
&lt;p&gt; 0 - 최근 복사 레지스터&lt;br&gt; &amp;quot; - 최근 사용 레지스터&lt;br&gt; % - 현재 파일명&lt;br&gt; # - 대체 파일명&lt;br&gt; * - 클립보드 (X11 primary)&lt;br&gt; + - 클립보드 (X11 clipboard)&lt;br&gt; / - 최근 검색 패턴&lt;br&gt; : - 최근 Vim 명령줄&lt;br&gt; . - 최근 삽입 텍스트&lt;br&gt; - - 최근 제거 문자&lt;br&gt; = - 표현식 레지스터&lt;br&gt; _ - 블랙홀 레지스터&lt;/p&gt;
&lt;h2&gt;마킹&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;:marks - 마킹 항목 표시&lt;/li&gt;
&lt;li&gt;ma - 현재 위치를 a로 마킹&lt;/li&gt;
&lt;li&gt;`a - 마크 a로 점프&lt;/li&gt;
&lt;li&gt;y`a - 마크 a까지 복사&lt;/li&gt;
&lt;li&gt;`0 - 종료 전 커서위치로 점프&lt;/li&gt;
&lt;li&gt;`&amp;quot; - 최근 편집한 커서 위치로 점프&lt;/li&gt;
&lt;li&gt;`. - 최근 변경한 커서 위치로 점프&lt;/li&gt;
&lt;li&gt;`` - 최근 점프 전 위치로 점프&lt;/li&gt;
&lt;li&gt;:ju[mps] - 점프목록&lt;/li&gt;
&lt;li&gt;Ctrl + i - 이전 점프목록 위치로 점프&lt;/li&gt;
&lt;li&gt;Ctrl + o - 다음 점프목록 위치로 점프&lt;/li&gt;
&lt;li&gt;:changes - 변경목록&lt;/li&gt;
&lt;li&gt;g, - 이전 변경목록 위치로 점프&lt;/li&gt;
&lt;li&gt;g; - 다음 변경목록 위치로 점프&lt;/li&gt;
&lt;li&gt;Ctrl + ] - 커서가 가리키는 태그로 점프&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;마킹한 곳으로 점프 시 그레이브 액센트 (`) 또는 아포스트로피 (&amp;#39;) 모두 사용가능합니다. 아포스트로피 사용 시, 마킹한 곳의 줄 머리로 이동합니다. (공백 미포함)&lt;/p&gt;
&lt;h2&gt;매크로&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;qa - 매크로 a 기록 시작&lt;/li&gt;
&lt;li&gt;q - 매크로 기록 중지&lt;/li&gt;
&lt;li&gt;@a - 매크로 a 실행&lt;/li&gt;
&lt;li&gt;@@ - 최근 매크로 재실행&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;잘라내기와 붙여넣기&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;yy - 한 행 복사하기&lt;/li&gt;
&lt;li&gt;2yy - 2줄 복사하기&lt;/li&gt;
&lt;li&gt;yw - 다음 단어까지 복사하기&lt;/li&gt;
&lt;li&gt;y$ - 한 행 끝까지 복사하기&lt;/li&gt;
&lt;li&gt;p - 커서 뒤에 붙여넣기&lt;/li&gt;
&lt;li&gt;P - 커서 앞에 붙여넣기&lt;/li&gt;
&lt;li&gt;dd - 한 행 잘라내기&lt;/li&gt;
&lt;li&gt;2dd - 2줄 잘라내기&lt;/li&gt;
&lt;li&gt;dw - 다음 단어까지 잘라내기&lt;/li&gt;
&lt;li&gt;D - 한 행 끝까지 잘라내기&lt;/li&gt;
&lt;li&gt;d$ - 한 행 끝까지 잘라내기&lt;/li&gt;
&lt;li&gt;x - 한 문자 잘라내기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;문단모양&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&amp;gt;&amp;gt; - 한 탭 들여쓰기&lt;/li&gt;
&lt;li&gt;&amp;lt;&amp;lt; - 한 탭 내어쓰기&lt;/li&gt;
&lt;li&gt;&amp;gt;% - 중·소괄호 구간 들여쓰기&lt;/li&gt;
&lt;li&gt;&amp;gt;ib - 소괄호 내부 들여쓰기&lt;/li&gt;
&lt;li&gt;&amp;gt;at - 태그 구간 들여쓰기&lt;/li&gt;
&lt;li&gt;3== - 3줄 자동정렬&lt;/li&gt;
&lt;li&gt;=% - 중·소괄호 구간 자동정렬&lt;/li&gt;
&lt;li&gt;=iB - 중괄호 내부 자동정렬&lt;/li&gt;
&lt;li&gt;gg=G - 전체 버퍼 자동정렬&lt;/li&gt;
&lt;li&gt;]p - 붙여쓰고 현재 행 들여쓰기 조&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;나가기&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;:w - 저장하기&lt;/li&gt;
&lt;li&gt;:w !sudo tee % - 관리자로 저장하기&lt;/li&gt;
&lt;li&gt;:wq or :x or ZZ - 저장하고 나가기&lt;/li&gt;
&lt;li&gt;:q - 나가기 (변경확인)&lt;/li&gt;
&lt;li&gt;:q! or ZQ - 나가기 (변경무시)&lt;/li&gt;
&lt;li&gt;:wqa - 모든 탭 저장하고 나가기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;검색과 바꾸기&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;/pattern - 패턴 검색 (순방향)&lt;/li&gt;
&lt;li&gt;?pattern - 패턴 검색 (역방향)&lt;/li&gt;
&lt;li&gt;\vpattern - 특수 매직 패턴&lt;/li&gt;
&lt;li&gt;n - 다음 검색항목으로 점프&lt;/li&gt;
&lt;li&gt;N - 이전 검색항목으로 점프&lt;/li&gt;
&lt;li&gt;:%s/old/new/g - 모든 old를 new로 바꾸기&lt;/li&gt;
&lt;li&gt;:%s/old/new/gc - 모든 old를 new로 확인하며 바꾸기&lt;/li&gt;
&lt;li&gt;:noh[lsearch] - 검색 하이라이트 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;여러 파일 검색&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;:vim[grep] /pattern/ {`{file}`} - 여러 파일에서 패턴 검색&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;e.g. :vim[grep] /foo/ **/*&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;:cn[ext] - 다음 검색항목으로 점프&lt;/li&gt;
&lt;li&gt;:cp[revious] - 이전 검색항목으로 점프&lt;/li&gt;
&lt;li&gt;:cope[n] - 일치 목록을 새 창으로 열기&lt;/li&gt;
&lt;li&gt;:ccl[ose] - 일치 목록 창 닫기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;탭&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;:tabnew or :tabnew {page.words.file} - 새 탭에서 파일 열기&lt;/li&gt;
&lt;li&gt;Ctrl + wT - 현재 분할 창을 새로운 탭으로 이동&lt;/li&gt;
&lt;li&gt;gt or :tabn[ext] - 다음 탭으로 이동&lt;/li&gt;
&lt;li&gt;gT or :tabp[revious] - 이전 탭으로 이동&lt;/li&gt;
&lt;li&gt;#gt - #번째 탭으로 이동&lt;/li&gt;
&lt;li&gt;:tabm[ove] # - 현재 탭을 #번째로 이동&lt;/li&gt;
&lt;li&gt;:tabc[lose] - 현재 탭과 그 안의 창들 닫기&lt;/li&gt;
&lt;li&gt;:tabo[nly] - 현재 탭 이외의 모든 탭 닫기&lt;/li&gt;
&lt;li&gt;:tabdo command - 모든 탭에서 command 실행하기 (예를 들어, :tabdo q - 열린 모든 탭 닫기)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;여러 파일 작업&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;:e[dit] file - 새 버퍼에서 파일 편집&lt;/li&gt;
&lt;li&gt;:bn[ext] - 다음 버퍼로 이동&lt;/li&gt;
&lt;li&gt;:bp[revious] - 이전 버퍼로 이동&lt;/li&gt;
&lt;li&gt;:bd[elete] - 버퍼 삭제 (파일 닫기)&lt;/li&gt;
&lt;li&gt;:b[uffer]# - #번째 버퍼로 이동&lt;/li&gt;
&lt;li&gt;:b[uffer] file - 파일명 버퍼로 이동&lt;/li&gt;
&lt;li&gt;:ls or :buffers - 열린 버퍼 모두 나열&lt;/li&gt;
&lt;li&gt;:sp[lit] file - 새 버퍼에 파일 열고 상하로 창 분할&lt;/li&gt;
&lt;li&gt;:vs[plit] file - 새 버퍼에 파일 열고 좌우로 창 분할&lt;/li&gt;
&lt;li&gt;:vert[ical] ba[ll] - 모든 버퍼 열고 좌우로 창 분할&lt;/li&gt;
&lt;li&gt;:tab ba[ll] - 모든 버퍼 열고 탭으로 창 분할&lt;/li&gt;
&lt;li&gt;Ctrl + ws - 상하로 창 분할&lt;/li&gt;
&lt;li&gt;Ctrl + wv - 좌우로 창 분할&lt;/li&gt;
&lt;li&gt;Ctrl + ww - 창 전환&lt;/li&gt;
&lt;li&gt;Ctrl + wq - 창 닫기&lt;/li&gt;
&lt;li&gt;Ctrl + wx - 창 바꾸기&lt;/li&gt;
&lt;li&gt;Ctrl + w= - 모든 창 크기 조정&lt;/li&gt;
&lt;li&gt;Ctrl + wh - 왼쪽 창으로 이동&lt;/li&gt;
&lt;li&gt;Ctrl + wl - 오른쪽 창으로 이동&lt;/li&gt;
&lt;li&gt;Ctrl + wj - 아래 창으로 이동&lt;/li&gt;
&lt;li&gt;Ctrl + wk - 위 창으로 이동&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;비교&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;zf - 폴딩 정의&lt;/li&gt;
&lt;li&gt;zd - 폴드 제거&lt;/li&gt;
&lt;li&gt;za - 폴드 설정&lt;/li&gt;
&lt;li&gt;zo - 폴드 열기&lt;/li&gt;
&lt;li&gt;zc - 폴드 닫기&lt;/li&gt;
&lt;li&gt;zr - 한 단계씩 폴드 열기&lt;/li&gt;
&lt;li&gt;zm - 한 단계씩 폴드 접기&lt;/li&gt;
&lt;li&gt;zi - 스마트 폴딩&lt;/li&gt;
&lt;li&gt;]c - 다음 수정으로 점프&lt;/li&gt;
&lt;li&gt;[c - 이전 수정으로 점프&lt;/li&gt;
&lt;li&gt;do or :diffg[et] - 다른 버퍼에서 차이점 얻기&lt;/li&gt;
&lt;li&gt;dp or :diffpu[t] - 다른 버퍼로 차이점 보내기&lt;/li&gt;
&lt;li&gt;:diffthis - 현재 창 비교모드 열기&lt;/li&gt;
&lt;li&gt;:dif[fupdate] - 비교모드 새로고침&lt;/li&gt;
&lt;li&gt;:diffo[ff] - 현재 창 비교모드 닫가&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;폴딩 명령어 (e.g. za)는 한 단계씩 작동합니다. 전체 단계에서 폴딩하기를 원하신다면 대문자 (e.g. zA)를 사용해야합니다.&lt;/p&gt;
&lt;p&gt;Terminal에서 vimdiff로 실행하면, 비교모드로 Vim을 시작할 수 있습니다. 이것은 git difftool를 통해서도 확인하실 수 있습니다.&lt;/p&gt;</description>
      <category>Vim</category>
      <category>MacOS</category>
      <category>VIM</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/56</guid>
      <comments>https://sukvvon.tistory.com/56#entry56comment</comments>
      <pubDate>Sun, 16 May 2021 23:31:51 +0900</pubDate>
    </item>
    <item>
      <title>[Git] oh-my-zsh에서 활용할 수 있는 git 단축어 모음집</title>
      <link>https://sukvvon.tistory.com/55</link>
      <description>&lt;div class=&quot;markdown-body&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/ohmyzsh/ohmyzsh/wiki/Cheatsheet&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/ohmyzsh/ohmyzsh/wiki/Cheatsheet&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1621173631008&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;ohmyzsh/ohmyzsh&quot; data-og-description=&quot;  A delightful community-driven (with 1800+ contributors) framework for managing your zsh configuration. Includes nearly 300 optional plugins (rails, git, OSX, hub, docker, homebrew, node, php, p...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ohmyzsh/ohmyzsh/wiki/Cheatsheet&quot; data-og-url=&quot;https://github.com/ohmyzsh/ohmyzsh&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bBtW7O/hyKdMJVYww/DlcZCBiR2ApzGo6KXWRWlK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/eEmIqh/hyKdGJxMel/9yF2KinzKQCpwJXoXaxwaK/img.png?width=633&amp;amp;height=346&amp;amp;face=0_0_633_346,https://scrap.kakaocdn.net/dn/dbzXmi/hyKdHu3DkG/hHQFf7oOKOLLxkvqc5KkB0/img.png?width=337&amp;amp;height=208&amp;amp;face=0_0_337_208&quot;&gt;&lt;a href=&quot;https://github.com/ohmyzsh/ohmyzsh/wiki/Cheatsheet&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/ohmyzsh/ohmyzsh/wiki/Cheatsheet&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bBtW7O/hyKdMJVYww/DlcZCBiR2ApzGo6KXWRWlK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/eEmIqh/hyKdGJxMel/9yF2KinzKQCpwJXoXaxwaK/img.png?width=633&amp;amp;height=346&amp;amp;face=0_0_633_346,https://scrap.kakaocdn.net/dn/dbzXmi/hyKdHu3DkG/hHQFf7oOKOLLxkvqc5KkB0/img.png?width=337&amp;amp;height=208&amp;amp;face=0_0_337_208');&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;ohmyzsh/ohmyzsh&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  A delightful community-driven (with 1800+ contributors) framework for managing your zsh configuration. Includes nearly 300 optional plugins (rails, git, OSX, hub, docker, homebrew, node, php, p...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Git&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;g&lt;/td&gt;
&lt;td&gt;git&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ga&lt;/td&gt;
&lt;td&gt;git add&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gau&lt;/td&gt;
&lt;td&gt;git add --update (Also: &quot;git add -u&quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gaa&lt;/td&gt;
&lt;td&gt;git add --all&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gapa&lt;/td&gt;
&lt;td&gt;git add --patch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gb&lt;/td&gt;
&lt;td&gt;git branch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gba&lt;/td&gt;
&lt;td&gt;git branch -a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gbd&lt;/td&gt;
&lt;td&gt;git branch -d&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gbda&lt;/td&gt;
&lt;td&gt;git branch --no-color --merged | command grep -vE &quot;^(+|*|\s*($(git_main_branch)|development|develop|devel|dev)\s*$)&quot; | command xargs -n 1 git branch -d&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gbl&lt;/td&gt;
&lt;td&gt;git blame -b -w&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gbnm&lt;/td&gt;
&lt;td&gt;git branch --no-merged&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gbr&lt;/td&gt;
&lt;td&gt;git branch --remote&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gbs&lt;/td&gt;
&lt;td&gt;git bisect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gbsb&lt;/td&gt;
&lt;td&gt;git bisect bad&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gbsg&lt;/td&gt;
&lt;td&gt;git bisect good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gbsr&lt;/td&gt;
&lt;td&gt;git bisect reset&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gbss&lt;/td&gt;
&lt;td&gt;git bisect start&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gc&lt;/td&gt;
&lt;td&gt;git commit -v&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gc!&lt;/td&gt;
&lt;td&gt;git commit -v --amend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gca&lt;/td&gt;
&lt;td&gt;git commit -v -a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gca!&lt;/td&gt;
&lt;td&gt;git commit -v -a --amend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gcan!&lt;/td&gt;
&lt;td&gt;git commit -v -a --no-edit --amend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gcans!&lt;/td&gt;
&lt;td&gt;git commit -v -a -s --no-edit --amend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gcam&lt;/td&gt;
&lt;td&gt;git commit -a -m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gcsm&lt;/td&gt;
&lt;td&gt;git commit -s -m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gcb&lt;/td&gt;
&lt;td&gt;git checkout -b&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gcf&lt;/td&gt;
&lt;td&gt;git config --list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gcl&lt;/td&gt;
&lt;td&gt;git clone --recurse-submodules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gclean&lt;/td&gt;
&lt;td&gt;git clean -id&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpristine&lt;/td&gt;
&lt;td&gt;git reset --hard &amp;amp;&amp;amp; git clean -dffx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gcm&lt;/td&gt;
&lt;td&gt;git checkout $(git_main_branch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gcd&lt;/td&gt;
&lt;td&gt;git checkout develop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gcmsg&lt;/td&gt;
&lt;td&gt;git commit -m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gco&lt;/td&gt;
&lt;td&gt;git checkout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gcount&lt;/td&gt;
&lt;td&gt;git shortlog -sn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gcp&lt;/td&gt;
&lt;td&gt;git cherry-pick&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gcpa&lt;/td&gt;
&lt;td&gt;git cherry-pick --abort&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gcpc&lt;/td&gt;
&lt;td&gt;git cherry-pick --continue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gcs&lt;/td&gt;
&lt;td&gt;git commit -S&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gd&lt;/td&gt;
&lt;td&gt;git diff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gdca&lt;/td&gt;
&lt;td&gt;git diff --cached&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gdct&lt;/td&gt;
&lt;td&gt;git describe --tags `git rev-list --tags --max-count=1`&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gds&lt;/td&gt;
&lt;td&gt;git diff --staged&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gdt&lt;/td&gt;
&lt;td&gt;git diff-tree --no-commit-id --name-only -r&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gdw&lt;/td&gt;
&lt;td&gt;git diff --word-diff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gf&lt;/td&gt;
&lt;td&gt;git fetch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gfa&lt;/td&gt;
&lt;td&gt;git fetch --all --prune&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gfo&lt;/td&gt;
&lt;td&gt;git fetch origin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gg&lt;/td&gt;
&lt;td&gt;git gui citool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gga&lt;/td&gt;
&lt;td&gt;git gui citool --amend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ggpnp&lt;/td&gt;
&lt;td&gt;git pull origin $(current_branch) &amp;amp;&amp;amp; git push origin $(current_branch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ggpull&lt;/td&gt;
&lt;td&gt;git pull origin $(current_branch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ggl&lt;/td&gt;
&lt;td&gt;git pull origin $(current_branch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ggpur&lt;/td&gt;
&lt;td&gt;git pull --rebase origin $(current_branch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ggu&lt;/td&gt;
&lt;td&gt;git pull --rebase origin $(current_branch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;glum&lt;/td&gt;
&lt;td&gt;git pull upstream $(git_main_branch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ggpush&lt;/td&gt;
&lt;td&gt;git push origin $(current_branch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ggp&lt;/td&gt;
&lt;td&gt;git push origin $(current_branch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ggfl&lt;/td&gt;
&lt;td&gt;git push --force-with-lease origin &amp;lt;your_argument&amp;gt;/$(current_branch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ggsup&lt;/td&gt;
&lt;td&gt;git branch --set-upstream-to=origin/$(current_branch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpsup&lt;/td&gt;
&lt;td&gt;git push --set-upstream origin $(current_branch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ghh&lt;/td&gt;
&lt;td&gt;git help&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gignore&lt;/td&gt;
&lt;td&gt;git update-index --assume-unchanged&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gignored&lt;/td&gt;
&lt;td&gt;git ls-files -v&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git-svn-dcommit-push&lt;/td&gt;
&lt;td&gt;git svn dcommit &amp;amp;&amp;amp; git push github master:svntrunk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gk&lt;/td&gt;
&lt;td&gt;\gitk --all --branches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gke&lt;/td&gt;
&lt;td&gt;\gitk --all $(git log -g --pretty=%h)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gl&lt;/td&gt;
&lt;td&gt;git pull&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;glg&lt;/td&gt;
&lt;td&gt;git log --stat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;glgg&lt;/td&gt;
&lt;td&gt;git log --graph&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;glgga&lt;/td&gt;
&lt;td&gt;git log --graph --decorate --all&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;glgm&lt;/td&gt;
&lt;td&gt;git log --graph --max-count=10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;glgp&lt;/td&gt;
&lt;td&gt;git log --stat -p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;glo&lt;/td&gt;
&lt;td&gt;git log --oneline --decorate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;glog&lt;/td&gt;
&lt;td&gt;git log --oneline --decorate --graph&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;glol&lt;/td&gt;
&lt;td&gt;git log --graph --pretty=\'%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)&amp;lt;%an&amp;gt;%Creset\'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;glola&lt;/td&gt;
&lt;td&gt;git log --graph --pretty=\'%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)&amp;lt;%an&amp;gt;%Creset\' --all&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;glp&lt;/td&gt;
&lt;td&gt;_git_log_prettily (Also: &quot;git log --pretty=$1&quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gm&lt;/td&gt;
&lt;td&gt;git merge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gma&lt;/td&gt;
&lt;td&gt;git merge --abort&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gmom&lt;/td&gt;
&lt;td&gt;git merge origin/$(git_main_branch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gmt&lt;/td&gt;
&lt;td&gt;git mergetool --no-prompt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gmtvim&lt;/td&gt;
&lt;td&gt;git mergetool --no-prompt --tool=vimdiff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gmum&lt;/td&gt;
&lt;td&gt;git merge upstream/$(git_main_branch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gp&lt;/td&gt;
&lt;td&gt;git push&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpd&lt;/td&gt;
&lt;td&gt;git push --dry-run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpoat&lt;/td&gt;
&lt;td&gt;git push origin --all &amp;amp;&amp;amp; git push origin --tags&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpu&lt;/td&gt;
&lt;td&gt;git push upstream&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpv&lt;/td&gt;
&lt;td&gt;git push -v&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gr&lt;/td&gt;
&lt;td&gt;git remote&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gra&lt;/td&gt;
&lt;td&gt;git remote add&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grb&lt;/td&gt;
&lt;td&gt;git rebase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grba&lt;/td&gt;
&lt;td&gt;git rebase --abort&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grbc&lt;/td&gt;
&lt;td&gt;git rebase --continue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grbd&lt;/td&gt;
&lt;td&gt;git rebase develop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grbi&lt;/td&gt;
&lt;td&gt;git rebase -i&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grbm&lt;/td&gt;
&lt;td&gt;git rebase $(git_main_branch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grbs&lt;/td&gt;
&lt;td&gt;git rebase --skip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grh&lt;/td&gt;
&lt;td&gt;git reset (Also: &quot;git reset HEAD&quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grhh&lt;/td&gt;
&lt;td&gt;git reset --hard (Also: &quot;git reset HEAD --hard&quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grmv&lt;/td&gt;
&lt;td&gt;git remote rename&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grrm&lt;/td&gt;
&lt;td&gt;git remote remove&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grs&lt;/td&gt;
&lt;td&gt;git restore&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grset&lt;/td&gt;
&lt;td&gt;git remote set-url&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grt&lt;/td&gt;
&lt;td&gt;cd $(git rev-parse --show-toplevel || echo &quot;.&quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gru&lt;/td&gt;
&lt;td&gt;git reset --&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grup&lt;/td&gt;
&lt;td&gt;git remote update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grv&lt;/td&gt;
&lt;td&gt;git remote -v&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gsb&lt;/td&gt;
&lt;td&gt;git status -sb&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gsd&lt;/td&gt;
&lt;td&gt;git svn dcommit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gsi&lt;/td&gt;
&lt;td&gt;git submodule init&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gsps&lt;/td&gt;
&lt;td&gt;git show --pretty=short --show-signature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gsr&lt;/td&gt;
&lt;td&gt;git svn rebase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gss&lt;/td&gt;
&lt;td&gt;git status -s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gst&lt;/td&gt;
&lt;td&gt;git status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gsta&lt;/td&gt;
&lt;td&gt;git stash push&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gstaa&lt;/td&gt;
&lt;td&gt;git stash apply&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gstd&lt;/td&gt;
&lt;td&gt;git stash drop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gstl&lt;/td&gt;
&lt;td&gt;git stash list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gstp&lt;/td&gt;
&lt;td&gt;git stash pop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gstc&lt;/td&gt;
&lt;td&gt;git stash clear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gsts&lt;/td&gt;
&lt;td&gt;git stash show --text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gsu&lt;/td&gt;
&lt;td&gt;git submodule update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gts&lt;/td&gt;
&lt;td&gt;git tag -s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gunignore&lt;/td&gt;
&lt;td&gt;git update-index --no-assume-unchanged&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gunwip&lt;/td&gt;
&lt;td&gt;git log -n 1 | grep -q -c &quot;--wip--&quot; &amp;amp;&amp;amp; git reset HEAD~1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gup&lt;/td&gt;
&lt;td&gt;git pull --rebase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gupv&lt;/td&gt;
&lt;td&gt;git pull --rebase -v&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gvt&lt;/td&gt;
&lt;td&gt;git verify-tag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gwch&lt;/td&gt;
&lt;td&gt;git whatchanged -p --abbrev-commit --pretty=medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gwip&lt;/td&gt;
&lt;td&gt;git add -A; git rm $(git ls-files --deleted) 2&amp;gt; /dev/null; git commit --no-verify --no-gpg-sign -m &quot;--wip-- [skip ci]&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;존재한다는 것은 알고 있었지만 이렇게 많을 줄은 몰랐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;활용해서 익숙해지도록 해야겠다.&lt;/p&gt;
&lt;/div&gt;</description>
      <category>Git</category>
      <category>git</category>
      <category>oh-my-zsh</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/55</guid>
      <comments>https://sukvvon.tistory.com/55#entry55comment</comments>
      <pubDate>Sun, 16 May 2021 23:04:28 +0900</pubDate>
    </item>
    <item>
      <title>[MacOS] Terminal을 예쁘게 사용하자 asciiquarium</title>
      <link>https://sukvvon.tistory.com/54</link>
      <description>&lt;h2&gt;asciiquarium 설치하기&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/05/16/k7fqn3WEVjwXxu5.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew install asciiquarium&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;brew install asciiquarium&lt;/code&gt;을 통해 asciiquarium을 설치합니다.&lt;/p&gt;
&lt;h2&gt;asciiquarium 실행하기&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/05/16/CBhjlGDSbNEkqPr.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;asciiquarium &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Terminal에 &lt;code&gt;asciiquarium&lt;/code&gt;을 입력합니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/05/16/sfPeNlzKtFjmxRn.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;다음과 같이 이쁘게 실행되는 것을 볼 수 있습니다.&lt;/p&gt;
&lt;h2&gt;asciiquarium 명령어 모음&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/05/16/LHgz9J4Sy7eRU5k.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;README.md 파일을 참고하자면 &lt;code&gt;asciiquarium&lt;/code&gt; 명령어는 딱 세 가지가 있습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;q&lt;/code&gt; = quit -&amp;gt; 나가기&lt;/li&gt;
&lt;li&gt;&lt;code&gt;r&lt;/code&gt; = redraw (will recreate all entities) -&amp;gt; 새로고침&lt;/li&gt;
&lt;li&gt;&lt;code&gt;p&lt;/code&gt; = toggle pause -&amp;gt; 멈춤&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;참고해서 활용하면 작업하는 환경에서 심심하지 않고 좋을 것 같습니다.&lt;/p&gt;</description>
      <category>macOS</category>
      <category>asciiquarium</category>
      <category>MacOS</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/54</guid>
      <comments>https://sukvvon.tistory.com/54#entry54comment</comments>
      <pubDate>Sun, 16 May 2021 10:19:43 +0900</pubDate>
    </item>
    <item>
      <title>[MacOS] Terminal을 예쁘게 사용하기 cowsay, fortune</title>
      <link>https://sukvvon.tistory.com/53</link>
      <description>&lt;h2&gt;cowsay&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.wikiwand.com/en/Cowsay&quot;&gt;https://www.wikiwand.com/en/Cowsay&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/tnalpgge/rank-amateur-cowsay&quot;&gt;https://github.com/tnalpgge/rank-amateur-cowsay&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;brew home cowsay&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Cowsay는 terminal에서 ASCII아트 메시지와 함께 소를 그린 그림을 출력하게 해주는 프로그램입니다.&lt;/p&gt;
&lt;h3&gt;cowsay 설치하기&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/05/15/Ofij7WDXgG3yBkK.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew install cowsay&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;우선 brew를 이용하여 cowsay를 설치합니다.&lt;/p&gt;
&lt;h3&gt;cowsay 출력하기&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/05/15/7pLbtKxW61luoyB.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;cowsay hello world!&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;다음과 같이 cowsay가 출력되는 모습을 볼 수 있습니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/05/15/RXgpJBG4MY6fdO2.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;cowsay hello world | lolcat&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://sukvvon.tistory.com/48&quot;&gt;lolcat&lt;/a&gt;을 활용한다면 색을 입혀서 이쁘게 할 수 있습니다.&lt;/p&gt;
&lt;h2&gt;fortune&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ibiblio.org/pub/linux/games/amusements/fortune/!INDEX.html&quot;&gt;https://www.ibiblio.org/pub/linux/games/amusements/fortune/!INDEX.html&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;brew home fortune&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;fortune은 전세계에 존재하는 명언을 모아놓은 프로그램입니다.&lt;/p&gt;
&lt;h3&gt;fortune 설치하기&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/05/15/uLelF3XabAxdmKQ.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew install fortune&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;brew를 이용하여 fortune 설치를 합니다.&lt;/p&gt;
&lt;h2&gt;cowsay와 fortune 활용하기&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/05/15/xWfdpjVDrJATnI4.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;fortune | cowsay | lolcat&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;fortune과 cowsay와 lolcat을 활용하면 다음과 같이 출력을 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;cowsay와 fortune 모두 다 많은 옵션이 있지만 그 중에서도 가장 활용도가 높은 것 위주로 설명을 하려고 합니다.&lt;/p&gt;
&lt;h3&gt;fortune -s&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/05/15/2mI1fipSBJscC6v.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;fortune -s | cowsay -f dragon-and-cow | lolcat&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같은 문장을 예로 들어보겠습니다.&lt;/p&gt;
&lt;p&gt;fortune의 -s 는 여러 fortune 중 짧은 문장만 출력을 해주는 것입니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/05/15/i7HpBdjbPYNVTAl.png&quot;&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;-s&lt;/code&gt; 옵션을 제거 한 경우&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;긴 문장 짧은 문장 무작위로 출력되지만 위 사진과 같이 긴 문장이 출력 될 수 있는 것을 볼 수 있습니다.&lt;/p&gt;
&lt;h3&gt;cowsay -f&lt;/h3&gt;
&lt;p&gt;-f 를 이용하면 cow 외에 다른 동물이나 형상으로 표현이 가능합니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/05/15/emHSs2ibY3yPKza.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;cd /usr/local/share/cows

ls&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;사용 가능한 형상 리스트&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;위 사진과 같이 &lt;code&gt;cd /usr/local/share/cows&lt;/code&gt; 를 하면 cow를 제외하고 대체 가능한 목록들이 나오는데 &lt;code&gt;.cow&lt;/code&gt; 파일을 -f 뒤에 입력을 하면 그 형상이 나옵니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/05/15/sYAExr5CQGjZ3Le.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;fortune -s | cowsay -f daemon | lolcat
fortune -s | cowsay -f bud-frogs | lolcat&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;daemon.cow&lt;/code&gt; 와 &lt;code&gt;bud-frogs.cow&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;위 사진과 같이 다양하게 활용이 가능합니다.&lt;/p&gt;
&lt;h3&gt;fortune 원하는 종류만 출력하기&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/05/15/laHT8t6gKfc5Zs4.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;cd /usr/local/share/games/fortunes
ls&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;명령어를 사용하여 이동 후 &lt;code&gt;.dat&lt;/code&gt; 파일이 아닌 확장자가 붙지 않은 파일 을 활용하면 됩니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/05/15/Vw5WzIJo9cyUqCL.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;fortune -s computers | cowsay -f daemon | lolcat&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;computers 옵션을 사용한 모습&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;computer 관련 fortune만 출력되는 것을 볼 수 있습니다.&lt;/p&gt;
&lt;h2&gt;terminal(iterm2) 를 키면 바로 나올 수 있게 하기&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/05/15/QgaVBmRqoec6x4u.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;vi ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Vim 에디터가 서툴다면 &lt;code&gt;code ~/.zshrc&lt;/code&gt; 를 할 것을 추천합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;vi ~/.zshrc&lt;/code&gt; 를 하거나 vscode를 사용하는 경우 &lt;code&gt;code ~/.zshrc&lt;/code&gt; 명령어를 입력하여 파일을 엽니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;fortune -s | cowsay -f dragon-and-cow | lolcat&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같은 문장 혹은 자신이 원하는 설정을 포함한 문장을 &lt;code&gt;~/.zshrc&lt;/code&gt; 파일 하단에 추가합니다.&lt;/p&gt;
&lt;p&gt;그리고 &lt;code&gt;:wq&lt;/code&gt; 를 사용하여 저장 후 빠져나옵니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/05/15/ECybrWp34tsXkRL.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;source ~/.zshrc &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그 후 다음과 같은 명령어를 입력하여 변동사항이 있는 &lt;code&gt;~/.zhsrc&lt;/code&gt; 를 활성화합니다.&lt;/p&gt;
&lt;p&gt;다시 터미널을 열면 자동적으로 출력되는 것을 확인할 수 있습니다.&lt;/p&gt;</description>
      <category>macOS</category>
      <category>cowsay</category>
      <category>fortune</category>
      <category>MacOS</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/53</guid>
      <comments>https://sukvvon.tistory.com/53#entry53comment</comments>
      <pubDate>Sat, 15 May 2021 13:44:23 +0900</pubDate>
    </item>
    <item>
      <title>[Vim] vim의 vimrc 기똥차게 설정하기</title>
      <link>https://sukvvon.tistory.com/51</link>
      <description>&lt;h2&gt;vimrc 란?&lt;/h2&gt;
&lt;p&gt;vimrc 파일은 vim 에디터의 설정을 사용자가 원하는대로 컨트롤 할 수 있는 파일입니다. 굳이 플러그인을 설치를 하지 않아도 &lt;code&gt;~/.vimrc&lt;/code&gt; 파일을 수정함으로써 멋지게 사용할 수 있습니다.&lt;/p&gt;
&lt;h2&gt;amix/vimrc&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/amix/vimrc&quot;&gt;https://github.com/amix/vimrc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;간단하게 vimrc를 사용자에 맞게 설정을 하나하나 작성하면서 할 수 있지만 vim은 워낙 유명한 에디터이기에 위 사이트와 같이 설정해 놓으신 분이 계십니다.&lt;/p&gt;
&lt;p&gt;필자는 이 분의 사이트를 참고할 것입니다.&lt;/p&gt;
&lt;h3&gt;Awesome 버전&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/09/09/N5MXc8HCByoed4L.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime
sh ~/.vim_runtime/install_awesome_vimrc.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;자신의 맥에서만 사용할 경우 이 코드를 입력하면 됩니다.&lt;/p&gt;
&lt;h3&gt;Basic 버전&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/ROcFe/btq4JvW1iq1/eKG74oQKpp6kHWkwaYwdpk/img.png&quot;&gt;
&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime
sh ~/.vim_runtime/install_basic_vimrc.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Awesome 버전까진 필요가 없고 기본적인 것만 원한다면 이 코드를 입력하면 됩니다.&lt;/p&gt;
&lt;h3&gt;basic.vim&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/bZPdQr/btq4H9GPcge/DWuNmfnMLiXleeEJR8YZb1/img.png&quot;&gt;
&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;The Basic: If you want something small just copy basic.vim into your ~/.vimrc and you will have a good basic setup&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;적은 효과만 원한다면 basic.vim을 복사한 후 붙여넣기를 하면 됩니다.&lt;/p&gt;
&lt;h3&gt;버전 업데이트&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/cdaRsi/btq4HObScSq/TwZ9qHvfBbtv4b1bqafTqk/img.png&quot;&gt;
&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;cd ~/.vim_runtime
git pull --rebase
python update_plugins.py&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;업데이트를 원한다면 다음과 같은 코드를 입력하면 됩니다.&lt;/p&gt;
&lt;h3&gt;amid/vimrc 삭제하기&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/bVqSVt/btq4NKFik1K/ozXdVn9l2iQ42Lkqxzxva1/img.png&quot;&gt;
&lt;/p&gt;


&lt;p&gt;다음 사진에서 하라는 대로 하면 삭제가 가능합니다.&lt;/p&gt;
&lt;h2&gt;basic.vim 복사하고 설정하기&lt;/h2&gt;
&lt;p&gt;필자는 vim을 통해서 코딩을 할 것까진 아니기 때문에 bascic.vim을 복사할 것입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;vi ~/.vimrc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;우선 자신의 홈 디렉토리의 vimrc 파일로 이동을 합니다. 반드시 홈 디렉토리여야만 합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; Maintainer: 
&amp;quot;       Amir Salihefendic — @amix3k
&amp;quot;
&amp;quot; Awesome_version:
&amp;quot;       Get this config, nice color schemes and lots of plugins!
&amp;quot;
&amp;quot;       Install the awesome version from:
&amp;quot;
&amp;quot;           https://github.com/amix/vimrc
&amp;quot;
&amp;quot; Sections:
&amp;quot;    -&amp;gt; General
&amp;quot;    -&amp;gt; VIM user interface
&amp;quot;    -&amp;gt; Colors and Fonts
&amp;quot;    -&amp;gt; Files and backups
&amp;quot;    -&amp;gt; Text, tab and indent related
&amp;quot;    -&amp;gt; Visual mode related
&amp;quot;    -&amp;gt; Moving around, tabs and buffers
&amp;quot;    -&amp;gt; Status line
&amp;quot;    -&amp;gt; Editing mappings
&amp;quot;    -&amp;gt; vimgrep searching and cope displaying
&amp;quot;    -&amp;gt; Spell checking
&amp;quot;    -&amp;gt; Misc
&amp;quot;    -&amp;gt; Helper functions
&amp;quot;
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;


&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; =&amp;gt; General
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; Sets how many lines of history VIM has to remember
set history=500

&amp;quot; Enable filetype plugins
filetype plugin on
filetype indent on

&amp;quot; Set to auto read when a file is changed from the outside
set autoread
au FocusGained,BufEnter * checktime

&amp;quot; With a map leader it&amp;#39;s possible to do extra key combinations
&amp;quot; like &amp;lt;leader&amp;gt;w saves the current file
let mapleader = &amp;quot;,&amp;quot;

&amp;quot; Fast saving
nmap &amp;lt;leader&amp;gt;w :w!&amp;lt;cr&amp;gt;

&amp;quot; :W sudo saves the file 
&amp;quot; (useful for handling the permission-denied error)
command! W execute &amp;#39;w !sudo tee % &amp;gt; /dev/null&amp;#39; &amp;lt;bar&amp;gt; edit!


&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; =&amp;gt; VIM user interface
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; Set 7 lines to the cursor - when moving vertically using j/k
set so=7

&amp;quot; Avoid garbled characters in Chinese language windows OS
let $LANG=&amp;#39;en&amp;#39; 
set langmenu=en
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim

&amp;quot; Turn on the Wild menu
set wildmenu

&amp;quot; Ignore compiled files
set wildignore=*.o,*~,*.pyc
if has(&amp;quot;win16&amp;quot;) || has(&amp;quot;win32&amp;quot;)
    set wildignore+=.git\*,.hg\*,.svn\*
else
    set wildignore+=*/.git/*,*/.hg/*,*/.svn/*,*/.DS_Store
endif

&amp;quot;Always show current position
set ruler

&amp;quot; Height of the command bar
set cmdheight=1

&amp;quot; A buffer becomes hidden when it is abandoned
set hid

&amp;quot; Configure backspace so it acts as it should act
set backspace=eol,start,indent
set whichwrap+=&amp;lt;,&amp;gt;,h,l

&amp;quot; Ignore case when searching
set ignorecase

&amp;quot; When searching try to be smart about cases 
set smartcase

&amp;quot; Highlight search results
set hlsearch

&amp;quot; Makes search act like search in modern browsers
set incsearch 

&amp;quot; Don&amp;#39;t redraw while executing macros (good performance config)
set lazyredraw 

&amp;quot; For regular expressions turn magic on
set magic

&amp;quot; Show matching brackets when text indicator is over them
set showmatch 
&amp;quot; How many tenths of a second to blink when matching brackets
set mat=2

&amp;quot; No annoying sound on errors
set noerrorbells
set novisualbell
set t_vb=
set tm=500

&amp;quot; Properly disable sound on errors on MacVim
if has(&amp;quot;gui_macvim&amp;quot;)
    autocmd GUIEnter * set vb t_vb=
endif


&amp;quot; Add a bit extra margin to the left
set foldcolumn=1


&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; =&amp;gt; Colors and Fonts
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; Enable syntax highlighting
syntax enable 

&amp;quot; Enable 256 colors palette in Gnome Terminal
if $COLORTERM == &amp;#39;gnome-terminal&amp;#39;
    set t_Co=256
endif

try
    colorscheme desert
catch
endtry

set background=dark

&amp;quot; Set extra options when running in GUI mode
if has(&amp;quot;gui_running&amp;quot;)
    set guioptions-=T
    set guioptions-=e
    set t_Co=256
    set guitablabel=%M\ %t
endif

&amp;quot; Set utf8 as standard encoding and en_US as the standard language
set encoding=utf8

&amp;quot; Use Unix as the standard file type
set ffs=unix,dos,mac


&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; =&amp;gt; Files, backups and undo
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; Turn backup off, since most stuff is in SVN, git etc. anyway...
set nobackup
set nowb
set noswapfile


&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; =&amp;gt; Text, tab and indent related
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; Use spaces instead of tabs
set expandtab

&amp;quot; Be smart when using tabs ;)
set smarttab

&amp;quot; 1 tab == 4 spaces
set shiftwidth=4
set tabstop=4

&amp;quot; Linebreak on 500 characters
set lbr
set tw=500

set ai &amp;quot;Auto indent
set si &amp;quot;Smart indent
set wrap &amp;quot;Wrap lines


&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; =&amp;gt; Visual mode related
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; Visual mode pressing * or # searches for the current selection
&amp;quot; Super useful! From an idea by Michael Naumann
vnoremap &amp;lt;silent&amp;gt; * :&amp;lt;C-u&amp;gt;call VisualSelection(&amp;#39;&amp;#39;, &amp;#39;&amp;#39;)&amp;lt;CR&amp;gt;/&amp;lt;C-R&amp;gt;=@/&amp;lt;CR&amp;gt;&amp;lt;CR&amp;gt;
vnoremap &amp;lt;silent&amp;gt; # :&amp;lt;C-u&amp;gt;call VisualSelection(&amp;#39;&amp;#39;, &amp;#39;&amp;#39;)&amp;lt;CR&amp;gt;?&amp;lt;C-R&amp;gt;=@/&amp;lt;CR&amp;gt;&amp;lt;CR&amp;gt;


&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; =&amp;gt; Moving around, tabs, windows and buffers
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; Map &amp;lt;Space&amp;gt; to / (search) and Ctrl-&amp;lt;Space&amp;gt; to ? (backwards search)
map &amp;lt;space&amp;gt; /
map &amp;lt;C-space&amp;gt; ?

&amp;quot; Disable highlight when &amp;lt;leader&amp;gt;&amp;lt;cr&amp;gt; is pressed
map &amp;lt;silent&amp;gt; &amp;lt;leader&amp;gt;&amp;lt;cr&amp;gt; :noh&amp;lt;cr&amp;gt;

&amp;quot; Smart way to move between windows
map &amp;lt;C-j&amp;gt; &amp;lt;C-W&amp;gt;j
map &amp;lt;C-k&amp;gt; &amp;lt;C-W&amp;gt;k
map &amp;lt;C-h&amp;gt; &amp;lt;C-W&amp;gt;h
map &amp;lt;C-l&amp;gt; &amp;lt;C-W&amp;gt;l

&amp;quot; Close the current buffer
map &amp;lt;leader&amp;gt;bd :Bclose&amp;lt;cr&amp;gt;:tabclose&amp;lt;cr&amp;gt;gT

&amp;quot; Close all the buffers
map &amp;lt;leader&amp;gt;ba :bufdo bd&amp;lt;cr&amp;gt;

map &amp;lt;leader&amp;gt;l :bnext&amp;lt;cr&amp;gt;
map &amp;lt;leader&amp;gt;h :bprevious&amp;lt;cr&amp;gt;

&amp;quot; Useful mappings for managing tabs
map &amp;lt;leader&amp;gt;tn :tabnew&amp;lt;cr&amp;gt;
map &amp;lt;leader&amp;gt;to :tabonly&amp;lt;cr&amp;gt;
map &amp;lt;leader&amp;gt;tc :tabclose&amp;lt;cr&amp;gt;
map &amp;lt;leader&amp;gt;tm :tabmove 
map &amp;lt;leader&amp;gt;t&amp;lt;leader&amp;gt; :tabnext 

&amp;quot; Let &amp;#39;tl&amp;#39; toggle between this and the last accessed tab
let g:lasttab = 1
nmap &amp;lt;Leader&amp;gt;tl :exe &amp;quot;tabn &amp;quot;.g:lasttab&amp;lt;CR&amp;gt;
au TabLeave * let g:lasttab = tabpagenr()


&amp;quot; Opens a new tab with the current buffer&amp;#39;s path
&amp;quot; Super useful when editing files in the same directory
map &amp;lt;leader&amp;gt;te :tabedit &amp;lt;C-r&amp;gt;=expand(&amp;quot;%:p:h&amp;quot;)&amp;lt;cr&amp;gt;/

&amp;quot; Switch CWD to the directory of the open buffer
map &amp;lt;leader&amp;gt;cd :cd %:p:h&amp;lt;cr&amp;gt;:pwd&amp;lt;cr&amp;gt;

&amp;quot; Specify the behavior when switching between buffers 
try
  set switchbuf=useopen,usetab,newtab
  set stal=2
catch
endtry

&amp;quot; Return to last edit position when opening files (You want this!)
au BufReadPost * if line(&amp;quot;&amp;#39;\&amp;quot;&amp;quot;) &amp;gt; 1 &amp;amp;&amp;amp; line(&amp;quot;&amp;#39;\&amp;quot;&amp;quot;) &amp;lt;= line(&amp;quot;$&amp;quot;) | exe &amp;quot;normal! g&amp;#39;\&amp;quot;&amp;quot; | endif


&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; =&amp;gt; Status line
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; Always show the status line
set laststatus=2

&amp;quot; Format the status line
set statusline=\ %{HasPaste()}%F%m%r%h\ %w\ \ CWD:\ %r%{getcwd()}%h\ \ \ Line:\ %l\ \ Column:\ %c


&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; =&amp;gt; Editing mappings
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; Remap VIM 0 to first non-blank character
map 0 ^

&amp;quot; Move a line of text using ALT+[jk] or Command+[jk] on mac
nmap &amp;lt;M-j&amp;gt; mz:m+&amp;lt;cr&amp;gt;`z
nmap &amp;lt;M-k&amp;gt; mz:m-2&amp;lt;cr&amp;gt;`z
vmap &amp;lt;M-j&amp;gt; :m&amp;#39;&amp;gt;+&amp;lt;cr&amp;gt;`&amp;lt;my`&amp;gt;mzgv`yo`z
vmap &amp;lt;M-k&amp;gt; :m&amp;#39;&amp;lt;-2&amp;lt;cr&amp;gt;`&amp;gt;my`&amp;lt;mzgv`yo`z

if has(&amp;quot;mac&amp;quot;) || has(&amp;quot;macunix&amp;quot;)
  nmap &amp;lt;D-j&amp;gt; &amp;lt;M-j&amp;gt;
  nmap &amp;lt;D-k&amp;gt; &amp;lt;M-k&amp;gt;
  vmap &amp;lt;D-j&amp;gt; &amp;lt;M-j&amp;gt;
  vmap &amp;lt;D-k&amp;gt; &amp;lt;M-k&amp;gt;
endif

&amp;quot; Delete trailing white space on save, useful for some filetypes ;)
fun! CleanExtraSpaces()
    let save_cursor = getpos(&amp;quot;.&amp;quot;)
    let old_query = getreg(&amp;#39;/&amp;#39;)
    silent! %s/\s\+$//e
    call setpos(&amp;#39;.&amp;#39;, save_cursor)
    call setreg(&amp;#39;/&amp;#39;, old_query)
endfun

if has(&amp;quot;autocmd&amp;quot;)
    autocmd BufWritePre *.txt,*.js,*.py,*.wiki,*.sh,*.coffee :call CleanExtraSpaces()
endif


&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; =&amp;gt; Spell checking
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; Pressing ,ss will toggle and untoggle spell checking
map &amp;lt;leader&amp;gt;ss :setlocal spell!&amp;lt;cr&amp;gt;

&amp;quot; Shortcuts using &amp;lt;leader&amp;gt;
map &amp;lt;leader&amp;gt;sn ]s
map &amp;lt;leader&amp;gt;sp [s
map &amp;lt;leader&amp;gt;sa zg
map &amp;lt;leader&amp;gt;s? z=


&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; =&amp;gt; Misc
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; Remove the Windows ^M - when the encodings gets messed up
noremap &amp;lt;Leader&amp;gt;m mmHmt:%s/&amp;lt;C-V&amp;gt;&amp;lt;cr&amp;gt;//ge&amp;lt;cr&amp;gt;&amp;#39;tzt&amp;#39;m

&amp;quot; Quickly open a buffer for scribble
map &amp;lt;leader&amp;gt;q :e ~/buffer&amp;lt;cr&amp;gt;

&amp;quot; Quickly open a markdown buffer for scribble
map &amp;lt;leader&amp;gt;x :e ~/buffer.md&amp;lt;cr&amp;gt;

&amp;quot; Toggle paste mode on and off
map &amp;lt;leader&amp;gt;pp :setlocal paste!&amp;lt;cr&amp;gt;


&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; =&amp;gt; Helper functions
&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;
&amp;quot; Returns true if paste mode is enabled
function! HasPaste()
    if &amp;amp;paste
        return &amp;#39;PASTE MODE  &amp;#39;
    endif
    return &amp;#39;&amp;#39;
endfunction

&amp;quot; Don&amp;#39;t close window, when deleting a buffer
command! Bclose call &amp;lt;SID&amp;gt;BufcloseCloseIt()
function! &amp;lt;SID&amp;gt;BufcloseCloseIt()
    let l:currentBufNum = bufnr(&amp;quot;%&amp;quot;)
    let l:alternateBufNum = bufnr(&amp;quot;#&amp;quot;)

    if buflisted(l:alternateBufNum)
        buffer #
    else
        bnext
    endif

    if bufnr(&amp;quot;%&amp;quot;) == l:currentBufNum
        new
    endif

    if buflisted(l:currentBufNum)
        execute(&amp;quot;bdelete! &amp;quot;.l:currentBufNum)
    endif
endfunction

function! CmdLine(str)
    call feedkeys(&amp;quot;:&amp;quot; . a:str)
endfunction 

function! VisualSelection(direction, extra_filter) range
    let l:saved_reg = @&amp;quot;
    execute &amp;quot;normal! vgvy&amp;quot;

    let l:pattern = escape(@&amp;quot;, &amp;quot;\\/.*&amp;#39;$^~[]&amp;quot;)
    let l:pattern = substitute(l:pattern, &amp;quot;\n$&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;)

    if a:direction == &amp;#39;gv&amp;#39;
        call CmdLine(&amp;quot;Ack &amp;#39;&amp;quot; . l:pattern . &amp;quot;&amp;#39; &amp;quot; )
    elseif a:direction == &amp;#39;replace&amp;#39;
        call CmdLine(&amp;quot;%s&amp;quot; . &amp;#39;/&amp;#39;. l:pattern . &amp;#39;/&amp;#39;)
    endif

    let @/ = l:pattern
    let @&amp;quot; = l:saved_reg
endfunction&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 소스코드를 복사 한 후 자신의 vimrc에 붙여넣기 하고 &lt;code&gt;:wq&lt;/code&gt; 를 통해 &lt;strong&gt;저장 후 빠져나오기&lt;/strong&gt;를 합니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/zfX71/btq4NHolU5V/pdOXxdzEOsj7ynpWXCbEF1/img.png&quot;&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;before&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/bDY7LL/btq4MhqmB6d/QDlbI66CIkquSBbs2qT0xk/img.png&quot;&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;after&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;다음과 같이 이쁘게 바뀐 vim을 볼 수 있습니다.&lt;/p&gt;</description>
      <category>Vim</category>
      <category>MacOS</category>
      <category>vimrc</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/51</guid>
      <comments>https://sukvvon.tistory.com/51#entry51comment</comments>
      <pubDate>Wed, 12 May 2021 19:47:34 +0900</pubDate>
    </item>
    <item>
      <title>[Homebrew] ilmbase deprecated</title>
      <link>https://sukvvon.tistory.com/50</link>
      <description>&lt;h2&gt;brew upgrade ilmbase&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/kyIVm/btq4qEmgxk0/kGLK5xaSMDtEKggzqT8851/img.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;Warning: ilmbase has been deprecated because it is not supported upstream!&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;neofetch를 설치하면서 &lt;code&gt;ilmbase&lt;/code&gt;가 더 이상 사용되지 않는다는 것을 알게 되었습니다.&lt;/p&gt;
&lt;h2&gt;brew upgrade openexr with imath&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/FmfYd/btq4pBwM9Au/K19pYkqEyUiBkhEN69KKaK/img.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;homebrew를 update하니 &lt;code&gt;openexr&lt;/code&gt;이 업데이트 목록에 해당되는 것을 알았습니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/qMblP/btq4p798oub/LL7Ye9jBR7ZXfd6d6HwkJK/img.png&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/b99QGf/btq4p4eF5Tc/4dCYU03krZXlNFF8cAQJvK/img.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;==&amp;gt; Installing dependencies for openexr: imath
==&amp;gt; Installing openexr dependency: imath
==&amp;gt; Pouring imath--3.0.1.catalina.bottle.tar.gz
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink lib/libImath.dylib
Target /usr/local/lib/libImath.dylib
is a symlink belonging to ilmbase. You can unlink it:
  brew unlink ilmbase

To force the link and overwrite all conflicting files:
  brew link --overwrite imath

To list all files that would be deleted:
  brew link --overwrite --dry-run imath

Possible conflicting files are:
/usr/local/lib/libImath.dylib -&amp;gt; /usr/local/Cellar/ilmbase/2.5.5/lib/libImath.dylib
==&amp;gt; Summary
   /usr/local/Cellar/imath/3.0.1: 49 files, 884.9KB&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;==&amp;gt; Installing openexr
==&amp;gt; Pouring openexr--3.0.1.catalina.bottle.tar.gz
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink include/OpenEXR/Iex.h
Target /usr/local/include/OpenEXR/Iex.h
is a symlink belonging to ilmbase. You can unlink it:
  brew unlink ilmbase

To force the link and overwrite all conflicting files:
  brew link --overwrite openexr

To list all files that would be deleted:
  brew link --overwrite --dry-run openexr

//생략

==&amp;gt; Summary
   /usr/local/Cellar/openexr/3.0.1: 176 files, 5.3MB
Removing: /usr/local/Cellar/openexr/2.5.5... (152 files, 6.9MB)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;openexr&lt;/code&gt;, &lt;code&gt;imath&lt;/code&gt; 모두 업데이트는 완료하였으나 이제는 사용하지 않은 &lt;code&gt;ilmbase&lt;/code&gt;와 중복이 되어 충돌이 일어납니다.&lt;/p&gt;
&lt;h2&gt;brew doctor&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/2tqS1/btq4rdWfDBR/7AKVDPwfT40MkiwAd7Eza0/img.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;Warning: Some installed formulae are deprecated or disabled.
You should find replacements for the following formulae:
  ilmbase

Warning: You have unlinked kegs in your Cellar.
Leaving kegs unlinked can lead to build-trouble and cause formulae that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
  imath
  openexr&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;brew doctor&lt;/code&gt;를 실행한 결과 &lt;code&gt;ilmbase&lt;/code&gt;는 역시나 더 이상 사용되지 않고, &lt;code&gt;math&lt;/code&gt;, &lt;code&gt;openexr&lt;/code&gt;은 &lt;code&gt;unlink&lt;/code&gt;가 되어있어 &lt;code&gt;link&lt;/code&gt;를 시키라고 합니다.&lt;/p&gt;
&lt;h2&gt;ilmbase, openexr의 github 설치 코드&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/b0oCeC/btq4p2HXhfO/3MOhoa38VxccVgj4DLAKIK/img.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;brew info ilmbase openexr&lt;/code&gt;을 통하여 홈페이지를 살펴보니 각 프로그램들이 모두 동일한 홈페이지를 사용한다는 것을 알았습니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/DTNiU/btq4uHoM6MI/7hE4OjnRYgkH4Y5j5i31RK/img.png&quot;&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;limbase github site&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;https://github.com/Homebrew/homebrewcore/blob/HEAD/Formula/ilmbase.rb&lt;/code&gt;&lt;/pre&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/CXYeJ/btq4qAj8KBh/PPOIo2AkHVzAFiF8QuHme1/img.png&quot;&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;openexr github site&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;https://github.com/Homebrew/homebrewcore/blob/HEAD/Formula/openexr.rb&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;keg_only &amp;quot;ilmbase conflicts with openexr and imath&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;ilmbase github code&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;두 프로그램의 설치 github 코드룰 살펴보자면 openexr github에선 아무 이상이 없었으나, ilmbase github에서 역시나 ilmbase는 openexr과 imath와 충돌이 일어난다고 언급하였습니다.&lt;/p&gt;
&lt;h2&gt;brew link, unlink 실행&lt;/h2&gt;
&lt;p&gt;두 가지 안 중에 서두에 언급하였던 ilmbase는 deprecated 가 되었다는 것을 인지하고 &lt;code&gt;brew unlink ilmbase&lt;/code&gt;,  &lt;code&gt;brew link --overwrite openexr&lt;/code&gt;,  &lt;code&gt;brew link --overwrite imath&lt;/code&gt;를 실행하였습니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/G1iq9/btq4rAjEFN5/QXko3e3WZSUBmqXl4Kx7s1/img.png&quot;&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;brew unlink ilmbase&lt;/code&gt; 그리고 &lt;code&gt;brew doctor&lt;/code&gt; 을 실행&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://blog.kakaocdn.net/dn/bj3lmm/btq4tyS9Ymw/3QA8w2pvfJSTtBewxc3Mtk/img.png&quot;&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;brew link --overwrite openexr &amp;amp;&amp;amp; brew link --overwrite imath&lt;/code&gt; 실행&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ilmbase를 &lt;code&gt;unlink&lt;/code&gt; 그리고 openexr과 imath를 &lt;code&gt;link --overwrite&lt;/code&gt;를 하니 위 사진처럼 ilmbase 경고만 남고 나머지는 다 사라지게 되었습니다.&lt;/p&gt;</description>
      <category>Homebrew</category>
      <category>deprecated</category>
      <category>homebrew</category>
      <category>MacOS</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/50</guid>
      <comments>https://sukvvon.tistory.com/50#entry50comment</comments>
      <pubDate>Sun, 9 May 2021 19:23:52 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] 리눅스 명령어 연습 사이트</title>
      <link>https://sukvvon.tistory.com/49</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://bellard.org/jslinux/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;bellard.org/jslinux/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1620455075903&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;JSLinux&quot; data-og-description=&quot;JSLinux Run Linux or other Operating Systems in your browser! The following emulated systems are available: CPUOSUserInterfaceVFsyncaccessStartupLinkTEMUConfigComment x86Alpine Linux 3.12.0ConsoleYes click here url x86Alpine Linux 3.12.0X WindowYes click h&quot; data-og-host=&quot;bellard.org&quot; data-og-source-url=&quot;http://bellard.org/jslinux/&quot; data-og-url=&quot;https://bellard.org/jslinux/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;http://bellard.org/jslinux/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://bellard.org/jslinux/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;JSLinux&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JSLinux Run Linux or other Operating Systems in your browser! The following emulated systems are available: CPUOSUserInterfaceVFsyncaccessStartupLinkTEMUConfigComment x86Alpine Linux 3.12.0ConsoleYes click here url x86Alpine Linux 3.12.0X WindowYes click h&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bellard.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 명령어를 연습할 수 있는 사이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 없이 할 수 있어 편한 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1722&quot; data-origin-height=&quot;1029&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYhWfM/btq4t3SoBbs/g9ZtDGaOOVQx67bCPGASG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYhWfM/btq4t3SoBbs/g9ZtDGaOOVQx67bCPGASG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYhWfM/btq4t3SoBbs/g9ZtDGaOOVQx67bCPGASG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYhWfM%2Fbtq4t3SoBbs%2Fg9ZtDGaOOVQx67bCPGASG0%2Fimg.png&quot; data-origin-width=&quot;1722&quot; data-origin-height=&quot;1029&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Clich here 버튼을 눌러 자신이 원하는 환경으로 들어가서 실습을 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;1139&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvWHJy/btq4q3yXIUq/OdhWwFpzwzH2kFWfkT9JV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvWHJy/btq4q3yXIUq/OdhWwFpzwzH2kFWfkT9JV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvWHJy/btq4q3yXIUq/OdhWwFpzwzH2kFWfkT9JV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvWHJy%2Fbtq4q3yXIUq%2FOdhWwFpzwzH2kFWfkT9JV0%2Fimg.png&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;1139&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약 10초에서 15초 정도 기다리시면 다음과 같은 화면이 나오면서 실습을 진행할 수 있습니다.&lt;/p&gt;</description>
      <category>macOS</category>
      <category>Linux</category>
      <category>MacOS</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/49</guid>
      <comments>https://sukvvon.tistory.com/49#entry49comment</comments>
      <pubDate>Sat, 8 May 2021 15:25:14 +0900</pubDate>
    </item>
    <item>
      <title>[MacOS] figlet과 lolcat을 활용하여 terminal 재밌게 사용하기</title>
      <link>https://sukvvon.tistory.com/48</link>
      <description>&lt;h2&gt;figlet 이란?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://www.figlet.org/&quot;&gt;http://www.figlet.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;quot;Frank, Ian 및 Glenn의 편지&amp;quot; 에서 따온 figlet은 &lt;a href=&quot;https://www.wikiwand.com/ko/%EC%9C%A0%EB%8B%89%EC%8A%A4_%EA%B3%84%EC%97%B4&quot;&gt;Unix와 유사한&lt;/a&gt; 운영체제 대표적으로 &lt;a href=&quot;https://www.wikiwand.com/ko/%EB%A6%AC%EB%88%85%EC%8A%A4&quot;&gt;Linux&lt;/a&gt; 나 &lt;a href=&quot;https://www.wikiwand.com/ko/%EB%A7%A5_OS&quot;&gt;MacOS&lt;/a&gt; 와 같은 시스템의 &lt;a href=&quot;https://www.wikiwand.com/ko/%ED%84%B0%EB%AF%B8%EB%84%90_(macOS)&quot;&gt;Terminal&lt;/a&gt; 환경에서 작동을 하여 &lt;a href=&quot;https://www.wikiwand.com/ko/%EC%95%84%EC%8A%A4%ED%82%A4_%EC%95%84%ED%8A%B8&quot;&gt;ASCII 아트&lt;/a&gt;를 활용하여 나타내는 프로그램입니다.&lt;/p&gt;
&lt;h2&gt;figlet 설치하기&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/VZXE67STzWk4mFo.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew install figlet&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;homebrew 를 통하여 figlet을 설치합니다.&lt;/p&gt;
&lt;h2&gt;lolcat 이란?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/busyloop/lolcat&quot;&gt;https://github.com/busyloop/lolcat&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;lolcat은 MacOS나 Unix 계열 즉 대표적으로 Linux 계열 시스템의 Terminal에서 하얀색으로만 표현할 수 있는 코드에 색을 입혀주는 프로그램입니다.&lt;/p&gt;
&lt;h2&gt;lolcat 설치하기&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/ktywIXh5KUYpOjn.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew install lolcat&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;homebrew 를 통하여 lolcat 설치합니다.&lt;/p&gt;
&lt;h2&gt;figlet과 lolcat를 terminal에 적용시키기&lt;/h2&gt;
&lt;h3&gt;man figlet&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/7Z1cPQmbSlMHJ3p.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/CrEAcaLvpqgTZy3.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/oBdA1ZWpSvxXrl9.png&quot;&gt;  
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;man figlet&lt;/code&gt; 명령어를 통하여 figlet에 대해서 알아보니 정리하자면 이렇습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-f&lt;/code&gt; = font 파일에서 선택&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-d&lt;/code&gt; = 글꼴 디렉토리를 변경&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-c&lt;/code&gt; = 출력을 중앙에 배치&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-l&lt;/code&gt; = 출력을 왼쪽 정렬&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-r&lt;/code&gt; = 출력을 오른쪽 정렬&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-t&lt;/code&gt; = 출력 너비를 로 설정 (terminal 너비)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-w&lt;/code&gt; = 사용자 지정 출력 너비를 지정&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-k&lt;/code&gt; = 활성화 커닝을 하여 메시지의 각 문자를 인접한 문자로 병합하는 대신 개별적으로 인쇄&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;font 종류 살펴보기&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/sH2KlxSCYO6uiqE.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;cd /usr/local/share/figlet/fonts&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;figlet&lt;/code&gt; 의 &lt;code&gt;fonts&lt;/code&gt; 폴더로 이동합니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/lcd7pvqUP9JMTXf.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/kmjWIopOHzr5EM7.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;ls&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;ls&lt;/code&gt;를 통하여 목록 확인하여 여기에서 마음에 드는 &lt;code&gt;.fif&lt;/code&gt; 를 선택하면 됩니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/AkpwtSWG6VXFTR2.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt; figlet -f speed -c Hello ! sukvvon | lolcat&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;여러 &lt;code&gt;font&lt;/code&gt; 를 테스트 해 본 결과 필자는 speed.fif 가 제일 마음에 들었습니다.&lt;/p&gt;
&lt;h3&gt;vim ~/.zshrc&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/G5rfpvEoHFsRaic.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;vi ~/.zshrc
# or
code ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;필자는 &lt;code&gt;zsh&lt;/code&gt;를 사용하므로 &lt;code&gt;zsh&lt;/code&gt; 기준으로 설명을 하였습니다.  vim 을 잘 모른다면 vscode 즉 code 또한 사용할 수 있습니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/VO6UCduQ2chjTps.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;#FIGlet with lolcat
figlet -w 90 -f speed -c Hello | lolcat
figlet -w 90 -f speed -c sukvvon! | lolcat&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;figlet -w 90 -f speed -c Hello sukvvon? | lolcat&lt;/code&gt; 으로 할 수 있으나 너비 간격이 깨져서 따로따로 작성하였습니다.&lt;/p&gt;
&lt;p&gt;필자는 여기서 &lt;code&gt;-f&lt;/code&gt; 를 써서 마음에 드는 폰트를 확인하고 &lt;code&gt;-c&lt;/code&gt; 를 통해서 센터에 위치하도록 하여 terminal 너비를 &lt;code&gt;-w&lt;/code&gt; 를 통하여 90으로 지정하였습니다.&lt;/p&gt;
&lt;h3&gt;source ~/.zshrc&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/mgilGsrK4t69pvA.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;source ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 사진과 같이 깔끔하고 이쁘게 설정된 것을 확인할 수 있습니다.&lt;/p&gt;</description>
      <category>macOS</category>
      <category>figlet</category>
      <category>homebrew</category>
      <category>lolcat</category>
      <category>MacOS</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/48</guid>
      <comments>https://sukvvon.tistory.com/48#entry48comment</comments>
      <pubDate>Fri, 7 May 2021 20:06:36 +0900</pubDate>
    </item>
    <item>
      <title>[homebrew] brew upgrade 한 번에 하기</title>
      <link>https://sukvvon.tistory.com/47</link>
      <description>&lt;h2&gt;brew update &amp;amp; upgrade&lt;/h2&gt;
&lt;p&gt;많은 Mac을 사용하는 유저들이 brew의 &lt;code&gt;brew update&lt;/code&gt; 란 명령어를 많이 사용할 것입니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/13/eHEOVStyPJXofjN.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/13/ugXoE2KtBL5qY83.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;brew update&lt;/code&gt; 명령어를 실행하면 새로 설치가 필요한 항목들이 위의 이미지와 같이 나타날 것입니다. 여기서 &lt;code&gt;brew upgrade&lt;/code&gt; 란 명령어를 사용하여 upgrade를 하면 아직 익숙하지 않은 사용자들은 &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;모든 &lt;code&gt;formula&lt;/code&gt; 그리고 &lt;code&gt;cask&lt;/code&gt; 가 &lt;code&gt;upgrade&lt;/code&gt;&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;라고 생각할 것입니다. 하지만 이와 같은 경우엔&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;del&gt;&amp;quot;모든 &lt;code&gt;formula&lt;/code&gt; 그리고 &lt;code&gt;cask&lt;/code&gt; 가 &lt;code&gt;upgrade&lt;/code&gt;&amp;quot;&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&amp;quot;모든 &lt;code&gt;formula&lt;/code&gt; 만 &lt;code&gt;upgrade&lt;/code&gt;&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;위와 같이 실행되는 모습을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;사용자의 키체인 및 보안 관련하여 homebrew 에선 &lt;u&gt;한 번에 모든 cask를 upgrade 하는 것을 허용하지 않습니다.&lt;/u&gt; 즉 각각 &lt;code&gt;brew upgrade &amp;#39;cask&amp;#39;&lt;/code&gt; 를 통해서 cask 를 upgrade 해야한다는 것입니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;del&gt;&amp;quot;모든 것이 업데이트가 될 것이다.&amp;quot;&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&amp;quot;모든 formula 만 update, &lt;ins&gt;&lt;code&gt;brew upgrade &amp;#39;cask&amp;#39;&lt;/code&gt; 일일히 따로 수행&amp;quot;&lt;/ins&gt; &lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;brew upgrade --greedy&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;greedy&lt;/em&gt; 란 우리말로 &lt;em&gt;탐욕적&lt;/em&gt; 이라는 뜻입니다. greedy라는 option을 줌으로 &lt;code&gt;brew update --greedy&lt;/code&gt;를 사용하여  일일히 특정 cask 항목을 upgrade 를 하는 수고를 덜 수 있습니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/13/dpc8aRz7vgAVqTP.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/13/1Dt8L5cPAf7iISJ.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;위 이미지와 같이 &lt;code&gt;brew upgrade --greedy&lt;/code&gt;를 통하여 모든 formula 및 cask가 한 번에 업데이트가 된 것을 확인 할 수 있습니다.&lt;/p&gt;</description>
      <category>Homebrew</category>
      <category>brew update</category>
      <category>brew upgrade</category>
      <category>brew upgrade --greedy</category>
      <category>homebrew</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/47</guid>
      <comments>https://sukvvon.tistory.com/47#entry47comment</comments>
      <pubDate>Thu, 6 May 2021 14:51:04 +0900</pubDate>
    </item>
    <item>
      <title>[Git] git과 github 사용하기</title>
      <link>https://sukvvon.tistory.com/43</link>
      <description>&lt;h1&gt;[Git] git과 github 사용하기&lt;/h1&gt;
&lt;h2&gt;git이란?&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://git-scm.com/images/logos/downloads/Git-Logo-2Color.png&quot; width=&quot;400px&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://git-scm.com/&quot;&gt;https://git-scm.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;git은 리누스 토발즈가 개발한 분산형 버전 관리 시스템(VCS)입니다.&lt;/p&gt;
&lt;h3&gt;git의 장점&lt;/h3&gt;
&lt;p&gt;매우 빠른 속도와 분산형 저장소를 지원한다는 장점이 있기에 많은 개발자들이 Git을 사용하여 관리합니다. git을 대표적으로 github와 연동하여 개인 프로젝트를 혼자 관리할 수 있고, 혹은 다른 팀원들과 협업을 할 수도 있으며, 개인적으로 굳이 남들에게 공개하지 않고도 private 하게 이용할 수도 있습니다.&lt;/p&gt;
&lt;h2&gt;github란?&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/146315620-8059a53b-15d5-4835-9cab-42d4a75a455f.jpg&quot; width=&quot;400px&quot;&gt; 
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/&quot;&gt;https://github.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub is how people build software&lt;/strong&gt;&lt;br&gt;GitHub는 사람들이 소프트웨어를 개발하는 방법입니다.&lt;/p&gt;
&lt;p&gt;대표적인 무료 git 저장소로 2008년에 공개되었습니다. git의 호스팅 기능 덕분에 다른 유사 사이트와 다르게 크게 성장하고 유명해졌습니다. 그에 더해 마이크로소프트의 인수로 더욱 더 강력해지고 대부분의 유저가 사용하는 기능들은 모두 무료로 이용할 수 있기 떄문에 개발자들의 인스타그램이라고도 할 수 있습니다. 협업을 진행하기도 하고 개인 프로젝트를 진행하기도 하고 정말 많은 사람들이 수 많은 레파지토리를 올리며 공유하고 서로 소통하는 장이라고 할 수 있습니다.&lt;/p&gt;
&lt;h2&gt;install git&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://git-scm.com/&quot;&gt;https://git-scm.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;macOS 의 경우는 기본적으로 내장이 되어 있지만 window와 linux 시스템 같은 경우는 git을 다운받아야 합니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/11/5hqB9Eam3kwGsVi.png&quot; width=&quot;800px&quot;&gt;
&lt;/p&gt;

&lt;p&gt;repository를 처음 만들었을 때 github에서의 메뉴얼입니다. 이 메뉴얼을 참고하여 명령어의 의미들을 바탕으로 설명을 하려고 합니다.&lt;/p&gt;
&lt;h2&gt;git echo &amp;quot;your project&amp;quot; and add README.md&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;echo &amp;quot;#your project&amp;quot; &amp;gt;&amp;gt;README.md
git add README.md&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;echo &amp;quot;#_your project_&amp;quot; &amp;gt;&amp;gt;README.md&lt;/code&gt; 명령어를 통해 &lt;code&gt;README.md&lt;/code&gt; 파일을 생성하고 &lt;code&gt;git add README.md&lt;/code&gt; 명령어를 통해 &lt;code&gt;README.md&lt;/code&gt; 파일을 &lt;em&gt;index(stage)&lt;/em&gt; 로 올리라고 메뉴얼에 나와있지만 굳이 &lt;strong&gt;처음부터 생성하고 add 하여 &lt;em&gt;index(stage)&lt;/em&gt; 로 올릴 필요는 없습니다&lt;/strong&gt;. 자신이 작업을 하다가 혹은 작업을 완료 한 후 등 자신이 원할 때 &lt;code&gt;README.md&lt;/code&gt; 파일을 만드셔도 됩니다.&lt;/p&gt;
&lt;p&gt;필자는 &lt;code&gt;echo &amp;quot;#your project&amp;quot; &amp;gt;&amp;gt;README.md&lt;/code&gt;, &lt;code&gt;git add README.md&lt;/code&gt; 과정을 생략하고 &lt;code&gt;git add -A&lt;/code&gt; 명령어를 사용할 것입니다.&lt;/p&gt;
&lt;h2&gt;git config &amp;amp; init&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/11/b1P4dVcZIjt653l.png&quot; width=&quot;800px&quot;&gt;
&lt;/p&gt;

&lt;h3&gt;git init&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;git init&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;git init&lt;/code&gt; 명령어를 통해서 자신의 파일을 git의 영역하에 들어오도록 합니다. 필수로 이 명령어를 실행해야지만 차후 모든 git 관련 명령어를 실행 할 수 있습니다.&lt;/p&gt;
&lt;h3&gt;git config --global&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;git config --global user.name &amp;quot;user name&amp;quot;
git config --global user.email &amp;quot;user email&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;우선 먼저 자신의 Mac에 전역적으로 자신의 &lt;strong&gt;사용자 이름&lt;/strong&gt;과 &lt;strong&gt;사용자 이메일&lt;/strong&gt;을 전역적으로 설정을 합니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/11/tXm5NObkuiLh7zf.png&quot; width=&quot;800px&quot;&gt;
&lt;/p&gt;

&lt;p&gt;전역적으로 설정을 할 경우 git log를 보았을 때 자신이 commit한 항목은 자신의 사용자 이름과 사용자 이메일이 전역적으로 설정한 컴퓨터에 한하여 설정한 email과 name로 표시가 됩니다. 더 나아가 그룹으로 작업한 것일 경우 타인과 자신이 한 것을 구분할 수 있습니다.&lt;/p&gt;
&lt;h2&gt;git add &amp;amp; commit&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/11/nJKVXgbjvmqYS7e.png&quot; width=&quot;800px&quot;&gt;
&lt;/p&gt;

&lt;h3&gt;git add -A&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;git add -A&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;git init&lt;/code&gt;을 한 후 &lt;code&gt;git add -A&lt;/code&gt; 명령어를 통해서 모든 파일을 업로드를 한다는 의미입니다.&lt;/p&gt;
&lt;p&gt;현업에서는 &lt;code&gt;git add-A&lt;/code&gt; 명령어를 &lt;strong&gt;지양&lt;/strong&gt;하고, &lt;code&gt;git add .&lt;/code&gt; 혹은 &lt;code&gt;git add *&lt;/code&gt; 를 많이 사용합니다. 우선 처음 올리는 것이기 때문에 &lt;code&gt;git add-A&lt;/code&gt; 를 실행하여 현재 &lt;em&gt;working dir&lt;/em&gt; 안에 있는 모든 파일을 &lt;em&gt;index(stage)&lt;/em&gt; 로 올립니다.&lt;/p&gt;
&lt;h3&gt;git commit -m &amp;quot;first commit&amp;quot;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;git commit -m &amp;quot;first commit&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;git add -A&lt;/code&gt; 를 한 후 &lt;em&gt;index(stage)&lt;/em&gt; 영역에 있는 파일을 &amp;#39;&amp;#39;처음 올린다&amp;#39;&amp;#39; 라는 뜻의 &lt;code&gt;first commit&lt;/code&gt; 이라고 제목을 정하고 커밋을 함으로써 &lt;em&gt;HEAD&lt;/em&gt; 영역으로 올립니다.&lt;/p&gt;
&lt;p&gt;처음 올린다고 무조건 이름이 &lt;code&gt;first commit&lt;/code&gt; 일 필요는 없습니다. 각자 기호에 맞게 자신이 식별할 수 있는 다른 명칭을 사용하셔도 됩니다.&lt;/p&gt;
&lt;h2&gt;git branch -M main&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;git branch -M main&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;branch&lt;/code&gt; 란 &lt;strong&gt;분기&lt;/strong&gt;한다는 의미입니다. 처음 repository를 만드는데 굳이 main 으로 &lt;strong&gt;분기 할 필요가 없습니다&lt;/strong&gt;. 생략하셔도 무방하다고 생각합니다.&lt;/p&gt;
&lt;h2&gt;git remote &amp;amp; push&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/11/cGAeCRJvODYsPSn.png&quot; width=&quot;800px&quot;&gt;
&lt;/p&gt;

&lt;h3&gt;git remote add origin https://~&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;git remote add origin https://github.com/your repository&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;자신의 git &lt;strong&gt;내부 레파지토리&lt;/strong&gt;와 github의 &lt;strong&gt;외부 레파지토리&lt;/strong&gt;를 &lt;strong&gt;연결&lt;/strong&gt; 하는 것입니다.&lt;/p&gt;
&lt;p&gt;자신의 &lt;strong&gt;내부 레파지토리&lt;/strong&gt;에서만 관리하던 것을 &lt;code&gt;git remote add origin https://github.com/your repository&lt;/code&gt; 명령어를 통해서 github의 &lt;strong&gt;외부 레파지토리&lt;/strong&gt;로 연결하여 자신의 프로젝트를 공개하거나 협업을 진행할 수 있습니다.&lt;/p&gt;
&lt;h3&gt;git push -u origin master&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;git push -u origin master&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;최초만 사용하고, 그 후 &lt;code&gt;git push&lt;/code&gt; 명령어만 사용 가능합니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git remote add origin https://github.com/your repository&lt;/code&gt; 명령어를 통해 내부와 외부 레파지토리를 연동을 시킨 후 &lt;strong&gt;최초&lt;/strong&gt;로 &lt;strong&gt;내부 레파지토리&lt;/strong&gt;에서 &lt;strong&gt;외부 레파지토리&lt;/strong&gt;로 &lt;code&gt;commit&lt;/code&gt;하여 &lt;em&gt;HEAD&lt;/em&gt; 에 있는 정보를 보낼때는 &lt;code&gt;git push -u origin master&lt;/code&gt;를 사용하고, 그 후 &lt;code&gt;push&lt;/code&gt;를 할 경우 이미 &lt;code&gt;origin master&lt;/code&gt;로 &lt;code&gt;push&lt;/code&gt;를 한 흔적이 있어 &lt;code&gt;git push&lt;/code&gt; 만 사용해도 됩니다.&lt;/p&gt;
&lt;p&gt;이미지에서는 &lt;code&gt;main&lt;/code&gt; 을 사용하라고 github에서 명시를 해 놓은 것 같으나 저는 예전 표준으로 쓰이던 &lt;code&gt;master&lt;/code&gt; 라는 명칭을 사용하도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;github 환경설정을 들어가시면 &lt;code&gt;master&lt;/code&gt; , &lt;code&gt;main&lt;/code&gt; 말고도 사용자가 원하는 명칭으로 설정을 하실 수 있습니다. github에서 저장한 그 명칭으로 자동 설정되는 것이지 &lt;strong&gt;꼭 설정한대로 해야 하는 것은 아닙니다&lt;/strong&gt;.&lt;/p&gt;</description>
      <category>Git</category>
      <category>git</category>
      <category>github</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/43</guid>
      <comments>https://sukvvon.tistory.com/43#entry43comment</comments>
      <pubDate>Sat, 24 Apr 2021 20:25:22 +0900</pubDate>
    </item>
    <item>
      <title>[macOS] neofetch 를 활용하여 terminal 이쁘게 사용하기</title>
      <link>https://sukvvon.tistory.com/41</link>
      <description>&lt;h2&gt;neofetch란 무엇인가?&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://camo.githubusercontent.com/82b03feab20083a17944229ea151c0fbd521cae0ecb44a8b2f3934ebce2e1e91/68747470733a2f2f692e696d6775722e636f6d2f47466d433541642e706e67&quot; width=&quot;600px&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/MeOysvVF9mzdJrL.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/dylanaraps/neofetch&quot;&gt;https://github.com/dylanaraps/neofetch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;noefetch란 위 이미지와 같이 CLI에서 사용자의 정보를 알 수 있도록 하는 것입니다. 또한 사용자의 기호에 맞게 커스텀해서 사용 할 수 있습니다.&lt;/p&gt;
&lt;h2&gt;brew로 neofetch 설치하기&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;homebrew가 우선적으로 설치가 되어있어야 합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew install neofetch&lt;/code&gt;&lt;/pre&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/08/rE4HnOSe6t5XZfo.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/08/RpXvYkcf1EldmbP.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/g3Qqt9nRzpk7SyK.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/08/zw512t4gDAWJHeO.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/08/9IRrBej64g2lw5z.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/jDfBgcHGq1FZUxv.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/GprUtRzKmPqO36M.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/08/lkjrHXoBIExfAni.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/wLsM1Y92K3Xeo4N.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/nrVFOMbKj8iBWuh.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/08/XYAhkeaLlrZPVmx.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/08/Si85we7g3rGymoZ.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;&amp;lt;program&amp;gt; is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위의 문구가 나와서 어떤 동작을 수행하라고 하는데 해석하자면&lt;/p&gt;
&lt;p&gt;/usr/local 에 설치가 되어있고 이것은 심링크가 되어있지 않았다. 왜냐하면 macOS 에 이미 설치가 되어 있고 다른 버전이 있다면 모든 문제의 원인이 될 수 있다고 경고합니다. 즉 설치는 되어 있지만 시스템에 링크는 충돌과 같은 우려 때문에 되어 있지 않으므로 우리가 따로 설치한 프로그램을 사용하지 않은 이상 &lt;strong&gt;그 뒤에 나오는 동작을 수행하지 않아도 됩니다.&lt;/strong&gt; neofetch 를 설치하면 다음과 같이 많은 파일들과 부속 formula를 설치할 것입니다. 이 프로그램을 사용하기 위해서 많은 프로그램들이 필요한 것이기 때문입니다.&lt;/p&gt;
&lt;h2&gt;Iterm2(Terminal) 을 열었을 때 자동으로 실행시키기&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/08/THMayVvOwR9BiZe.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;다음과 같이 Iterm2(Terminal)를 실행시켰을 때 neofetch 를 활성화 하기 위해서는 어떻게 해야 하는 것일까요?&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;code ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;code 말고도 vim이나 atom 과 같은 편집기를 이용 가능합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;code ~/.zshrc&lt;/code&gt; 를 입력하면 밑 사진과 같이 vscode가 열립니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/FPtJNz5DuvjV4m7.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/08/7XCpjKGWq8o4Hth.png&quot;&gt;
&lt;p/&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;neofetch&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;필자가 따로 설정해놓은 것들은 무시하고 제일 하단에 neofetch 를 작성합니다. 그리고 command + s 를 통해서 저장한 후 vscode 를 빠져나오도록 합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;source ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;다음과 같은 명령어를 통해 편집한 zshrc 파일을 최신화 시켜주시면&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/08/2yv3XUxYjlPCMso.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;다음과 같이 Iterm2(Terminal) 을 열었을 때 자동적으로 neofetch 가 실행되어 이쁜 환경을 만들 수 있습니다.&lt;/p&gt;</description>
      <category>macOS</category>
      <category>MacOS</category>
      <category>shell</category>
      <category>zsh</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/41</guid>
      <comments>https://sukvvon.tistory.com/41#entry41comment</comments>
      <pubDate>Thu, 11 Feb 2021 12:20:11 +0900</pubDate>
    </item>
    <item>
      <title>[Homebrew] brew doctor (compinit:503:)</title>
      <link>https://sukvvon.tistory.com/40</link>
      <description>&lt;pre&gt;&lt;code&gt;compinit:503: no such file or directory: /usr/local/share/zsh/site-functions/_brew_cask&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;~/.zshrc&lt;/code&gt; 파일을 수정한 후에 &lt;code&gt;source ~/.zshrc&lt;/code&gt; 를 하였더니 위와 같은 오류가 발생하였다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gx5n56q8qyj30i20cmdht.jpg&quot;&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;brew doctor&lt;/code&gt;를 실행한 모습&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;하지만 &lt;code&gt;brew doctor&lt;/code&gt; 를 하여 검사를 한 결과 다행히 심볼릭 링크가 깨졌다는 것을 확인 할 수 있었다. 그리고 안내 사항에 나와있는대로 &lt;code&gt;brew cleanup&lt;/code&gt; 을 실행 한 후 &lt;code&gt;source ~/.zshrc&lt;/code&gt; 를 한 결과 이상 없이 실행된 것을 알 수 있었다.&lt;/p&gt;</description>
      <category>Homebrew</category>
      <category>brew doctor</category>
      <category>homebrew</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/40</guid>
      <comments>https://sukvvon.tistory.com/40#entry40comment</comments>
      <pubDate>Tue, 26 Jan 2021 23:25:47 +0900</pubDate>
    </item>
    <item>
      <title>[MacOS] 'wheel', 'admin', 'staff' 차이에 대해서</title>
      <link>https://sukvvon.tistory.com/38</link>
      <description>&lt;h2&gt;&lt;a href=&quot;https://superuser.com/questions/20420/what-is-the-difference-between-the-default-groups-on-mac-os-x&quot;&gt;StackExchange&lt;/a&gt;에 따르면&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;170&quot; data-origin-height=&quot;346&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEellY/btqS6XxkJbw/VJV6e5PSKkqxBe6H8zwQR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEellY/btqS6XxkJbw/VJV6e5PSKkqxBe6H8zwQR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEellY/btqS6XxkJbw/VJV6e5PSKkqxBe6H8zwQR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEellY%2FbtqS6XxkJbw%2FVJV6e5PSKkqxBe6H8zwQR1%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;170&quot; data-origin-height=&quot;346&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;보통 일반 OS X 사용자는 &lt;b&gt;staff&lt;/b&gt; 그룹에 포함됩니다.&lt;/p&gt;
&lt;p&gt;OS X 사용자를 &lt;b&gt;관리자&lt;/b&gt; 그룹에 추가하려면 &lt;i&gt;시스템 환경 설정-&amp;gt; 사용자 및 그룹&lt;/i&gt; 을 통해 해당 사용자를 &lt;b&gt;관리자&lt;/b&gt; 로 지정해야합니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;451&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kHpI6/btqTlGAvv8o/Uw2XoiVIt4VQxgLgVkG1Tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kHpI6/btqTlGAvv8o/Uw2XoiVIt4VQxgLgVkG1Tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kHpI6/btqTlGAvv8o/Uw2XoiVIt4VQxgLgVkG1Tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkHpI6%2FbtqTlGAvv8o%2FUw2XoiVIt4VQxgLgVkG1Tk%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;451&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;451&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfqDCw/btqTfB1eCMo/0PkxmVNXSv11uJf5JcKfF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfqDCw/btqTfB1eCMo/0PkxmVNXSv11uJf5JcKfF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfqDCw/btqTfB1eCMo/0PkxmVNXSv11uJf5JcKfF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfqDCw%2FbtqTfB1eCMo%2F0PkxmVNXSv11uJf5JcKfF0%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;451&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;admin&lt;/b&gt; 는 &lt;b&gt;admin&lt;/b&gt; 및 &lt;b&gt;staff&lt;/b&gt; 그룹에 배치되는데 &lt;b&gt;admin&lt;/b&gt; 그룹은 다른 사용자가 할 수 없는 일을 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;root&lt;/b&gt;는 &lt;b&gt;wheel&lt;/b&gt; 그룹 의 유일한 구성원이며 유일한 구성원이어야 합니다. &lt;b&gt;wheel&lt;/b&gt;이 필요한 작업을 수행해야하는 경우 &lt;i&gt;sudo&lt;/i&gt; 명령을 사용해야합니다 .&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;또한 &lt;a href=&quot;http://dstein.egloos.com/2840817&quot;&gt;egloos&lt;/a&gt;에 의하면&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;staff 과 wheel 그룹의 차이&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;시스템의 모든 사용자들은 staff 그룹의 멤버가 됩니다.&lt;/p&gt;
&lt;p&gt;관리자들은 wheel 과 admin 그룹에 대해서도 멤버가 됩니다.&lt;/p&gt;
&lt;p&gt;wheel 그룹은 &lt;i&gt;su&lt;/i&gt; 를 사용하여 root 사용자로 전환할 수 있는 사용자들을 콘트롤하기 위해 사용된다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;wheel 과 admin 그룹의 차이점&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;admin 그룹의 멤버만이 &lt;i&gt;sudo&lt;/i&gt; 명령을 사용 할 수 있다.&lt;/p&gt;
&lt;p&gt;wheel 그룹의 멤버만이 &lt;i&gt;su&lt;/i&gt; 명령을 사용 할 수 있다.&lt;/p&gt;
&lt;p&gt;Mac OS X 에 로그인해서 사용하는 계정은 staff 와 admin 그리고 다수의 다른 그룹에 포함되어 있다.&lt;/p&gt;
&lt;p&gt;그래서 &lt;i&gt;sudo&lt;/i&gt; 명령을 사용 할 수 있는 것이다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;a href=&quot;https://discussions.apple.com/thread/6419340&quot;&gt;Apple 커뮤니티&lt;/a&gt;에 의하면&lt;/h2&gt;
&lt;h3&gt;staff 와 wheel 유저?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;직원과 바퀴는 &quot;Group&quot;입니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Unix 권한은 사용자 (소유자), 그룹, 월드 (기타)로 구분되며 각 사용자 클래스에 대한 별도의 읽기, 쓰기, 실행 권한 설정이 있습니다. &quot;Staff&quot;과 &quot;wheel&quot;는 표준 그룹입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;일반적으로 모든 사용자 계정에는 &quot;Staff&quot; 멤버십도 부여됩니다.&lt;/li&gt;
&lt;li&gt;따라서 시스템에 다른 사용자 계정을 만들면 고유 한 사용자 ID를 갖게되지만 &quot;Staff&quot;멤버십도 부여됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;직원의 다른 구성원이 파일에 액세스 할 수 있도록 허용하지만 World / Other 액세스는 거부 할 수있는 권한이 할당 될 수 있습니다&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(참고 : World는 실제로 행성 지구의 모든 구성원을 의미하는 것이 아니라 사용자가 아닌 구성원이 아닌 시스템의 다른 프로세스를 의미합니다. 이 용어는 컴퓨터가 네트워크에 연결되지 않았을 때 만들어졌고 그들 만의 작은 세계였습니다.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;A Big wheel&quot;에서와 같이 중요하고 권위있는 사람을 의미하는 &quot;Wheel&quot;은 관리자를 위한 그룹입니다. 많은 파일이 &quot;Wheel&quot; 그룹의 사용자가 액세스 할 수있는 권한을 가진 Wheel 그룹의 일부이지만 Wheel 그룹 액세스 권한이없는 다른 사용자는 허용하지 않습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;Staff&quot;와 &quot;wheel&quot;은 Mac OS X 시스템에서 정상입니다. 그들을 건드리지 마십시오.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href=&quot;https://haloaround.tistory.com/16&quot;&gt;IT 공부중&lt;/a&gt; 에 의하면&lt;/h2&gt;
&lt;p&gt;사용자 그룹은 기본적으로 staff / admin 두 가지가 있습니다. 기본적으로 사용자를 추가하면 staff 로 추가됩니다. [사용자를 관리자로 허용] 체크박스를 클릭할 경우 admin으로 사용자 그룹을 변경할 수 있습니다. (서버 설정 시 사용자 그룹을 추가할 수 있습니다.)&lt;/p&gt;</description>
      <category>macOS</category>
      <category>MacOS</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/38</guid>
      <comments>https://sukvvon.tistory.com/38#entry38comment</comments>
      <pubDate>Mon, 11 Jan 2021 22:41:41 +0900</pubDate>
    </item>
    <item>
      <title>[macOS] htop을 이용하여 mac을 관리하기</title>
      <link>https://sukvvon.tistory.com/37</link>
      <description>&lt;h2&gt;htop 이란?&lt;/h2&gt;
&lt;p&gt;htop은 Unix을 기반으로 한 Mac을 비롯한 Linux 시스템에서 CPU 사용량, Memory 사용량, Processor, SWP, 등을 GUI 화면으로 나타내 사용자가 보기 쉽게 하여 관리하도록 할 수 있는 프로그램입니다.&lt;/p&gt;
&lt;h2&gt;htop 설치&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew install htop&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;iTerm2(terminal) 을 실행 한 후 brew 명령어를 이용하여 htop을 설치를 합니다.&lt;/p&gt;
&lt;h2&gt;htop 실행&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/j24KGJhfaPusl9Z.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/H6ubzdtMpI3Uq2Y.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;sudo htop&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;htop을 입력하여 실행할 수도 있지만 제어를 하기 위해선 관리자 모드로 실행해야하므로 &lt;strong&gt;sudo htop&lt;/strong&gt; 을 입력합니다. 관리자 모드이기 때문에 비밀번호가 필요합니다. 비밀번호를 입력하면 htop이 실행됩니다.&lt;/p&gt;
&lt;h2&gt;htop 사용&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/08/1IzWkpZSgqe6yD2.png&quot;&gt;
&lt;/p&gt;

&lt;h3&gt;각 프로세스 설명&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/21/3o8xfhcXa6bEItC.png&quot;&gt;
&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;프로세스명&lt;/th&gt;
&lt;th&gt;프로세스 설명&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;PID&lt;/td&gt;
&lt;td&gt;프로세스의 ID 번호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USER&lt;/td&gt;
&lt;td&gt;프로세스의 소유자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PR&lt;/td&gt;
&lt;td&gt;프로세스의 우선순위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NI&lt;/td&gt;
&lt;td&gt;우선순위에 영향을 주는 프로세스의 nice 값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VIRT&lt;/td&gt;
&lt;td&gt;프로세스가 사용중인 가상 메모리 양&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RES&lt;/td&gt;
&lt;td&gt;프로세스가 사용중인 물리 RAM의 양 (단위는 킬로바이트)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SHR&lt;/td&gt;
&lt;td&gt;프로세스가 사용중인 공유 메모리 양&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;프로세스의 현재 상태(zombied, sleeping, running, uninterruptedly sleeping, traced)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;%CPU&lt;/td&gt;
&lt;td&gt;프로세스가 프로세서를 사용한 시간의 사용율&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;%MEM&lt;/td&gt;
&lt;td&gt;프로세스가 사용중인 RAM의 사용율&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIMR+&lt;/td&gt;
&lt;td&gt;프로세서를 사용한 시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;COMMAND&lt;/td&gt;
&lt;td&gt;프로세스를 시작하도록 한 명령어&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;단축키 설명&lt;/h3&gt;
&lt;h4&gt;F1(Help)&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/21/PqvcE5SQ2HZVYwt.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F1(Help)&lt;/strong&gt; : htop을 사용하는데 필요한 키들 그리고 그 키의 용도를 설명해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;F1&lt;/strong&gt; 혹은 &lt;strong&gt;h&lt;/strong&gt; 를 입력하거나 &lt;strong&gt;Help&lt;/strong&gt; 라고 명시되어있는 버튼을 클릭하면 실행됩니다.&lt;/p&gt;
&lt;h4&gt;F2(Setup)&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/21/AcKvN64XV2eFUfZ.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F2(Setup)&lt;/strong&gt; : htop을 설정합니다. 항목 배열 위치 및 테마 등등, 다양한 기능을 사용자가 원하는대로 설정 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;F2&lt;/strong&gt; , &lt;strong&gt;C&lt;/strong&gt; 나 &lt;strong&gt;S&lt;/strong&gt; 를 입력 혹은 &lt;strong&gt;Setup&lt;/strong&gt; 이라고 명시된 버튼을 클릭하면 실행됩니다.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/21/OSI3XBjwyQz8ZmN.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;위 이미지와 같이 &lt;strong&gt;Setup&lt;/strong&gt; 카테고리에서 &lt;strong&gt;Colors&lt;/strong&gt; 를 선택하여 원하는 항목을 선택한 후 &lt;strong&gt;F10&lt;/strong&gt; 을 입력하거나, &lt;strong&gt;Done&lt;/strong&gt; 이라고 명시된 버튼을 클릭하면 설정되고,&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/21/tsExwuqHFazpSI2.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/21/BiIWcmoLATRCjbU.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/21/8I2DA49unrjVBXg.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;또한 htop 상단에 보이는 항목들을 설정할 경우 &lt;strong&gt;Setup&lt;/strong&gt; 카테고리의 &lt;strong&gt;Meters&lt;/strong&gt; 에서 &lt;strong&gt;Available meters&lt;/strong&gt; 목록에서 원하는 것을 선택하여 &lt;strong&gt;Enter&lt;/strong&gt; 키를 누르거나 &lt;strong&gt;Add&lt;/strong&gt; 라고 명시된 버튼을 클릭한 후 &lt;strong&gt;Left column&lt;/strong&gt; 혹은 &lt;strong&gt;Right column&lt;/strong&gt; 에 위치하게 하고 본인이 원하는 위치 또한 설정한 후, &lt;strong&gt;Enter&lt;/strong&gt; 키를 누르거나 &lt;strong&gt;Lock&lt;/strong&gt; 이라 명시된 버튼을 입력하면 &lt;u&gt;저장할 수 있고&lt;/u&gt;, &lt;strong&gt;F10&lt;/strong&gt; 혹은 &lt;strong&gt;Esc&lt;/strong&gt; 를 입력하거나 &lt;strong&gt;Done&lt;/strong&gt; 이라고 명시된 버튼을 클릭하면 &lt;u&gt;저장하고 빠져나올 수 있습니다&lt;/u&gt;.&lt;/p&gt;
&lt;h4&gt;F3(Search)&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/21/E6gHDnyxe7pMRGv.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F3(Search)&lt;/strong&gt; : 원하는 프로세스를 검색합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;F3&lt;/strong&gt; 혹은 &lt;strong&gt;/&lt;/strong&gt; 를 입력하거나 &lt;strong&gt;Search&lt;/strong&gt; 라고 명시된 버튼을 클릭하면 실행됩니다.&lt;/p&gt;
&lt;h4&gt;F4(Filter)&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/21/kSPeB4NFbGT7CIm.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F4(Filter)&lt;/strong&gt; : 원하는 프로세스를 필터링합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;F4&lt;/strong&gt; 혹은 \ 를 입력하거나 &lt;strong&gt;Filter&lt;/strong&gt; 라고 명시된 버튼을 클릭하면 실행됩니다. 또한 실행된 상태에서 &lt;strong&gt;Enter&lt;/strong&gt; 키를 입력하거나 &lt;strong&gt;Done&lt;/strong&gt; 이라고 명시된 버튼을 클릭하면 &lt;u&gt;필터링이 설정되어 유지&lt;/u&gt;되는 것이고, &lt;strong&gt;Esc&lt;/strong&gt; 키나 &lt;strong&gt;Clear&lt;/strong&gt; 이라고 명시된 버튼을 클릭하면 &lt;u&gt;필터링이 초기화&lt;/u&gt;가 되는 것입니다.&lt;/p&gt;
&lt;h4&gt;F5(Tree)&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/21/1FNVHCRIOfEylAW.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F5(Tree)&lt;/strong&gt; : 프로세스의 항목들을 부모 자식 관계로 묶어 트리 형태로 나타내는 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;F5&lt;/strong&gt; 혹은 &lt;strong&gt;t&lt;/strong&gt; 를 입력하거나 &lt;strong&gt;Tree&lt;/strong&gt; 라고 명시된 버튼을 클릭하면 실행됩니다. 다시 되돌리고 싶은 경우 똑같이 &lt;strong&gt;F5&lt;/strong&gt; 혹은 &lt;strong&gt;t&lt;/strong&gt; 를 입력하거나 &lt;strong&gt;Tree&lt;/strong&gt; 라고 명시된 버튼을 클릭하면 됩니다.&lt;/p&gt;
&lt;h4&gt;F6(Sort)&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/21/tPUmsxMKnAuLkGq.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F6(Sort)&lt;/strong&gt; : PID, USER, PRIORITY, NICE 등 종류 별로 나누어서 프로세스들을 보여줍니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;F6&lt;/strong&gt; 혹은 &lt;strong&gt;&amp;gt;&lt;/strong&gt; 나 &lt;strong&gt;.&lt;/strong&gt; 을 입력하거나 &lt;strong&gt;Sortby&lt;/strong&gt; 라고 명시된 버튼을 클릭하면 실행됩니다. 그 후 화살표로 sort를 하고 싶은 항목을 선택한 후 &lt;strong&gt;Enter&lt;/strong&gt; 키를 입력하거나 &lt;strong&gt;Sort&lt;/strong&gt; 라고 명시된 버튼을 클릭하면 sort가 되는 것이고, &lt;strong&gt;Esc&lt;/strong&gt; 키를 입력하거나 &lt;strong&gt;Cancel&lt;/strong&gt; 이라고 명시된 버튼을 클릭하면 취소가 됩니다.&lt;/p&gt;
&lt;h4&gt;F7, F8(Nice -, +)&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/21/B9VxFzUciInM3Tm.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F7, F8(Nice)&lt;/strong&gt; : &lt;strong&gt;F7&lt;/strong&gt; 은 실행중인 프로세스의 &lt;u&gt;우선순위를 올리는 것&lt;/u&gt;이고, &lt;strong&gt;F8&lt;/strong&gt; 은 프로세스의 &lt;u&gt;우선순위를 내리는 것&lt;/u&gt;입니다. 각각 &lt;code&gt;]&lt;/code&gt; 키와 &lt;code&gt;[&lt;/code&gt; 키로 혹은 &lt;strong&gt;Nice -, Nice +&lt;/strong&gt; 라고 명시된 버튼을 클릭하면 실행됩니다.&lt;/p&gt;
&lt;p&gt;NICE 값을 &lt;code&gt;[&lt;/code&gt; 키와 &lt;code&gt;]&lt;/code&gt; 키를 활용하여 설정한 결과 &lt;code&gt;/System/Applications/Music.app/Contents/MacOS/Music&lt;/code&gt; 프로세스는 NI 값이 &lt;strong&gt;3&lt;/strong&gt; 으로 되어있고, &lt;code&gt;/Applications/Kakaotalk.app/Contents/MacOS/Kakaotalk&lt;/code&gt; 은 NI 값이 &lt;strong&gt;-3&lt;/strong&gt; 으로 되어있는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h4&gt;F9(Kill)&lt;/h4&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/08/21/4IXQFTYhHleO6m1.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F9(Kill)&lt;/strong&gt; : 프로세스를 종료하는 것입니다.&lt;/p&gt;
&lt;p&gt;종료하기를 원하는 프로세스를 선택한 후 &lt;strong&gt;F9&lt;/strong&gt; 혹은 &lt;strong&gt;k&lt;/strong&gt; 를 입력 혹은 &lt;strong&gt;F9(Kill)&lt;/strong&gt; 이라고 명시된 부분을 클릭하면 위 이미지와 같은 화면이 출력이 되고, &lt;strong&gt;Enter&lt;/strong&gt; 키를 입력하면 종료가 되며, 원치 않은 경우 &lt;strong&gt;Esc&lt;/strong&gt; 키를 누르면 취소가 됩니다.&lt;/p&gt;
&lt;h4&gt;F10(Quit)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;F10(Quit)&lt;/strong&gt; : htop을 종료하는 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;F10&lt;/strong&gt; 혹은 &lt;strong&gt;q&lt;/strong&gt; 를 입력하거나 &lt;strong&gt;F10(Quit)&lt;/strong&gt; 라고 된 버튼을 클릭하면 실행됩니다.&lt;/p&gt;</description>
      <category>macOS</category>
      <category>htop</category>
      <category>Mac</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/37</guid>
      <comments>https://sukvvon.tistory.com/37#entry37comment</comments>
      <pubDate>Sun, 10 Jan 2021 01:48:19 +0900</pubDate>
    </item>
    <item>
      <title>[Homebrew] brew 명령어 모음집</title>
      <link>https://sukvvon.tistory.com/7</link>
      <description>&lt;h2&gt;brew update&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/10/phHFkNum4z6aO3T.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew update&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;homebrew&lt;/code&gt; 를 최신 버전으로 &lt;code&gt;update&lt;/code&gt; 합니다. tap 되어있는 모든 저장소를 업데이트합니다. 위 사진을 보면 필자와 같은 경우 &lt;code&gt;homebrew/cask-versions&lt;/code&gt;, &lt;code&gt;home-brew/core&lt;/code&gt;, &lt;code&gt;homebrew/cask&lt;/code&gt;, &lt;code&gt;homebrew/services&lt;/code&gt;가 &lt;code&gt;update&lt;/code&gt;가 된 것을 알 수 있습니다. 우선 formula는 쉽게 말해서 java, python, mysql과 같이 CLI 환경에서 동작하는 것이고 cask는 vscode나 intellij-IDEA와 같이 GUI 환경에서 동작하는 것이라고 할 수 있습니다. 위 사진에서 현재 업데이트 된 &lt;code&gt;formula&lt;/code&gt;는 &lt;code&gt;libomp&lt;/code&gt;이고, &lt;code&gt;cask&lt;/code&gt;는 &lt;code&gt;visual-studio-code&lt;/code&gt; 인 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;brew upgrade&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/10/JaQ9HMwtkz3ilgV.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew upgrade&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;brew upgrade&lt;/code&gt;를 하게 되면 update가 되어 upgrade가 필요한 항목들을 upgrade 할 수 있습니다. 하지만 꼭 &lt;code&gt;brew upgrade&lt;/code&gt;를 하기 위해서 &lt;code&gt;brew update&lt;/code&gt; 명령어를 우선적으로 해야 하는 것은 아닙니다.&lt;/p&gt;
&lt;p&gt;다음과 같이 정리할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew upgrade = brew update + brew upgrade&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;upgrade 명령은 update 명령을 포함하고 있는 것입니다. 따라서 &lt;code&gt;brew upgrade&lt;/code&gt; 를 &lt;code&gt;brew update&lt;/code&gt; 를 생략하고 진행할 수 있는 것입니다. 그러나 생략을 하기 때문에 &lt;u&gt;update가 된 항목이 어떤 것인지 확인하지 않고 upgrade를 진행한다는 것을 유의해야 합니다&lt;/u&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew upgrade A
brew upgrade A B C ...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;알파벳 A, B, C를 예시로 들어서 설명하자면&lt;/p&gt;
&lt;br&gt;

&lt;p&gt;&lt;code&gt;brew upgrade A&lt;/code&gt; 처럼 항목을 지정하여 &lt;strong&gt;그 지정한 항목만 최신 버전으로&lt;/strong&gt; &lt;code&gt;upgrade&lt;/code&gt; 를 할 수 있고, &lt;code&gt;brew upgrade A B C ...&lt;/code&gt; 처럼 &lt;strong&gt;여러 개의 항목을 동시에 지정&lt;/strong&gt;하여 &lt;code&gt;upgrade&lt;/code&gt; 가 가능합니다.&lt;/p&gt;
&lt;h3&gt;brew upgrade --greedy&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img width=&quot;740&quot; alt=&quot;image&quot; src=&quot;https://user-images.githubusercontent.com/66409882/190559082-f82b1d56-da9f-4c34-8d46-a5dd30615a67.png&quot;&gt;
  &lt;img width=&quot;796&quot; alt=&quot;image&quot; src=&quot;https://user-images.githubusercontent.com/66409882/190559522-c50d3820-ed29-4e28-9dd1-6ee14dbabdd5.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew upgrade --greedy&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;brew upgrade&lt;/code&gt;에 &lt;code&gt;--greedy&lt;/code&gt; 옵션을 추가하면 &lt;code&gt;formula&lt;/code&gt;만 아니라 &lt;code&gt;cask&lt;/code&gt;까지 한 번에 upgrade가 가능합니다. 위 이미지를 참고하면 &lt;code&gt;formula&lt;/code&gt;인 &lt;code&gt;bat&lt;/code&gt;까지 upgrade 완료 후 바로 &lt;code&gt;cask&lt;/code&gt;들을 upgrade하는 것을 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;brew search&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/10/GQso2Pp6j5aHLCy.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew search A&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그래서 보통 자신이 설치하고자 혹은 궁금한 항목을 먼저 &lt;code&gt;brew search A&lt;/code&gt; 와 같은 명령어를 통해 탐색 즉 search를 합니다.&lt;/p&gt;
&lt;h2&gt;brew install&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://tva1.sinaimg.cn/large/008i3skNgy1gw7q3txg2mj317207640u.jpg&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew install A&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;말 그래도 패키지를 설치하는 것입니다. homebrew를 사용하지 않는다면 설치할 때 마다 해당 홈페이지에 들어가서 .dmg 파일을 받아서 설치를 진행해야하는 번거로움을 겪겠지만 homebrew를 활용하면 python, java와 같은 언어 뿐만이 아닌 htop과 같은 도구 또한 쉽게 설치하고 삭제할 수 있습니다.&lt;/p&gt;
&lt;h2&gt;brew list, ls&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/10/V4CBGcFskKXmvdA.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew list,ls [--formula | --cask]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;brew list&lt;/code&gt; 를 통해 자신의 맥에 있는 모든 항목들을 볼 수 있습니다. 또한 &lt;code&gt;--formula&lt;/code&gt; 혹은 &lt;code&gt;--cask&lt;/code&gt; 옵션을 줌으로써 전체가 아닌 자신이 원하는 특성의 항목들을 볼 수 있습니다.&lt;/p&gt;
&lt;h2&gt;brew uninstall, remove, rm&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew uninstall | remove | rm&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;brew를 통해 설치한 것을 삭제하는 명령어입니다. python, java와 같은 formula의 경우 삭제하기 간단하고 수월하다고 할 수 있습니다.&lt;/p&gt;
&lt;h2&gt;brew cleanup&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/10/tp5NS342qHE6jDd.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew cleanup&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;homebrew로 설치한 패키지 중 &lt;code&gt;brew upgrade&lt;/code&gt; 이후 최신 버전이 아닌 패키지 혹은 부속 파일들이 삭제되지 않고 찌꺼기처럼 쌓여있는 경우가 있습니다. 이 때 &lt;code&gt;brew cleanup&lt;/code&gt;을 사용한다면 깔끔하게 청소할 수 있습니다. 잘 쌓여있지 않아서 필자도 자주 하진 않고 종종하는 경우가 있습니다.&lt;/p&gt;
&lt;h2&gt;brew outdated&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/10/1P6EMeGzipxSctU.png&quot;&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
  &lt;img width=&quot;626&quot; alt=&quot;image&quot; src=&quot;https://user-images.githubusercontent.com/66409882/190557493-ca4e1163-9907-43f0-bcf6-d5668b12c68a.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew outdated&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;brew outdated&lt;/code&gt; 명령어를 통해서 &lt;code&gt;brew update&lt;/code&gt;를 하고 난 후 update 되어지지 않은 항목들을 확인할 수 있습니다. &lt;code&gt;brew upgrade&lt;/code&gt; 를 하기 전 자신이 upgrade를 원하거나 원치 않는 항목들을 사전에 확인 할 수 있습니다.&lt;/p&gt;
&lt;h3&gt;brew outdated --greedy&lt;/h3&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img width=&quot;624&quot; alt=&quot;image&quot; src=&quot;https://user-images.githubusercontent.com/66409882/190557396-55654269-75bc-46db-a3dc-2f91a4a2623b.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew outdated --greedy&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;brew outdated&lt;/code&gt; 명령어에 &lt;code&gt;--greedy&lt;/code&gt; 옵션을 추가하면 &lt;code&gt;cask&lt;/code&gt;의 목록들까지 함께 확인할 수 있습니다.&lt;/p&gt;
&lt;h2&gt;brew leaves&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/10/bWVlxjyFJIGRa6C.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew leaves&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;우선 &lt;code&gt;brew ls&lt;/code&gt; 명령어를 통해 설치된 항목들을 확인 할 수 있었습니다. 이를 간단하게 볼 수 있는 명령어가 바로 &lt;code&gt;brew leaves&lt;/code&gt; 명령어입니다. 이 명령어를 통해 자신이 설치한 formula 항목들에 한해서 부속적인 즉 &lt;strong&gt;&lt;code&gt;dependencies&lt;/code&gt; 항목들을 제외한 &lt;code&gt;brew ls --formula&lt;/code&gt;&lt;/strong&gt;를 볼 수 있습니다.&lt;/p&gt;
&lt;h2&gt;brew deps --tree --installed&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/10/TPcs5JLwSnWdNC8.png&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/10/fcSigeJaRWdA6nG.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;brew deps --tree --installed [formula | cask]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;다음과 같이 종속 formula 항목들과 그에 속하는 &lt;code&gt;dependencies&lt;/code&gt; 들을 쉽게 볼 수 있습니다. 또한 세부적으로 어떤 한 패키지에 대해서만 알고 싶다면 &lt;code&gt;brew deps --tree --installed python&lt;/code&gt; 과 같이 formula 항목 이름을 붙히면 그 항목에 대해서만 알 수 있습니다.&lt;/p&gt;
&lt;h2&gt;brew doctor&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://i.loli.net/2021/07/10/QHSqYaXDJFly5n7.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;brew doctor&lt;/code&gt; 를 통해 현재 내 맥의 homebrew와 관련된 것에 한해 문제가 있다면 이 명령어를 통해 진단을 할 수 있습니다. 지금은 문제가 없다고 판단할 수 있지만 종종 트러블이 일어나서 혼자 힘으로 해결하지 못하는 경우 &lt;code&gt;brew doctor&lt;/code&gt; 명령어를 통해서 나온 추천 명령어들을 통해 손쉽게 해결할 수 있습니다.&lt;/p&gt;</description>
      <category>Homebrew</category>
      <category>homebrew</category>
      <category>MacOS</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/7</guid>
      <comments>https://sukvvon.tistory.com/7#entry7comment</comments>
      <pubDate>Mon, 4 Jan 2021 14:18:26 +0900</pubDate>
    </item>
    <item>
      <title>[MacOS] zsh 주소 변경하기</title>
      <link>https://sukvvon.tistory.com/6</link>
      <description>&lt;h2&gt;shell 확인하기&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;echo $(which zsh)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;처음에 brew를 통해서 zsh를 설치하신 후 &lt;code&gt;echo $(which zsh)&lt;/code&gt; 명령어를 입력하면  &lt;code&gt;/usr/bin/zsh&lt;/code&gt; 가 나올 것입니다. 설치 후 자동적으로 변경이 된 줄 알았으나 변경이 되지 않은 이유는 설치는 하였으나 아직 시스템에 추가하지 않았고 shell을 변경하는 동작을 취하지 않았기 때문입니다.&lt;/p&gt;
&lt;p&gt;설치를 하였지만 사용하려고 하는 &lt;code&gt;/usr/local/bin/zsh&lt;/code&gt; 가 아직 설정이 되지 않았습니다. 사용을 하기 위해선 설치한 &lt;code&gt;/usr/local/bin/zsh&lt;/code&gt; 을 &lt;code&gt;/etc/shells&lt;/code&gt; 에 추가해줘야 합니다. 또한 추가를 하기 위해선 &lt;strong&gt;root&lt;/strong&gt; 권한이 필요해 앞에 &lt;strong&gt;sudo&lt;/strong&gt; 명령어를 써야만 합니다.&lt;/p&gt;
&lt;h2&gt;etc/shells에 /usr/local/bin/zsh 추가하기&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;sudo sh -c &amp;#39;echo $(which zsh) &amp;gt;&amp;gt; /etc/shells&amp;#39;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt; terminal에 위와 같이 입력 후 실행합니다. &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2021/07/09/nD2E6soOxwAdM9Y.png&quot; alt=&quot;image-20210709070616061&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;cat /etc/shells&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;terminal에 &lt;code&gt;cat /etc/shells&lt;/code&gt; 명령어를 입력하면 위 이미지와 같이 &lt;code&gt;usr/local/bin/zsh&lt;/code&gt;가 추가된 모습을 볼 수 있습니다.&lt;/p&gt;
&lt;h2&gt;/usr/local/bin/zsh로 shell 변경하기&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;chsh -s $(which zsh)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;which zsh&lt;/code&gt; 로 나오는 주소 즉 &lt;code&gt;usr/local/bin/zsh&lt;/code&gt; 로 변경을 해야하므로 &lt;code&gt;chsh -s $(which zsh)&lt;/code&gt; 을 입력 후 실행합니다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2021/07/09/u5ToWk1eBxarRDp.png&quot; alt=&quot;image-20210709072253274&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;echo $SHELL&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;echo $SHELL&lt;/code&gt; 을 입력하면 현재 나의 SHELL 주소를 확인 할 수 있습니다. &lt;code&gt;usr/local/bin/zsh&lt;/code&gt; 로 변경된 것을 확인할 수 있습니다.&lt;/p&gt;</description>
      <category>macOS</category>
      <category>MacOS</category>
      <category>zsh</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/6</guid>
      <comments>https://sukvvon.tistory.com/6#entry6comment</comments>
      <pubDate>Fri, 1 Jan 2021 22:08:05 +0900</pubDate>
    </item>
    <item>
      <title>[macOS] 런치패드(launchpad) 배열 변경하기</title>
      <link>https://sukvvon.tistory.com/3</link>
      <description>&lt;h2&gt;계기&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/144985612-2d77187e-3035-4991-9ac5-432c1580b8c2.png&quot;&gt;
&lt;/p&gt;

&lt;p&gt;macOS 기존의 런치패드는 행이 5, 열이 7인 배열입니다. macOS를 사용하면서 하단 독의 아이콘 크기에 비해서 런치패드의 아이콘 크기가 너무 크기도 하고 깔린 앱들을 페이지를 넘기며 보는 것 또한 번거로워 배열을 조정할 수 있으면 편할 것 같다는 생각을 하였습니다.&lt;/p&gt;
&lt;h2&gt;설정하기&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/144985089-973d61d5-9483-4c4f-8483-e66b7e8eac84.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;defaults write com.apple.dock springboard-columns -int 11 ##열 숫자
defaults write com.apple.dock springboard-rows -int 9 ##행 숫자
killall Dock&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;예를 들어 다음과 같이 행을 9 열을 11로 바꾼다고 가정하고 위 코드를 실행시킨다면 위 이미지와 같이 변경된 것을 볼 수 있습니다. 필자는 기존의 배열보다 보기 편하다는 생각을 하여 적용시키기로 결정했습니다.&lt;/p&gt;
&lt;h2&gt;초기화하기&lt;/h2&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/66409882/144985612-2d77187e-3035-4991-9ac5-432c1580b8c2.png&quot;&gt;
&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;defaults delete com.apple.dock springboard-columns
defaults delete com.apple.dock springboard-rows
killall Dock&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;만약 다시 원래대로 되돌리고 싶은 경우 위 코드를 실행하면 초기화 시킬 수 있습니다.&lt;/p&gt;</description>
      <category>macOS</category>
      <category>launchpad</category>
      <category>MacOS</category>
      <author>sukvvon</author>
      <guid isPermaLink="true">https://sukvvon.tistory.com/3</guid>
      <comments>https://sukvvon.tistory.com/3#entry3comment</comments>
      <pubDate>Sat, 26 Dec 2020 20:47:06 +0900</pubDate>
    </item>
  </channel>
</rss>