<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>juno.log</title>
    <link>https://everydayidid.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 4 Jul 2026 12:20:19 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>_주노</managingEditor>
    <image>
      <title>juno.log</title>
      <url>https://tistory1.daumcdn.net/tistory/3510455/attach/0278291baae44862816f454a0fe25d68</url>
      <link>https://everydayidid.tistory.com</link>
    </image>
    <item>
      <title>2020년 회고</title>
      <link>https://everydayidid.tistory.com/92</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; Notion에 있는거 복원용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;입영 연기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래는 2020년 1월에 입영할 예정이었으나 학습의 방향성이 잡히지 않은 상태에서 군대에서 그냥 보내는 시간이 너무 아깝다고 생각되어 군대를 1년 미루게 되었다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;블로깅 시작&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://everydayidid.tistory.com/&quot;&gt;tistory 블로그&lt;/a&gt;를 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한해의 각오를 다지기 위해 TID 블로그를 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계절학기를 수강하고 있었기 때문에 1월 14일까지는 포스팅이 없었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7월쯤 부터는 velog를 사용해서 포스팅하기도 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@junho5336&quot;&gt;https://velog.io/@junho5336&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;BCSD Lab BackEnd 트랙 입성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;겨울방학이 시작되고 Novice 과정이 끝났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Novice 과정에서 기본적인 컴퓨터공학 지식을 익히고 Backend 트랙을 선택했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당시에는 BackEnd 트랙을 선택하는데 큰 동기가 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그저 검은 창에 하얀 글자가 있는 CLI 창이 멋있어 보인다는 것이 BackEnd를 선택한 이유였다. 또한 1학년 1학기 때 우분투 수업을 꽤 흥미 있게 수강한 것도 한몫했던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BackEnd 트랙에 들어가기에 앞서 Spring Framework라는 것을 배우기 위해 Java에 대한 지식이 필요할 것 같아서 Java를 아주 약간 공부해봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://everydayidid.tistory.com/18?category=834499&quot;&gt;https://everydayidid.tistory.com/18?category=834499&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노트북도 아주 느리고 BackEnd 트랙의 교육과정을 따라가기도 벅찼기 때문에 Java를 깊이있게 학습하지 못했었다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;학습 시작&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB의 기본 개념, JDBC와 Maven에 대해 학습한 후 본격적으로 Spring에 대해 학습하기 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당시에는 Hello World를 띄우는 데만 2주가 걸릴 정도로 이해가 안 가고 굉장히 어려웠다.&amp;nbsp;&lt;a href=&quot;https://everydayidid.tistory.com/43?category=832673&quot;&gt;당시 심정&lt;/a&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IOC.. DI.. 이해가 안 가는것 투성이였다.&amp;nbsp; &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간중간 이뤄지는 실습은 정말 정신이 나갈 것 같았지만 그래도 어찌저찌하기는 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mybatis, Security에 대한 내용을 학습했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Security에서는 쿠키, 세션, HTTPS, 암호화(단방향, 양방향, bcrypt 등)와 같은 기초적인 내용을 학습했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 배운 Spring Security는 여전히 지금까지 이해가 안 되는 부분이다. 사용해보려고 여러 번 시도해봤지만 겉핥기로 대충은 쓸 수 있어도 활용해서 잘 쓰기가 정말 어려운 내용이었다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;프로젝트 진행&lt;/b&gt;&lt;/h2&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;평소에 해보고 싶었던 카카오톡 챗봇을 만들어보기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3월 20일에 시작해서 약 한 달 동안 진행했다.&amp;nbsp;&lt;a href=&quot;https://github.com/Choi-JJunho/chatbot/blob/master/%E1%84%80%E1%85%A2%E1%84%87%E1%85%A1%E1%86%AF%E1%84%8B%E1%85%B5%E1%86%AF%E1%84%8C%E1%85%B5.pdf&quot;&gt;개발일지&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;챗봇을 만들면서 Spring 3 이외에 많은 것들을 알 수 있었다. 이를 요약하면 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;python을 이용하여 웹 정보를 크롤링하는 방법&lt;/li&gt;
&lt;li&gt;python을 이용하여 DB에 데이터를 저장하는 방법&lt;/li&gt;
&lt;li&gt;카카오 채널 생성하는 방법&lt;/li&gt;
&lt;li&gt;카카오 오픈빌더를 이용하는 방법&lt;/li&gt;
&lt;li&gt;AWS EC2를 이용하여 Spring Project 배포하기&lt;/li&gt;
&lt;li&gt;Filezilla를 이용하여 FTP로 파일 전송하기&lt;/li&gt;
&lt;li&gt;Ubuntu에서 Cron으로 스케줄링하기&lt;/li&gt;
&lt;li&gt;JSON 형태의 데이터 가공하기&lt;/li&gt;
&lt;/ul&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;그 덕분인지 동아리에서 운영 중인 AWS를 유지보수하면서 거부감없이 접근할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 진행하면서 가장 어려웠던 부분은 카카오 오픈빌더의 사용법을 익히는 것이었다. 난생 처음 진행해보는 프로젝트이기도 하고 JSON 데이터를 어떻게 사용해야 할지도 감이 안 잡히고.. 여러모로 삽질의 연속이었다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;인수인계&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동아리의 정규인원이 되고 BackEnd트랙의 기본 인프라를 인수인계받았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS, Nginx, Tomcat 등등 많은 내용을 인수인계받으면서 기존 설정을 익혔다.&lt;/p&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;이때가 꽤 많이 바빴던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 분기가 정규 과정으로 올라오고 나서도 인수인계를 해야 했고, 이를 위한 문서도 작성해야 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AOP, Jenkins, Flyway, Redis, Nginx 등등 교육을 받을 때는 배우지 않았던 생소한 기술들이 많았고 이를 익히는 과정을 문서로 남겨두었다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;버그 리포트&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 만들어져있는 환경을 정확하게 이해하지 못했기 때문에 운용 중인 서버에서 몇몇 에러가 발생했을 때 이를 파악하는데 많은 시간을 들였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평균적으로 에러를 해결하는데 2시간~4시간 정도의 시간이 걸렸다. 이때는 밤낮이 바뀐 생활을 하고 있을 때라서 새벽에 오류가나면 실시간 대응은 나밖에 할수없어서 힘들기도 했다. 하지만 오류를 많이 보면서 오류 메시지와 친해질 수 있었던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결했던 몇몇 오류들을 요약해두고자 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시간표가 엑셀 파일로 주어지는데 매 학기마다 데이터의 형태가 약간씩 변경되어 Python 코드를 수정&lt;/li&gt;
&lt;li&gt;NullPointerException 이 발생하여 DB 구조를 다시 살펴보고 Soft Delete로 관리되는 데이터임을 확인하게 됨. 이후 DB에서 게시글을 관리할 때 주의해야 함을 인지함&lt;/li&gt;
&lt;li&gt;서버 다운
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;근본적인 원인을 찾지 못하고 DDOS 공격이라고 유추하여 nginx 상에서 DDOS 공격을 예방하는 구문을 추가함. (로그의 중요성을 알지 못함.)
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;AWS CloudWatch 모니터링 확인 결과 CPU 사용량 급증&lt;/li&gt;
&lt;li&gt;접속 기록을 확인해보니 VPN을 사용한 것 같은 해외 접근들이 많음.&lt;/li&gt;
&lt;li&gt;이러한 접근에 대한 대응이 처음이라서 '~할 것이다' 라는 유추로 결론이남.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;기존과 동일한 문제가 발생하여 로그를 살펴보았고, 정상적이지 않은 접근을 발견함.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;이전과 동일하게 CPU사용량이 급증한 증상은 동일했음.&lt;/li&gt;
&lt;li&gt;추후 동일 증상에 대한 동향 파악을 위해 CPU 점유율에 대한 로깅이 필요하다고 생각하여 cron을 이용하여 top 명령어를 수행한 것에 대한 로그를 남김.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;이후 동일한 현상이 발생했을 때 java의 메모리 점유율보다 사용하는 메모리의 양이 부족하여 CPU에 부하가 갔다는 것으로 파악
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;SWAP 메모리를 할당함.&lt;/li&gt;
&lt;li&gt;이후 1달에 1번꼴로 다운되던 서버가 다운되지 않음.&lt;/li&gt;
&lt;li&gt;그간의 에러의 원인을 파악한 것으로 예상됨.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Front 공부&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간에 FrontEnd 쪽 공부를 한번 해보고 싶어서 노마드코더에서&amp;nbsp;&lt;a href=&quot;https://nomadcoders.co/react-fundamentals&quot;&gt;ReactJS로 영화 웹서비스 만들기 클론코딩&lt;/a&gt;을 잠깐 해봤었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSS, JavaScript에 대한 이해도가 거의 없어서 따라가기도 벅찼지만, React가 대충 어떤 방식으로 돌아가는지 감을 잡는 정도로도 만족했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직히 분야가 취향이 아니라서 깊게 파고 싶지는 않았다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Notion&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 TID 그룹으로 하루하루 계획을 짜면서 생활했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간에 약간 의지가 떨어져서 안 하다가 이대로 살면 안 될 것같아서 8월 4주 차부터 윤섭이랑 Notion을 시작하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12월은 군대에 가기 전이라서 빡세게 살고 싶지 않았는지 Notion에 손도안갔다...ㅎㅎ&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;하고자 했으나 의지박약으로 인해 못한 것들&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;책 읽기 (도커/쿠버네티스를 활용한 컨테이너 개발 실전 입문), (자바 채팅 프로그래밍)&lt;/li&gt;
&lt;li&gt;if kakao 강의 몰아 듣기&lt;/li&gt;
&lt;li&gt;기존에 만든 챗봇 프로젝트 보완하기&lt;/li&gt;
&lt;li&gt;Spring 3를 이용한 프로젝트&lt;/li&gt;
&lt;li&gt;유튜브로 Spring 강의 올리기 (이론)&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/channel/UCwDgHT2e3iYE8P4Dh4_PYdg&quot;&gt;채널&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Spring Security를 이용해서 프로젝트 하나 올리기 (기본 게시판이라도)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등등.. 뭔가 더 있었던 것 같은데 위의 것만으로도 현타가 온다&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>  Daily/잡담</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/92</guid>
      <comments>https://everydayidid.tistory.com/92#entry92comment</comments>
      <pubDate>Wed, 1 Jan 2025 23:35:40 +0900</pubDate>
    </item>
    <item>
      <title>  토스 SLASH24 개발자 컨퍼런스  </title>
      <link>https://everydayidid.tistory.com/91</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;  토스 SLASH24 개발자 컨퍼런스  &lt;br /&gt;토스 SLASH 홈페이지에서 예쁜 시간표를 만들 수 있는 기능을 제공해서 나만의 시간표를 만들어 공유해봅니다  &lt;br /&gt;흥미로운 세션이 많아서 꼭 참여할 수 있었으면 좋겠네요 ✨✨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Toss&amp;nbsp;SLASH24:&amp;nbsp;&lt;a href=&quot;https://toss.im/slash-24&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://toss.im/slash-24&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;1701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9BANo/btsJcMSR07m/i3nx9mU3EU1dTyX0VW1eU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9BANo/btsJcMSR07m/i3nx9mU3EU1dTyX0VW1eU1/img.png&quot; data-alt=&quot;SLASH24 나만의 시간표&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9BANo/btsJcMSR07m/i3nx9mU3EU1dTyX0VW1eU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9BANo%2FbtsJcMSR07m%2Fi3nx9mU3EU1dTyX0VW1eU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1360&quot; height=&quot;1701&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;1701&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SLASH24 나만의 시간표&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>slash24</category>
      <category>개발자</category>
      <category>개발자컨퍼런스</category>
      <category>나만의시간표</category>
      <category>이벤트</category>
      <category>토스</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/91</guid>
      <comments>https://everydayidid.tistory.com/91#entry91comment</comments>
      <pubDate>Fri, 23 Aug 2024 17:15:49 +0900</pubDate>
    </item>
    <item>
      <title>make class transient or serializable</title>
      <link>https://everydayidid.tistory.com/90</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1650&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ysQEC/btsuWX74aEa/VAGxsGM1AANNrTPnYKgy8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ysQEC/btsuWX74aEa/VAGxsGM1AANNrTPnYKgy8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ysQEC/btsuWX74aEa/VAGxsGM1AANNrTPnYKgy8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FysQEC%2FbtsuWX74aEa%2FVAGxsGM1AANNrTPnYKgy8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1650&quot; height=&quot;448&quot; data-origin-width=&quot;1650&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 작성하던 중 SonarLint에서 위와 같은 경고 문구를 제시했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sonar Cloud에서 말하고있는 이유로는 다음과 같은 설명이 포함되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;This rule raises an issue on a non-transient and non-serializable field within a serializable class, if said class does not have writeObject and readObject methods defined.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;이 규칙은 직렬화 가능한 클래스 내에 일시적이지 않고 직렬화할 수 없는 필드가 있는 경우, 해당 클래스에 writeObject 및 readObject 메서드가 정의되어 있지 않은 경우 문제를 일으킵니다.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한마디로 직렬화 대상인 클래스 내부에 직렬화를 할 수 없는 클래스가 필드로 존재하여 생기는 문제라고 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1494&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bopG2V/btsuZ1vBKkp/m2BaZuqa42kg1J7K28Aack/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bopG2V/btsuZ1vBKkp/m2BaZuqa42kg1J7K28Aack/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bopG2V/btsuZ1vBKkp/m2BaZuqa42kg1J7K28Aack/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbopG2V%2FbtsuZ1vBKkp%2Fm2BaZuqa42kg1J7K28Aack%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1494&quot; height=&quot;108&quot; data-origin-width=&quot;1494&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 transient 키워드를 붙여줌으로써 직렬화 대상에서 제외할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;static, final 키워드와 같이 사용할 수 없다는 특징이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;a href=&quot;https://hbase.tistory.com/282&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://hbase.tistory.com/282&lt;/a&gt;&lt;/p&gt;</description>
      <category>  Language/Java</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/90</guid>
      <comments>https://everydayidid.tistory.com/90#entry90comment</comments>
      <pubDate>Thu, 21 Sep 2023 19:29:15 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] level1 : 추억 점수</title>
      <link>https://everydayidid.tistory.com/88</link>
      <description>&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1612&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d616u6/btsp3mx3Vm2/koo4jsJeU3dlgOUOxj32z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d616u6/btsp3mx3Vm2/koo4jsJeU3dlgOUOxj32z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d616u6/btsp3mx3Vm2/koo4jsJeU3dlgOUOxj32z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd616u6%2Fbtsp3mx3Vm2%2Fkoo4jsJeU3dlgOUOxj32z0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1612&quot; height=&quot;704&quot; data-origin-width=&quot;1612&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1660&quot; data-origin-height=&quot;1174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5MgEV/btsp9YWIqay/VriVLJHa1wrpwQlEHTDtN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5MgEV/btsp9YWIqay/VriVLJHa1wrpwQlEHTDtN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5MgEV/btsp9YWIqay/VriVLJHa1wrpwQlEHTDtN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5MgEV%2Fbtsp9YWIqay%2FVriVLJHa1wrpwQlEHTDtN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1660&quot; height=&quot;1174&quot; data-origin-width=&quot;1660&quot; data-origin-height=&quot;1174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;파이썬이랑 친해지기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dictionary 형태의 자료형에 두 리스트의 값을 담기 위해 다음과 같이 작성했다.&lt;/p&gt;
&lt;pre id=&quot;code_1691227695793&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;name = [&quot;may&quot;, &quot;kein&quot;, &quot;kain&quot;, &quot;radi&quot;]
yearning = [5, 10, 1, 3]
dic = {}
for i, j in zip(name, yearning):
    dic[i] = j&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬에서는 iterable한 tuple 값에 대해 dictionary로 초기화해주는 dict() 함수를 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1691227819974&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;name = [&quot;may&quot;, &quot;kein&quot;, &quot;kain&quot;, &quot;radi&quot;]
yearning = [5, 10, 1, 3]
dict(zip(name, yearning))

# 실행 결과
# {'may': 5, 'kein': 10, 'kain': 1, 'radi': 3}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1691227972375&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(name, yearning, photo):
    dic = dict(zip(name, yearning))
    answer = []
    
    for k in photo:
        score = 0
        for l in k:
            if dic.get(l) is not None:
                score += dic.get(l)
            
        answer.append(score)
    
    return answer&lt;/code&gt;&lt;/pre&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>레벨1</category>
      <category>파이썬</category>
      <category>프로그래머스</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/88</guid>
      <comments>https://everydayidid.tistory.com/88#entry88comment</comments>
      <pubDate>Sat, 5 Aug 2023 18:33:12 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] level1 : 가장 가까운 같은 글자</title>
      <link>https://everydayidid.tistory.com/87</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1802&quot; data-origin-height=&quot;1310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XD83c/btsp3359nka/6ltEjKO32hkc3RjAYdJC8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XD83c/btsp3359nka/6ltEjKO32hkc3RjAYdJC8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XD83c/btsp3359nka/6ltEjKO32hkc3RjAYdJC8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXD83c%2Fbtsp3359nka%2F6ltEjKO32hkc3RjAYdJC8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1802&quot; height=&quot;1310&quot; data-origin-width=&quot;1802&quot; data-origin-height=&quot;1310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;파이썬이랑 친해지기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬에서는 iteratable한 데이터에 대해 인덱스와 값을 함께 조회할 수 있는 enumerate() 라는 함수를 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 작성할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1691226844976&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for idx, ch in enumerate(&quot;hello world&quot;):
    print(idx, ch)

# 실행결과    
# 0 h
# 1 e
# 2 l
# 3 l
# 4 o
# 5
# 6 w
# 7 o
# 8 r
# 9 l
# 10 d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1691226890328&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(s):
    tmp = {}
    answer = []
    
    for idx, ch in enumerate(s):
        if tmp.get(ch) is None:
            tmp[ch] = idx
            answer.append(-1)
        else:
            answer.append(idx - tmp[ch])
            tmp[ch] = idx
    
    return answer&lt;/code&gt;&lt;/pre&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>레벨1</category>
      <category>파이썬</category>
      <category>프로그래머스</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/87</guid>
      <comments>https://everydayidid.tistory.com/87#entry87comment</comments>
      <pubDate>Sat, 5 Aug 2023 18:15:00 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] level1 : 삼총사</title>
      <link>https://everydayidid.tistory.com/86</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;1156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byThF0/btspMjnNAUm/izlVrwsJOkiHQkk19YNOKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byThF0/btspMjnNAUm/izlVrwsJOkiHQkk19YNOKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byThF0/btspMjnNAUm/izlVrwsJOkiHQkk19YNOKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyThF0%2FbtspMjnNAUm%2FizlVrwsJOkiHQkk19YNOKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1012&quot; height=&quot;1156&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;1156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;파이썬이랑 친해지기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬에서는 순열과 조합을 위한 라이브러리를 제공해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1690977880927&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from itertools import combinations

a = [1, 2, 3, 4]

for i in combinations(a, 3):
    print(i)
    
# 결과
# (1, 2, 3)
# (1, 2, 4)
# (1, 3, 4)
# (2, 3, 4)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;combinations 함수를 통해 특정 리스트에 있는 요소들을 조합으로 표현할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 반환되는 값은 iteratable 객체이며 for문으로 순회할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1690978007900&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from itertools import permutations

a = [1, 2, 3, 4]

for i in permutations(a, 3):
    print(i)

# 결과
# (1, 2, 3)
# (1, 2, 4)
# (1, 3, 2)
# (1, 3, 4)
# (1, 4, 2)
# (1, 4, 3)
# (2, 1, 3)
# (2, 1, 4)
# (2, 3, 1)
# ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;permutations 함수를 이용하여 순열도 구할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1690978052199&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from itertools import combinations
def solution(number):
    return len([1 for i in combinations(number,3) if sum(i) == 0])&lt;/code&gt;&lt;/pre&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>레벨1</category>
      <category>파이썬</category>
      <category>프로그래머스</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/86</guid>
      <comments>https://everydayidid.tistory.com/86#entry86comment</comments>
      <pubDate>Wed, 2 Aug 2023 21:07:46 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] level1 : 3진법 뒤집기</title>
      <link>https://everydayidid.tistory.com/85</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;1011&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LfCig/btspUhoFp4s/eN1skEDEuZ8kMSv2Ui48Qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LfCig/btspUhoFp4s/eN1skEDEuZ8kMSv2Ui48Qk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LfCig/btspUhoFp4s/eN1skEDEuZ8kMSv2Ui48Qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLfCig%2FbtspUhoFp4s%2FeN1skEDEuZ8kMSv2Ui48Qk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1158&quot; height=&quot;1011&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;1011&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;파이썬이랑 친해지기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬에서는 진법 변환을 아주 편하게 수행해주는 함수를 제공해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단지 문자열을 int형으로 변경해주는줄만 알았던 int() 함수에 비밀이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int함수에는 두번째 인자를 포함할 수 있는데 이는 바로 int형으로 변환하려는 문자열을 두번째 인자 n진수로 읽는다는 의미다.&lt;/p&gt;
&lt;pre id=&quot;code_1690973517150&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a = &quot;100&quot;
b = &quot;70&quot;
c = &quot;0021&quot;

# 2진수: 100 -&amp;gt; 10진수: 4
print(int(a, 2))
# 8진수: 70 -&amp;gt; 10진수: 56
print(int(b, 8))
# 3진수: 0021 -&amp;gt; 10진수: 7
print(int(c, 3))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 위 int() 함수를 이용하여 진법 변환을 손쉽게 수행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1690973712123&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(n):
    tmp = ''
    while(n):
        tmp += str(n % 3)
        n //= 3

    return int(tmp,3)&lt;/code&gt;&lt;/pre&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>레벨1</category>
      <category>프로그래머스</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/85</guid>
      <comments>https://everydayidid.tistory.com/85#entry85comment</comments>
      <pubDate>Wed, 2 Aug 2023 19:55:25 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] level1 : 최대공약수와 최소공배수</title>
      <link>https://everydayidid.tistory.com/84</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;942&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DiLsC/btsplOIn1Ic/71CXs5AEWF1AKAiXRR5OeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DiLsC/btsplOIn1Ic/71CXs5AEWF1AKAiXRR5OeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DiLsC/btsplOIn1Ic/71CXs5AEWF1AKAiXRR5OeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDiLsC%2FbtsplOIn1Ic%2F71CXs5AEWF1AKAiXRR5OeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1066&quot; height=&quot;942&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;942&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;수학이랑 친해지기&lt;/h3&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 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 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;h4 data-ke-size=&quot;size20&quot;&gt;유클리드 호제법 - 최대공약수&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;호제법은 두 수가 서로(互) 상대방 수를 나누어(除)서 결국 원하는 수를 얻는 알고리즘이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1690732715433&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;유클리드 호제법 - 위키백과, 우리 모두의 백과사전&quot; data-og-description=&quot;위키백과, 우리 모두의 백과사전. 유클리드 호제법(-互除法, Euclidean algorithm) 또는 유클리드 알고리즘은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란 &quot; data-og-host=&quot;ko.wikipedia.org&quot; data-og-source-url=&quot;https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95&quot; data-og-url=&quot;https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95&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;유클리드 호제법 - 위키백과, 우리 모두의 백과사전&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;위키백과, 우리 모두의 백과사전. 유클리드 호제법(-互除法, Euclidean algorithm) 또는 유클리드 알고리즘은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ko.wikipedia.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;두 수 A와 B가 있을 때 (A &amp;gt; B) A 를 B로 나눈 나머지가 존재하지 않을 때 까지 A % B 연산을 계속한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A % B&amp;nbsp; = C (C != 0)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B % C = D (D != 0)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C % D == 0 일 경우 D는 A와 B의 최대공약수다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정을 유클리드 호제법이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TMI) 최대 공약수를 구하는 함수의 이름을 gcd() 라고 많이 짓는데 최대공약수가 영어로 Greatest Common Divisor 이기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;유클리드 호제법 - 최소공배수&lt;/h3&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 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 data-ke-size=&quot;size16&quot;&gt;TMI) 최소공배수는Least Common Multiple이기 때문에 lcm() 이라고 많이 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1690733732251&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(n, m):
    answer = []
    a = max(n, m)
    b = min(n, m)

    while(b):
        c = b
        b = a % b
        a = c

    return [a, n*m // a]&lt;/code&gt;&lt;/pre&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/84</guid>
      <comments>https://everydayidid.tistory.com/84#entry84comment</comments>
      <pubDate>Mon, 31 Jul 2023 01:15:39 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] level1 : 문자열 다루기 기본</title>
      <link>https://everydayidid.tistory.com/83</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;966&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cROntQ/btsplQfqnpr/E1WJVZvjWAn3nCryIRXyDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cROntQ/btsplQfqnpr/E1WJVZvjWAn3nCryIRXyDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cROntQ/btsplQfqnpr/E1WJVZvjWAn3nCryIRXyDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcROntQ%2FbtsplQfqnpr%2FE1WJVZvjWAn3nCryIRXyDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1094&quot; height=&quot;966&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;966&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;파이썬이랑 친해지기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열을 다루는데 편리한 기능을 많이 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 알고있던 함수로 isalpha()라는 메소드를 사용하여 다음과 같은 코드를 작성했다.&lt;/p&gt;
&lt;pre id=&quot;code_1690731256596&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(s):
    for i in s:
        if len(s) != 4 and len(s) != 6:
            return False
        if i.isalpha():
            return False
    return True&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드는 문자열 s를 순회하는 과정을 표현하면서 약간은 보기 힘들 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬에서 제공하는 isdiget() 함수를 이용해 보다 간결하게 표현할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1690731575430&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(s):
    return s.isdigit() and len(s) in [4,6]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>문자열</category>
      <category>파이썬</category>
      <category>프로그래머스</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/83</guid>
      <comments>https://everydayidid.tistory.com/83#entry83comment</comments>
      <pubDate>Mon, 31 Jul 2023 00:39:51 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] level1 : 약수의 개수와 덧셈</title>
      <link>https://everydayidid.tistory.com/82</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;877&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmw9DF/btspeJNxyz3/f0IZGIIiGZsk1I3V1NphZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmw9DF/btspeJNxyz3/f0IZGIIiGZsk1I3V1NphZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmw9DF/btspeJNxyz3/f0IZGIIiGZsk1I3V1NphZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcmw9DF%2FbtspeJNxyz3%2Ff0IZGIIiGZsk1I3V1NphZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;971&quot; height=&quot;877&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;877&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;파이썬이랑 친해지기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;&lt;span&gt;파이썬에서는 수식으로 제곱을 표현할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;&lt;span&gt;x ** y 는 x의 y제곱이라는 뜻이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;&lt;span&gt;이를 이용해서 제곱근도 구할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;&lt;span&gt;x ** 0.5&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;&lt;span&gt;math에 존재하는 함수인 pow()를 사용해도 동일한 효과를 가져올 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;&lt;span&gt;제곱근의 경우 math에서 제공하는 sqrt() 메소드를 사용하는 방법도 존재한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;수학이랑 친해지기&lt;/h3&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 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;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1690518153632&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(left, right):
    answer = 0
    for i in range(left, right+1):
        if int(i**0.5) == i**0.5:
            answer -= i
        else:
            answer += i
    return answer&lt;/code&gt;&lt;/pre&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>레벨1</category>
      <category>파이썬</category>
      <category>프로그래머스</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/82</guid>
      <comments>https://everydayidid.tistory.com/82#entry82comment</comments>
      <pubDate>Fri, 28 Jul 2023 13:23:06 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] level1 : 내적</title>
      <link>https://everydayidid.tistory.com/81</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;773&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xffDy/btso6MRrCIs/yWUk5PNXf45IR0UPlXbhf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xffDy/btso6MRrCIs/yWUk5PNXf45IR0UPlXbhf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xffDy/btso6MRrCIs/yWUk5PNXf45IR0UPlXbhf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxffDy%2Fbtso6MRrCIs%2FyWUk5PNXf45IR0UPlXbhf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;830&quot; height=&quot;773&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;773&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;파이썬이랑 친해지기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두개의 iteratable한 요소가 존재할 때 zip 함수를 이용하여 튜플 형태로 동시에 순회할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1690431367937&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a = [1, 2, 3, 4]
b = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;]

for tp in zip(a, b):
    print(tp)
    
# (1, 'a')
# (2, 'b')
# (3, 'c')
# (4, 'd')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 위처럼 zip() 함수에 두 리스트를 넣으면 튜플 형태의 iterator를 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1690431445947&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a = [1, 2, 3]
b = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;]

for tp in zip(a, b):
    print(tp)
    
# (1, 'a')
# (2, 'b')
# (3, 'c')&lt;/code&gt;&lt;/pre&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;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1690431563946&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(a, b):
    return sum([i * j for i, j in zip(a,b)])&lt;/code&gt;&lt;/pre&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>레벨1</category>
      <category>파이썬</category>
      <category>프로그래머스</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/81</guid>
      <comments>https://everydayidid.tistory.com/81#entry81comment</comments>
      <pubDate>Thu, 27 Jul 2023 13:19:45 +0900</pubDate>
    </item>
    <item>
      <title>[BAEKJOON] 18110번 : solved.ac</title>
      <link>https://everydayidid.tistory.com/80</link>
      <description>&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;solved.ac는 Sogang ICPC Team 학회원들의 알고리즘 공부에 도움을 주고자 만든 서비스이다. 지금은 서강대뿐만 아니라 수많은 사람들이 solved.ac의 도움을 받아 알고리즘 공부를 하고 있다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;ICPC Team은 백준 온라인 저지에서 문제풀이를 연습하는데, 백준 온라인 저지의 문제들에는 난이도 표기가 없어서, 지금까지는 다양한 문제를 풀어 보고 싶더라도 난이도를 가늠하기 어려워 무슨 문제를 풀어야 할지 판단하기 곤란했기 때문에 solved.ac가 만들어졌다. solved.ac가 생긴 이후 전국에서 200명 이상의 기여자 분들께서 소중한 난이도 의견을 공유해 주셨고, 지금은 약 7,000문제에 난이도 표기가 붙게 되었다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;어떤 문제의 난이도는 그 문제를 푼 사람들이 제출한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;난이도 의견&lt;/b&gt;을 바탕으로 결정한다. 난이도 의견은 그 사용자가 생각한 난이도를 의미하는 정수 하나로 주어진다. solved.ac가 사용자들의 의견을 바탕으로 난이도를 결정하는 방식은 다음과 같다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;- 아직 아무 의견이 없다면 문제의 난이도는 0으로 결정한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;- 의견이 하나 이상 있다면, 문제의 난이도는 모든 사람의 난이도 의견의 30% 절사평균으로 결정한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;절사평균이란 극단적인 값들이 평균을 왜곡하는 것을 막기 위해 가장 큰 값들과 가장 작은 값들을 제외하고 평균을 내는 것을 말한다. 30% 절사평균의 경우 위에서 15%, 아래에서 15%를 각각 제외하고 평균을 계산한다. 따라서 20명이 투표했다면, 가장 높은 난이도에 투표한 3명과 가장 낮은 난이도에 투표한 3명의 투표는 평균 계산에 반영하지 않는다는 것이다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;제외되는 사람의 수는 위, 아래에서 각각 반올림한다. 25명이 투표한 경우 위, 아래에서 각각 3.75명을 제외해야 하는데, 이 경우 반올림해 4명씩을 제외한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;마지막으로, 계산된 평균도 정수로 반올림된다. 절사평균이 16.7이었다면 최종 난이도는 17이 된다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;사용자들이 어떤 문제에 제출한 난이도 의견 목록이 주어질 때, solved.ac가 결정한 문제의 난이도를 계산하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 줄에 난이도 의견의 개수&lt;span&gt;&amp;nbsp;&lt;/span&gt;n이 주어진다. (0&amp;nbsp;&amp;le;&amp;nbsp;n&amp;nbsp;&amp;le; 3 &amp;times; 105)&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;이후 두 번째 줄부터 1 +&lt;span&gt;&amp;nbsp;&lt;/span&gt;n번째 줄까지 사용자들이 제출한 난이도 의견&lt;span&gt;&amp;nbsp;&lt;/span&gt;n개가 한 줄에 하나씩 주어진다. 모든 난이도 의견은 1 이상 30 이하이다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #585f69; font-size: 1.62em; letter-spacing: -1px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;출력&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;solved.ac가 계산한 문제의 난이도를 출력한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #585f69; font-size: 1.62em; letter-spacing: -1px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;파이썬이랑 친해지기&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파이썬의 deque&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬에서 deque 자료구조를 사용할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1690260423994&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque

b = [int(input()) for _ in range(a)]
b.sort()
dq = deque(b)


for _ in range(cut):
	dq.popleft()
	dq.pop()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;for문 한줄로 쓰기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[결과 for 반복문] 형태로 for문을 한줄로 축약하여 작성할 수도 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1690260566191&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;b = [int(input()) for _ in range(a)]&lt;/code&gt;&lt;/pre&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;b&gt;round 함수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬의 round 함수는 반올림을 하는 함수지만 동작이 예상과 달랐다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2452&quot; data-origin-height=&quot;1050&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgHokR/btsoQKf1rqu/kNKFbOwhKj3jSX1YsKulu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgHokR/btsoQKf1rqu/kNKFbOwhKj3jSX1YsKulu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgHokR/btsoQKf1rqu/kNKFbOwhKj3jSX1YsKulu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgHokR%2FbtsoQKf1rqu%2FkNKFbOwhKj3jSX1YsKulu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2452&quot; height=&quot;1050&quot; data-origin-width=&quot;2452&quot; data-origin-height=&quot;1050&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;round()는 사사오입 원칙을 따른다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반올림할 자리의 수가 5일 때 반올림 하는 상황에서 앞자리의 숫자가 &lt;b&gt;짝수면 내림하고 홀수면 올림 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때문에 우리가 보통 생각하는 반올림을 수행하기에 round 함수는 적절하지 않다고 생각된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0.5를 더한다음 내림을 하는것이 더 정확한 결과를 가져올 것이라고 기대할 수 있겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;입력시간 단축하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력이 느려서 시간초과가 일어난다면 다음 구문을 추가하여 입력 시간을 단축시킬 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1690260374762&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys

input = sys.stdin.readline&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1690259999426&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from collections import deque

input = sys.stdin.readline
a = int(input())
cut = int(a * 0.15 + 0.5)

b = [int(input()) for _ in range(a)]
b.sort()
dq = deque(b)

if dq:
    for _ in range(cut):
        dq.popleft()
        dq.pop()
    print(int(sum(dq) / len(dq) + 0.5))
else:
    print(0)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/18110&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/18110&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1690260132114&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;18110번: solved.ac&quot; data-og-description=&quot;5명의 15%는 0.75명으로, 이를 반올림하면&amp;nbsp;1명이다. 따라서 solved.ac는 가장 높은 난이도 의견과 가장 낮은 난이도 의견을 하나씩 제외하고, {5, 5, 7}에 대한 평균으로 문제 난이도를 결정한다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/18110&quot; data-og-url=&quot;https://www.acmicpc.net/problem/18110&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/g0fku/hyTqvSwcOE/V6ds5mZFDDfckKU22jymA1/img.png?width=1277&amp;amp;height=256&amp;amp;face=0_0_1277_256&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/18110&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/18110&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/g0fku/hyTqvSwcOE/V6ds5mZFDDfckKU22jymA1/img.png?width=1277&amp;amp;height=256&amp;amp;face=0_0_1277_256');&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;18110번: solved.ac&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;5명의 15%는 0.75명으로, 이를 반올림하면&amp;nbsp;1명이다. 따라서 solved.ac는 가장 높은 난이도 의견과 가장 낮은 난이도 의견을 하나씩 제외하고, {5, 5, 7}에 대한 평균으로 문제 난이도를 결정한다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/80</guid>
      <comments>https://everydayidid.tistory.com/80#entry80comment</comments>
      <pubDate>Tue, 25 Jul 2023 13:58:14 +0900</pubDate>
    </item>
    <item>
      <title>[BAEKJOON] 27866번 : 문자와 문자열</title>
      <link>https://everydayidid.tistory.com/79</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckEZ4c/btsoErghCPz/qK1v5wwh7rAiN0eLg9glK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckEZ4c/btsoErghCPz/qK1v5wwh7rAiN0eLg9glK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckEZ4c/btsoErghCPz/qK1v5wwh7rAiN0eLg9glK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckEZ4c%2FbtsoErghCPz%2FqK1v5wwh7rAiN0eLg9glK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1290&quot; height=&quot;754&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;754&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;파이썬이랑 친해지기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬으로 문자열을 index로 접근하고싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬에서는 다음과 같은 방법으로 index로 문자열에 접근할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1690245550080&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;str = &quot;helloWorld&quot;
print(str[0])

# h&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1690245569113&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;str = input()
idx = int(input())
print(str[idx-1])&lt;/code&gt;&lt;/pre&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;/p&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>백준</category>
      <category>백준 27866</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/79</guid>
      <comments>https://everydayidid.tistory.com/79#entry79comment</comments>
      <pubDate>Tue, 25 Jul 2023 09:39:58 +0900</pubDate>
    </item>
    <item>
      <title>[BAEKJOON] 1157번 : 단어 공부</title>
      <link>https://everydayidid.tistory.com/78</link>
      <description>&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 data-ke-size=&quot;size16&quot;&gt;다음 문제를 풀면서 파이썬의 dictionary를 학습했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;파이썬이랑 친해지기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;dictionary 사용하기&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;python의 dictionary는 key, value 형태의 자료형으로 java의 Map과 유사한 형태를 띄고있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;python의 dictionary는 순서가 없다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음과 같이 선언하고 값을 변경할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1690199327554&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dic = {'a': 1, 'b': 2}

dic['a'] = 4&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;max 함수사용하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python의 max, min 함수는 iteratable한 자료형을 넣으면 해당 값에서 최대, 최소값을 가져온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1690199270023&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dic = { 'a':1, 'b':2 }
max(&lt;/code&gt;&lt;/pre&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;b&gt;두 함수의 콜라보&lt;/b&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;max 함수를 사용할 때 key라는 인자를 사용하면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;어떤 값을 기준으로 최댓값을 구할 지&lt;/span&gt;&amp;nbsp;지정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드를 해석하면&lt;b&gt; dictionary에서 get으로 얻어오는 value를 기준으로 최댓값을 구한다.&lt;/b&gt; 라고 볼 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1690199577315&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;str = input().upper()

dic = {}

for i in str:
    if i not in dic:
        dic[i] = 0
    dic[i] += 1

print(max(dic, key=dic.get))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;118&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/neTWO/btsoSj2fGb3/7H9jkKQ3m3sK1K3rvHbsG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/neTWO/btsoSj2fGb3/7H9jkKQ3m3sK1K3rvHbsG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/neTWO/btsoSj2fGb3/7H9jkKQ3m3sK1K3rvHbsG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FneTWO%2FbtsoSj2fGb3%2F7H9jkKQ3m3sK1K3rvHbsG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;118&quot; height=&quot;102&quot; data-origin-width=&quot;118&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 문제 조건을 만족시키기 위해 두개 이상의 최댓값이 존재하면 &lt;b&gt;?&lt;/b&gt;를 띄우기만 하면 된다.&lt;/p&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1690200751247&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;str = input().upper()

dic = {}

for i in str:
    if i not in dic:
        dic[i] = 0
    dic[i] += 1

result = []
m = max(dic.values())
for key, val in dic.items():
    if m == val:
        result.append(key)

if len(result) != 1:
    print('?')
else:
    print(result[0])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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://www.acmicpc.net/problem/1157&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/1157&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1690198556527&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;1157번: 단어 공부&quot; data-og-description=&quot;알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1157&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1157&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1157&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1157&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;1157번: 단어 공부&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>python</category>
      <category>백준</category>
      <category>백준 1157</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/78</guid>
      <comments>https://everydayidid.tistory.com/78#entry78comment</comments>
      <pubDate>Mon, 24 Jul 2023 21:14:25 +0900</pubDate>
    </item>
    <item>
      <title>Error creating bean with name 'jpaAuditingHandler'</title>
      <link>https://everydayidid.tistory.com/77</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;서론&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1344&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5p5rt/btsnGPalASK/CvYkmFX3Z5axqsfumzkOfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5p5rt/btsnGPalASK/CvYkmFX3Z5axqsfumzkOfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5p5rt/btsnGPalASK/CvYkmFX3Z5axqsfumzkOfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5p5rt%2FbtsnGPalASK%2FCvYkmFX3Z5axqsfumzkOfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1344&quot; height=&quot;312&quot; data-origin-width=&quot;1344&quot; data-origin-height=&quot;312&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebMvcTest를 이용하여 테스트를 수행하려 했지만 다음과 같은 문구와 함께 오류가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1689407550404&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting constructor argument
		at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:377)
		at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:135)
		at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:693)
		at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:517)
		at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1332)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1689408188842&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': JPA metamodel must not be empty
		at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1770)
		at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:598)
		at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520)
		at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Application에 @EnableJpaAuditing을 작성했는데 이와 관련된 문제가 아닐까 의심이 든다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OOmNa/btsnFLTHGkx/cFs4mVzyglohzDKknreuYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OOmNa/btsnFLTHGkx/cFs4mVzyglohzDKknreuYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OOmNa/btsnFLTHGkx/cFs4mVzyglohzDKknreuYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOOmNa%2FbtsnFLTHGkx%2FcFs4mVzyglohzDKknreuYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1278&quot; height=&quot;562&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 @WebMvcTest를 수행할 때 다음과 같은 흐름으로 생각해볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@WebMvcTest는Spring 컨테이너를 요구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때문에 Application클래스를 로드하면서 @EnableJpaAuditing을 사용하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 왜 문제가 되는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebMvcTest와 같은 슬라이스 테스트를 수행할 경우 별도로 Import를 하지 않는 이상 Jpa와 연관된 Bean들을 로드하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때문에 @EnableJpaAuditing에서 요구하는 Jpa 관련 Bean을 등록할 수 없는 현상이 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두가지 해결방법이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. @MockBean으로 Jpa 연관 Bean 등록하기&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;@MockBean(JpaMetamodelMappingContext.class)&lt;/span&gt;&lt;/h3&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 data-ke-size=&quot;size16&quot;&gt;2. @Configuration으로 테스트와 격리하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Application클래스를 로드하면서 생긴 문제기 때문에 Configuration으로 설정을 Applicaiton 클래스와 분리하여 관리할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQFByQ/btsnFEf5Vui/MkkKUCkcAlEDo3WIidj6fk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQFByQ/btsnFEf5Vui/MkkKUCkcAlEDo3WIidj6fk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQFByQ/btsnFEf5Vui/MkkKUCkcAlEDo3WIidj6fk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQFByQ%2FbtsnFEf5Vui%2FMkkKUCkcAlEDo3WIidj6fk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;548&quot; height=&quot;206&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게하면 슬라이스테스트를 수행할 때 별도의 Import를 하지 않는 이상 @EnableJpaAuditing에 대한 추가작업을 신경쓰지 않아도 된다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Reference&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@suujeen/Error-creating-bean-with-name-jpaAuditingHandler&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@suujeen/Error-creating-bean-with-name-jpaAuditingHandler&lt;/a&gt;&lt;/p&gt;</description>
      <category>  Spring</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/77</guid>
      <comments>https://everydayidid.tistory.com/77#entry77comment</comments>
      <pubDate>Sat, 15 Jul 2023 17:09:01 +0900</pubDate>
    </item>
    <item>
      <title>SpringBoot 3.1.1 빌드 시 자바 버전 안맞음</title>
      <link>https://everydayidid.tistory.com/76</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 Java 11로 개발을 진행했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SpringBoot 3.1.1 버전으로 프로젝트를 생성하면서 자바 버전 충돌이 났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;SpringBoot 3.0부터는 Spring Framework 6 버전을 사용한다.&lt;br /&gt;공식문서에 따르면 Spring 6부터는 Java 17만을 지원하기 때문에 자바 17 아래버전인 경우 프로젝트를 빌드할 수 없다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://spring.io/blog/2022/11/16/spring-framework-6-0-goes-ga&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://spring.io/blog/2022/11/16/spring-framework-6-0-goes-ga&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1688044331170&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;Spring Framework 6.0 goes GA&quot; data-og-description=&quot;Dear Spring community, It is my pleasure to announce that Spring Framework 6.0.0 is generally available from Maven Central now! This is the start of a new framework generation for 2023 and beyond, embracing current and upcoming innovations in OpenJDK and t&quot; data-og-host=&quot;spring.io&quot; data-og-source-url=&quot;https://spring.io/blog/2022/11/16/spring-framework-6-0-goes-ga&quot; data-og-url=&quot;https://spring.io/blog/2022/11/16/spring-framework-6-0-goes-ga&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/q2xnh/hyS9H0Bv3n/vDsHjQcieSFJEpuJbjsJ00/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/fhsSV/hyS9ILX8A2/gwde72wj1wgZLxJDrWAokK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://spring.io/blog/2022/11/16/spring-framework-6-0-goes-ga&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://spring.io/blog/2022/11/16/spring-framework-6-0-goes-ga&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/q2xnh/hyS9H0Bv3n/vDsHjQcieSFJEpuJbjsJ00/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/fhsSV/hyS9ILX8A2/gwde72wj1wgZLxJDrWAokK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;Spring Framework 6.0 goes GA&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Dear Spring community, It is my pleasure to announce that Spring Framework 6.0.0 is generally available from Maven Central now! This is the start of a new framework generation for 2023 and beyond, embracing current and upcoming innovations in OpenJDK and t&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;spring.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# build.gradle 설정
plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.1'
    id 'io.spring.dependency-management' version '1.1.0'
}

group = 'com.juno'

java {
    sourceCompatibility = '17'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'com.h2database:h2'
    runtimeOnly 'com.mysql:mysql-connector-j'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gradle로 build를 시도하면 다음과 같은 오류가 발생하면서 빌드가 안된다.&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;A problem occurred configuring root project 'todoary'.
&amp;gt; Could not resolve all files for configuration ':classpath'.
   &amp;gt; Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.1.1.
     Required by:
         project : &amp;gt; org.springframework.boot:org.springframework.boot.gradle.plugin:3.1.1
      &amp;gt; No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.1.1 was found. The consumer was configured to find a library for use during runtime, compatible with Java 11, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '8.1.1' but:
          - Variant 'apiElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.1.1 declares a library, packaged as a jar, and its dependencies declared externally:
              - Incompatible because this component declares a component for use during compile-time, compatible with Java 17 and the consumer needed a component for use during runtime, compatible with Java 11
              - Other compatible attribute:
                  - Doesn't say anything about org.gradle.plugin.api-version (required '8.1.1')
          - Variant 'javadocElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.1.1 declares a component for use during runtime, and its dependencies declared externally:
              - Incompatible because this component declares documentation and the consumer needed a library
              - Other compatible attributes:
                  - Doesn't say anything about its target Java version (required compatibility with Java 11)
                  - Doesn't say anything about its elements (required them packaged as a jar)
                  - Doesn't say anything about org.gradle.plugin.api-version (required '8.1.1')
          - Variant 'mavenOptionalApiElements' capability org.springframework.boot:spring-boot-gradle-plugin-maven-optional:3.1.1 declares a library, packaged as a jar, and its dependencies declared externally:
              - Incompatible because this component declares a component for use during compile-time, compatible with Java 17 and the consumer needed a component for use during runtime, compatible with Java 11
              - Other compatible attribute:
                  - Doesn't say anything about org.gradle.plugin.api-version (required '8.1.1')
          - Variant 'mavenOptionalRuntimeElements' capability org.springframework.boot:spring-boot-gradle-plugin-maven-optional:3.1.1 declares a library for use during runtime, packaged as a jar, and its dependencies declared externally:
              - Incompatible because this component declares a component, compatible with Java 17 and the consumer needed a component, compatible with Java 11
              - Other compatible attribute:
                  - Doesn't say anything about org.gradle.plugin.api-version (required '8.1.1')
          - Variant 'runtimeElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.1.1 declares a library for use during runtime, packaged as a jar, and its dependencies declared externally:
              - Incompatible because this component declares a component, compatible with Java 17 and the consumer needed a component, compatible with Java 11
              - Other compatible attribute:
                  - Doesn't say anything about org.gradle.plugin.api-version (required '8.1.1')
          - Variant 'sourcesElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.1.1 declares a component for use during runtime, and its dependencies declared externally:
              - Incompatible because this component declares documentation and the consumer needed a library
              - Other compatible attributes:
                  - Doesn't say anything about its target Java version (required compatibility with Java 11)
                  - Doesn't say anything about its elements (required them packaged as a jar)
                  - Doesn't say anything about org.gradle.plugin.api-version (required '8.1.1')

* Try:
&amp;gt; Run with --stacktrace option to get the stack trace.
&amp;gt; Run with --info or --debug option to get more log output.
&amp;gt; Run with --scan to get full insights.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2176&quot; data-origin-height=&quot;1658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boy7vl/btslS7cO9Vu/OK6KSftmAjevud8Rc77dI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boy7vl/btslS7cO9Vu/OK6KSftmAjevud8Rc77dI0/img.png&quot; data-alt=&quot;Gradle&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boy7vl/btslS7cO9Vu/OK6KSftmAjevud8Rc77dI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fboy7vl%2FbtslS7cO9Vu%2FOK6KSftmAjevud8Rc77dI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2176&quot; height=&quot;1658&quot; data-origin-width=&quot;2176&quot; data-origin-height=&quot;1658&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Gradle&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인텔리제이 설정에서 &lt;b&gt;Settings - Build, Execution, Deployment - Build Tools - Gradle&lt;/b&gt; 설정을 확인해보면 Gradle JVM 버전이 맞지 않음을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WZWEi/btslULG6xeW/kI8irXMmpiBloUXLNl1pW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WZWEi/btslULG6xeW/kI8irXMmpiBloUXLNl1pW1/img.png&quot; data-alt=&quot;Gradle JVM 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WZWEi/btslULG6xeW/kI8irXMmpiBloUXLNl1pW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWZWEi%2FbtslULG6xeW%2FkI8irXMmpiBloUXLNl1pW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1132&quot; height=&quot;104&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Gradle JVM 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gradle JVM 버전을 17로 올려준뒤 Gradle Build를 해주면 무사히 필드를 완료할 수 있다.&lt;/p&gt;</description>
      <category>  Spring</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/76</guid>
      <comments>https://everydayidid.tistory.com/76#entry76comment</comments>
      <pubDate>Thu, 29 Jun 2023 22:12:59 +0900</pubDate>
    </item>
    <item>
      <title>Spring Security RoleHierarchy 미적용 이슈</title>
      <link>https://everydayidid.tistory.com/75</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Security를 사용해 권한 계층을 구현하려고 했으나 @Secured를 사용하면서 RoleHierarchy가 적용되지 않는 문제가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;[환경]&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;java 11&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Boot 2.7.6&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Security 5.7.5&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EBENa/btrUCjxnAQU/xskrmM8Io31hhCtCvznkD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EBENa/btrUCjxnAQU/xskrmM8Io31hhCtCvznkD1/img.png&quot; data-alt=&quot;SpringBoot version / Spring Security version&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EBENa/btrUCjxnAQU/xskrmM8Io31hhCtCvznkD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEBENa%2FbtrUCjxnAQU%2FxskrmM8Io31hhCtCvznkD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;426&quot; height=&quot;136&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SpringBoot version / Spring Security version&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;[시나리오]&lt;/h2&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 data-ke-size=&quot;size16&quot;&gt;SecurityConfig 설정에서 @EnableGlobalMethodSecurity 설정을 이용해 securityEnabled = true 속성을 지정해 @Secured어노테이션을 사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzIJRP/btrUulwPMwZ/3TEKcSAIBQVd1jTK1PUD01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzIJRP/btrUulwPMwZ/3TEKcSAIBQVd1jTK1PUD01/img.png&quot; data-alt=&quot;SecurityConfig&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzIJRP/btrUulwPMwZ/3TEKcSAIBQVd1jTK1PUD01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzIJRP%2FbtrUulwPMwZ%2F3TEKcSAIBQVd1jTK1PUD01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;558&quot; height=&quot;111&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SecurityConfig&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;권한 계층을 지정하기 위해 다음과 같이 RoleHierarchy 설정을 Bean으로 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ADMIN &amp;gt; MANAGER &amp;gt; USER 설정으로 ADMIN은 MANAGER, USER의 권한에 대해 수행 가능해야한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mSfIA/btrUvWi9K2I/XDNL7yKJZP0kg3cKcsqui0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mSfIA/btrUvWi9K2I/XDNL7yKJZP0kg3cKcsqui0/img.png&quot; data-alt=&quot;roleHierarchy&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mSfIA/btrUvWi9K2I/XDNL7yKJZP0kg3cKcsqui0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmSfIA%2FbtrUvWi9K2I%2FXDNL7yKJZP0kg3cKcsqui0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;463&quot; height=&quot;158&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;158&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;roleHierarchy&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 @Secured 어노테이션에 대한 Custom Annotation을 만들어 진행했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EDB7Y/btrUuHT6DyK/PHxAP8cClFM9bW7YKLbkO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EDB7Y/btrUuHT6DyK/PHxAP8cClFM9bW7YKLbkO0/img.png&quot; data-alt=&quot;Custom Annotation&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EDB7Y/btrUuHT6DyK/PHxAP8cClFM9bW7YKLbkO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEDB7Y%2FbtrUuHT6DyK%2FPHxAP8cClFM9bW7YKLbkO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;325&quot; height=&quot;127&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Custom Annotation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;189&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8zdSn/btrUuXW7avd/63x1siMJI9zLIKCF0M4sSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8zdSn/btrUuXW7avd/63x1siMJI9zLIKCF0M4sSk/img.png&quot; data-alt=&quot;MemberController&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8zdSn/btrUuXW7avd/63x1siMJI9zLIKCF0M4sSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8zdSn%2FbtrUuXW7avd%2F63x1siMJI9zLIKCF0M4sSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;189&quot; height=&quot;343&quot; data-origin-width=&quot;189&quot; data-origin-height=&quot;343&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MemberController&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기대 효과 : Manager 권한을 가지고있는 유저가 /user1, /user2에 대해 수행 가능하고 /user3에 대해서는 권한부족으로 수행 불가.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Manager권한으로 테스트 한 결과&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1407&quot; data-origin-height=&quot;877&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ujaLp/btrUurxbeXB/Z0Qy2spwFLogtG60DWDaq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ujaLp/btrUurxbeXB/Z0Qy2spwFLogtG60DWDaq1/img.png&quot; data-alt=&quot;User 권한을 가지는 요청&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ujaLp/btrUurxbeXB/Z0Qy2spwFLogtG60DWDaq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FujaLp%2FbtrUurxbeXB%2FZ0Qy2spwFLogtG60DWDaq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1407&quot; height=&quot;877&quot; data-origin-width=&quot;1407&quot; data-origin-height=&quot;877&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;User 권한을 가지는 요청&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1271&quot; data-origin-height=&quot;844&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OUPeX/btrUwrwsQBV/ANk5tyKtia4yNg4SkacNIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OUPeX/btrUwrwsQBV/ANk5tyKtia4yNg4SkacNIK/img.png&quot; data-alt=&quot;Manager 권한을 가지는 요청&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OUPeX/btrUwrwsQBV/ANk5tyKtia4yNg4SkacNIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOUPeX%2FbtrUwrwsQBV%2FANk5tyKtia4yNg4SkacNIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1271&quot; height=&quot;844&quot; data-origin-width=&quot;1271&quot; data-origin-height=&quot;844&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Manager 권한을 가지는 요청&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RoleHierarchy가 정상적으로 적용되지 않는 모습이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;[해결과정]&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 이슈를 통해 문제를 인지할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-security/issues/9158&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/spring-projects/spring-security/issues/9158&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1672023449215&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;RoleHierarchy is ignored with GlobalMethodSecurityConfiguration and @Secured annotation &amp;middot; Issue #9158 &amp;middot; spring-projects/spring&quot; data-og-description=&quot;Describe the bug Using @EnableGlobalMethodSecurity(securedEnabled = true) does not work with injected RoleHierarchy For @Secured based version of interceptor the only Voters configured in Affirmati...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/spring-projects/spring-security/issues/9158&quot; data-og-url=&quot;https://github.com/spring-projects/spring-security/issues/9158&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Iifbv/hyQ1lrPwsf/4QwXAMDDAH7g3SVHXTNYU0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-security/issues/9158&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/spring-projects/spring-security/issues/9158&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Iifbv/hyQ1lrPwsf/4QwXAMDDAH7g3SVHXTNYU0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;RoleHierarchy is ignored with GlobalMethodSecurityConfiguration and @Secured annotation &amp;middot; Issue #9158 &amp;middot; spring-projects/spring&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Describe the bug Using @EnableGlobalMethodSecurity(securedEnabled = true) does not work with injected RoleHierarchy For @Secured based version of interceptor the only Voters configured in Affirmati...&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;@EnableGlobalMethodSecurity 설정을 사용했을 경우 MethodSecurity (@Secured, @PreAuthorized 등)에 RoleHierarchy가 적용되지 않는다.&lt;/span&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYPYoK/btrUxo7kWbC/mt625LlfLYh0Ve0OzrRnpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYPYoK/btrUxo7kWbC/mt625LlfLYh0Ve0OzrRnpk/img.png&quot; data-alt=&quot;https://github.com/spring-projects/spring-security/issues/9158&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYPYoK/btrUxo7kWbC/mt625LlfLYh0Ve0OzrRnpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYPYoK%2FbtrUxo7kWbC%2Fmt625LlfLYh0Ve0OzrRnpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;648&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;648&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://github.com/spring-projects/spring-security/issues/9158&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신 @EnableMethodSecurity 속성을 사용하면 이러한 문제를 해결할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+ @Secured를 사용하려면 @EnableMethodSecurity의 securedEnabled를 true로 설정해줘야한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biHwZT/btrUE5fC6qy/RMTaWNPWk4jS7zAT6ejtmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biHwZT/btrUE5fC6qy/RMTaWNPWk4jS7zAT6ejtmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biHwZT/btrUE5fC6qy/RMTaWNPWk4jS7zAT6ejtmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiHwZT%2FbtrUE5fC6qy%2FRMTaWNPWk4jS7zAT6ejtmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;558&quot; height=&quot;108&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qBKdl/btrUL7iHipj/6NZKIkDVrmCUVEd1MliUd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qBKdl/btrUL7iHipj/6NZKIkDVrmCUVEd1MliUd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qBKdl/btrUL7iHipj/6NZKIkDVrmCUVEd1MliUd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqBKdl%2FbtrUL7iHipj%2F6NZKIkDVrmCUVEd1MliUd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;653&quot; height=&quot;467&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@PreAuthorize, @PostAuthorize와 같은 경우는 default가 true라서 그냥 사용할 수 있다.&lt;/p&gt;</description>
      <category>  Spring</category>
      <category>@Secured</category>
      <category>Hierarchy</category>
      <category>springboot</category>
      <category>SpringSecurity</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/75</guid>
      <comments>https://everydayidid.tistory.com/75#entry75comment</comments>
      <pubDate>Mon, 26 Dec 2022 12:02:05 +0900</pubDate>
    </item>
    <item>
      <title>java.lang.NullPointerException: null at springfox.documentation.spring.web.WebMvcPatternsRequestConditionWrapper.getPatterns(WebMvcPatternsRequestConditionWrapper.java:56)</title>
      <link>https://everydayidid.tistory.com/74</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Boot 프로젝트에 swagger를 적용하려고 했으나 다음과 같은 문제가 발생했다.&lt;/p&gt;
&lt;pre id=&quot;code_1665304467131&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException
	at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:181) ~[spring-context-5.3.23.jar:5.3.23]
	at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54) ~[spring-context-5.3.23.jar:5.3.23]
	at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356) ~[spring-context-5.3.23.jar:5.3.23]
	at java.lang.Iterable.forEach(Iterable.java:75) ~[na:1.8.0_202]
	at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155) ~[spring-context-5.3.23.jar:5.3.23]
	at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123) ~[spring-context-5.3.23.jar:5.3.23]
	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:935) ~[spring-context-5.3.23.jar:5.3.23]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586) ~[spring-context-5.3.23.jar:5.3.23]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.4.jar:2.7.4]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) [spring-boot-2.7.4.jar:2.7.4]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) [spring-boot-2.7.4.jar:2.7.4]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) [spring-boot-2.7.4.jar:2.7.4]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) [spring-boot-2.7.4.jar:2.7.4]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) [spring-boot-2.7.4.jar:2.7.4]
	at com.junho.junhomepage.JunHomePageApplication.main(JunHomePageApplication.java:10) [main/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_202]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_202]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_202]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_202]
	at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-2.7.4.jar:2.7.4]
Caused by: java.lang.NullPointerException: null
	at springfox.documentation.spring.web.WebMvcPatternsRequestConditionWrapper.getPatterns(WebMvcPatternsRequestConditionWrapper.java:56) ~[springfox-spring-webmvc-3.0.0.jar:3.0.0]
	at springfox.documentation.RequestHandler.sortedPaths(RequestHandler.java:113) ~[springfox-core-3.0.0.jar:3.0.0]
	at springfox.documentation.spi.service.contexts.Orderings.lambda$byPatternsCondition$3(Orderings.java:89) ~[springfox-spi-3.0.0.jar:3.0.0]
	at java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:469) ~[na:1.8.0_202]
	at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355) ~[na:1.8.0_202]
	at java.util.TimSort.sort(TimSort.java:220) ~[na:1.8.0_202]
	at java.util.Arrays.sort(Arrays.java:1512) ~[na:1.8.0_202]
	at java.util.ArrayList.sort(ArrayList.java:1462) ~[na:1.8.0_202]
	at java.util.stream.SortedOps$RefSortingSink.end(SortedOps.java:387) ~[na:1.8.0_202]
	at java.util.stream.Sink$ChainedReference.end(Sink.java:258) ~[na:1.8.0_202]
	at java.util.stream.Sink$ChainedReference.end(Sink.java:258) ~[na:1.8.0_202]
	at java.util.stream.Sink$ChainedReference.end(Sink.java:258) ~[na:1.8.0_202]
	at java.util.stream.Sink$ChainedReference.end(Sink.java:258) ~[na:1.8.0_202]
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482) ~[na:1.8.0_202]
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) ~[na:1.8.0_202]
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) ~[na:1.8.0_202]
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:1.8.0_202]
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) ~[na:1.8.0_202]
	at springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider.requestHandlers(WebMvcRequestHandlerProvider.java:81) ~[springfox-spring-webmvc-3.0.0.jar:3.0.0]
	at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[na:1.8.0_202]
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382) ~[na:1.8.0_202]
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) ~[na:1.8.0_202]
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) ~[na:1.8.0_202]
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) ~[na:1.8.0_202]
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:1.8.0_202]
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) ~[na:1.8.0_202]
	at springfox.documentation.spring.web.plugins.AbstractDocumentationPluginsBootstrapper.withDefaults(AbstractDocumentationPluginsBootstrapper.java:107) ~[springfox-spring-web-3.0.0.jar:3.0.0]
	at springfox.documentation.spring.web.plugins.AbstractDocumentationPluginsBootstrapper.buildContext(AbstractDocumentationPluginsBootstrapper.java:91) ~[springfox-spring-web-3.0.0.jar:3.0.0]
	at springfox.documentation.spring.web.plugins.AbstractDocumentationPluginsBootstrapper.bootstrapDocumentationPlugins(AbstractDocumentationPluginsBootstrapper.java:82) ~[springfox-spring-web-3.0.0.jar:3.0.0]
	at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.start(DocumentationPluginsBootstrapper.java:100) ~[springfox-spring-web-3.0.0.jar:3.0.0]
	at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178) ~[spring-context-5.3.23.jar:5.3.23]
	... 19 common frames omitted&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SpringBoot 2.6버전에서 변경된 사항에서 문제점을 찾을 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1846&quot; data-origin-height=&quot;838&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nx4Ho/btrN9kWVTS6/yN6U4CnDBEsDJRKGviDPq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nx4Ho/btrN9kWVTS6/yN6U4CnDBEsDJRKGviDPq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nx4Ho/btrN9kWVTS6/yN6U4CnDBEsDJRKGviDPq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnx4Ho%2FbtrN9kWVTS6%2FyN6U4CnDBEsDJRKGviDPq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1846&quot; height=&quot;838&quot; data-origin-width=&quot;1846&quot; data-origin-height=&quot;838&quot;/&gt;&lt;/span&gt;&lt;/figure&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;The&amp;nbsp;default&amp;nbsp;strategy&amp;nbsp;for&amp;nbsp;matching&amp;nbsp;request&amp;nbsp;paths&amp;nbsp;against&amp;nbsp;registered&amp;nbsp;Spring&amp;nbsp;MVC&amp;nbsp;handler&amp;nbsp;mappings&amp;nbsp;has&amp;nbsp;changed&amp;nbsp;from&amp;nbsp;AntPathMatcher&amp;nbsp;to&amp;nbsp;PathPatternParser.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;등록된 Spring MVC 핸들러 매핑에 대해 요청 경로를 일치시키는 기본 전략이 AntPathMatcher에서 PathPatternParser로 변경되었습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 전략으로 변경하기 위해서(오류를 해결하기 위해서)는 application.properties에 다음 속성을 추가해주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1665305071209&quot; class=&quot;ini&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring.mvc.pathmatch.matching-strategy=ant_path_matcher&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Spring</category>
      <category>error</category>
      <category>swagger</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/74</guid>
      <comments>https://everydayidid.tistory.com/74#entry74comment</comments>
      <pubDate>Sun, 9 Oct 2022 17:45:50 +0900</pubDate>
    </item>
    <item>
      <title>org.flywaydb.core.api.FlywayException: Unsupported Database: MySQL 8.0</title>
      <link>https://everydayidid.tistory.com/73</link>
      <description>&lt;pre id=&quot;code_1661473870221&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.flywaydb&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;flyway-mysql&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;9.1.6&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[환경]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SpringBoot 2.7.3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mysql 8.0.29-arm64&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SpringBoot에서 MySQL과 Flyway를 사용하기 위해 의존성을 추가했다.&lt;/p&gt;
&lt;pre id=&quot;code_1661473730847&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.flywaydb&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;flyway-core&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;9.1.6&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
        
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;8.0.29&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PostgreSQL을 사용할때는 flyway-core만으로도 실행이 가능했지만 MySQL을 사용할 때는 다음과 같은 오류와 함께 실행이 되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;org.springframework.beans.factory.BeanCreationException:&amp;nbsp;Error&amp;nbsp;creating&amp;nbsp;bean&amp;nbsp;with&amp;nbsp;name&amp;nbsp;'flywayInitializer'&amp;nbsp;defined&amp;nbsp;in&amp;nbsp;class&amp;nbsp;path&amp;nbsp;resource&amp;nbsp;[org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]:&amp;nbsp;Invocation&amp;nbsp;of&amp;nbsp;init&amp;nbsp;method&amp;nbsp;failed;&amp;nbsp;nested&amp;nbsp;exception&amp;nbsp;is&amp;nbsp;org.flywaydb.core.api.FlywayException:&amp;nbsp;Unsupported&amp;nbsp;Database:&amp;nbsp;MySQL&amp;nbsp;8.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mysql을 사용하는 경우 아래 의존성을 추가해줘야한다.&lt;/p&gt;
&lt;pre id=&quot;code_1661473877248&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- https://mvnrepository.com/artifact/org.flywaydb/flyway-mysql --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.flywaydb&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;flyway-mysql&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;9.1.6&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reference&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/72711770/flyway-unsupported-database-mysql-8-0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/72711770/flyway-unsupported-database-mysql-8-0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1661474526173&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;flyway : Unsupported Database: MySQL 8.0&quot; data-og-description=&quot;I am using java 11, and I have added flyway in spring-boot application like below. dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation group: 'my...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/72711770/flyway-unsupported-database-mysql-8-0&quot; data-og-url=&quot;https://stackoverflow.com/questions/72711770/flyway-unsupported-database-mysql-8-0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bJmVf2/hyPAxlJX1h/tASMPvILhLDleU0IlWwLB0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316,https://scrap.kakaocdn.net/dn/fdd1X/hyPzrOaPrC/vp3KOoshYWGdUzJs4V8UT0/img.png?width=1897&amp;amp;height=518&amp;amp;face=0_0_1897_518&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/72711770/flyway-unsupported-database-mysql-8-0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/72711770/flyway-unsupported-database-mysql-8-0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bJmVf2/hyPAxlJX1h/tASMPvILhLDleU0IlWwLB0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316,https://scrap.kakaocdn.net/dn/fdd1X/hyPzrOaPrC/vp3KOoshYWGdUzJs4V8UT0/img.png?width=1897&amp;amp;height=518&amp;amp;face=0_0_1897_518');&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;flyway : Unsupported Database: MySQL 8.0&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I am using java 11, and I have added flyway in spring-boot application like below. dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation group: 'my...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://flywaydb.org/documentation/database/mysql#java-usage&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://flywaydb.org/documentation/database/mysql#java-usage&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1661474528980&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;Homepage - Flyway&quot; data-og-description=&quot;Version control for your database. Robust schema evolution across all your environments. With ease, pleasure, and plain SQL.&quot; data-og-host=&quot;flywaydb.org&quot; data-og-source-url=&quot;https://flywaydb.org/documentation/database/mysql#java-usage&quot; data-og-url=&quot;https://flywaydb.org&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://flywaydb.org/documentation/database/mysql#java-usage&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://flywaydb.org/documentation/database/mysql#java-usage&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;Homepage - Flyway&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Version control for your database. Robust schema evolution across all your environments. With ease, pleasure, and plain SQL.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;flywaydb.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Spring</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/73</guid>
      <comments>https://everydayidid.tistory.com/73#entry73comment</comments>
      <pubDate>Fri, 26 Aug 2022 09:43:19 +0900</pubDate>
    </item>
    <item>
      <title>GSON - com.google.gson.stream.MalformedJsonException</title>
      <link>https://everydayidid.tistory.com/72</link>
      <description>&lt;pre id=&quot;code_1659407841736&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Gson gson = new Gson();
HashMap&amp;lt;String, Object&amp;gt; jsonObject = gson.fromJson(input.toString(), new TypeToken&amp;lt;HashMap&amp;lt;String, Object&amp;gt;&amp;gt;(){}.getType());
result.add(jsonObject);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와같이 작성하였을 때&lt;span&gt;&amp;nbsp;&lt;/span&gt;com.google.gson.stream.MalformedJsonException이 발생했다.&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 data-ke-size=&quot;size16&quot;&gt;Gson을 사용할 때는 한글, 영어, 일부 특수문자를 변환할 수 없기 때문에 별도의 변환작업이 필요하다.&lt;/p&gt;
&lt;pre id=&quot;code_1659407819288&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public String replaceStr(String str) {
    String tempStr = str.replace(&quot;㎖&quot;, &quot;ml&quot;);

    // 한글, 영어, 일부 특수문자를 제외한 문자 제거
    String match = &quot;[^\uAC00-\uD7A3xfe0-9a-zA-Z~!@#$%^&amp;amp;*()_+|&amp;lt;&amp;gt;?:{}]&quot;;
    tempStr = tempStr.replaceAll(match, &quot;&quot;);
    return tempStr;
}​&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Language/Java</category>
      <category>java</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/72</guid>
      <comments>https://everydayidid.tistory.com/72#entry72comment</comments>
      <pubDate>Tue, 2 Aug 2022 11:39:23 +0900</pubDate>
    </item>
    <item>
      <title>@Value annotation 사용 간 유의사항</title>
      <link>https://everydayidid.tistory.com/71</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;프로젝트 설정 도중 @Value를 사용하기 위해 다음과 같이 설정했는데 다음과 같은 오류가 발생하면서 앱이 구동하지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1656993063646&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service
@RequiredArgsConstructor
public class JWTService {

    @Value(&quot;${homepage.key}&quot;)
    private final String baseKey;
    private final SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
	...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Parameter&amp;nbsp;0&amp;nbsp;of&amp;nbsp;constructor&amp;nbsp;in&amp;nbsp;junho.homepage.service.JWTService&amp;nbsp;required&amp;nbsp;a&amp;nbsp;bean&amp;nbsp;of&amp;nbsp;type&amp;nbsp;'java.lang.String'&amp;nbsp;that&amp;nbsp;could&amp;nbsp;not&amp;nbsp;be&amp;nbsp;found.&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2090&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOhE1o/btrGw2pdE9U/q0KxQ92ALhGgOltEzz4dG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOhE1o/btrGw2pdE9U/q0KxQ92ALhGgOltEzz4dG0/img.png&quot; data-alt=&quot;Error message&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOhE1o/btrGw2pdE9U/q0KxQ92ALhGgOltEzz4dG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOhE1o%2FbtrGw2pdE9U%2Fq0KxQ92ALhGgOltEzz4dG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2090&quot; height=&quot;382&quot; data-origin-width=&quot;2090&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Error message&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lombok에서 제공하는 @RequiredArgsConstructor는 final 혹은 @NotNull 속성이 붙어있는것에 대해 Bean으로 주입한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Value값에 해당하는 변수를 final로 선언했기 때문에 이를 Bean으로 주입받으려고 하기 때문에 발생한 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;final 키워드를 제거함으로써 문제를 해결할 수 있었다.&lt;/p&gt;</description>
      <category>  Spring</category>
      <category>Spring</category>
      <category>value</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/71</guid>
      <comments>https://everydayidid.tistory.com/71#entry71comment</comments>
      <pubDate>Tue, 5 Jul 2022 12:58:57 +0900</pubDate>
    </item>
    <item>
      <title>[BAEKJOON] 10814번 : 나이순 정렬</title>
      <link>https://everydayidid.tistory.com/70</link>
      <description>&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 &amp;le; N &amp;le; 100,000)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;basic&quot;&gt;&lt;code&gt;3
21 Junkyu
21 Dohyun
20 Sunyoung
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;basic&quot;&gt;&lt;code&gt;20 Sunyoung
21 Junkyu
21 Dohyun&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 sort를 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vector&amp;lt;pair&amp;lt;int, string&amp;gt;&amp;gt; 형태로 데이터를 받아서 나이순으로 sort하면 될거라고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 한가지 간과한 사실이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sort 함수는 unstable sort를 수행하는 함수라서 조건이 같을 때 기존의 순서를 유지한다는 보장이 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 기존의 순서를 유지해주는 stable_sort를 사용하여 문제를 해결했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1639228414932&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;

using namespace std;

bool Solve(pair&amp;lt;int, string&amp;gt; a, pair&amp;lt;int, string&amp;gt; b) {
    return a.first &amp;lt; b.first;
}

int main()
{
    vector&amp;lt;pair&amp;lt;int, string&amp;gt;&amp;gt; v;
    int n;
    int age;
    string name;
    cin &amp;gt;&amp;gt; n;
    
    for(int i = 0; i &amp;lt; n; i++) {
        cin &amp;gt;&amp;gt; age &amp;gt;&amp;gt; name;
        v.push_back(pair&amp;lt;int, string&amp;gt;(age, name));
    }
    
    stable_sort(v.begin(), v.end(), Solve);
    
    for(int i = 0; i &amp;lt; v.size(); i++) {
        cout &amp;lt;&amp;lt; v[i].first &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; v[i].second &amp;lt;&amp;lt; &quot;\n&quot;;
    }
    
    return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>stable_sort</category>
      <category>백준</category>
      <category>백준 10814번</category>
      <category>백준 나이순 정렬</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/70</guid>
      <comments>https://everydayidid.tistory.com/70#entry70comment</comments>
      <pubDate>Sat, 11 Dec 2021 22:18:21 +0900</pubDate>
    </item>
    <item>
      <title>com.google.gson.stream.MalformedJsonException</title>
      <link>https://everydayidid.tistory.com/69</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #202124;&quot;&gt;Gson을 이용해서 HashMap&amp;lt;String, Object&amp;gt; 데이터를 Json형태로 바꾸려고 할 때 발생한 에러&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #202124;&quot;&gt;해당 에러는 문자열을 Json형태로 바꾸고자 할 때 해당 문자열에 공백이나 특수문자가 포함되어있을 경우 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1634475809863&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 해당 오류가 발생하는 구문
Gson gson = new Gson();
HashMap&amp;lt;String, Object&amp;gt; jsonObject = gson.fromJson(input.toString(), new TypeToken&amp;lt;HashMap&amp;lt;String, Object&amp;gt;&amp;gt;(){}.getType());&lt;/code&gt;&lt;/pre&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;b&gt;[해결방법]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열에 공백, 특수문자를 제거한다.&lt;/p&gt;
&lt;pre id=&quot;code_1634476056900&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public String replaceStr(String str) {
    // 데이터중 특수문자 및 공백으로 인해 com.google.gson.stream.MalformedJsonException 발생
    String tempStr = str.replace(&quot;㎖&quot;, &quot;ml&quot;);

    // 한글, 영어, 일부 특수문자를 제외한 문자 제거
    String match = &quot;[^\uAC00-\uD7A3xfe0-9a-zA-Z~!@#$%^&amp;amp;*()_+|&amp;lt;&amp;gt;?:{}]&quot;;
    tempStr = tempStr.replaceAll(match, &quot;&quot;);
    return tempStr;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Spring</category>
      <category>Exceiption</category>
      <category>gson</category>
      <category>Spring</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/69</guid>
      <comments>https://everydayidid.tistory.com/69#entry69comment</comments>
      <pubDate>Sun, 17 Oct 2021 22:09:13 +0900</pubDate>
    </item>
    <item>
      <title>[BAEKJOON] 2960번 : 에라토스테네스의 체</title>
      <link>https://everydayidid.tistory.com/67</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에라토스테네스의 체는 N보다 작거나 같은 모든 소수를 찾는 유명한 알고리즘이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 알고리즘은 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2부터 N까지 모든 정수를 적는다.&lt;/li&gt;
&lt;li&gt;아직 지우지 않은 수 중 가장 작은 수를 찾는다. 이것을 P라고 하고, 이 수는 소수이다.&lt;/li&gt;
&lt;li&gt;P를 지우고, 아직 지우지 않은 P의 배수를 크기 순서대로 지운다.&lt;/li&gt;
&lt;li&gt;아직 모든 수를 지우지 않았다면, 다시 2번 단계로 간다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N, K가 주어졌을 때, K번째 지우는 수를 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째 줄에 N과 K가 주어진다. (1 &amp;le; K &amp;lt; N, max(2, K)&amp;nbsp;&amp;lt; N &amp;le; 1000)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째 줄에 K번째 지워진 수를 출력한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10 7&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;힌트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2, 4, 6, 8, 10, 3, 9, 5, 7 순서대로 지워진다. 7번째 지워진 수는 9이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1594301151032&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;cstdio&amp;gt;

bool arr[1001] = {true, true, false, };

int isNum(int N, int K) {
    int num{2}, cnt{0}, result{0};
    for (int i = 1; cnt &amp;lt; K; i++) {

        if(num*i &amp;gt; N){
            for(int j = 2; j &amp;lt;= N; j++) {
                if(!arr[j]) {
                    num = j;
                    i = 1;
                    break;
                }
            }
        }
        if(!arr[num*i]) {
            cnt++;
            arr[num*i] = true;
            result = num*i;
        }
}
    return result;
}

int main() {
    int N, K;
    scanf(&quot;%d %d&quot;, &amp;amp;N, &amp;amp;K);
    std::cout &amp;lt;&amp;lt; isNum(N, K);
    return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>백준</category>
      <category>백준 2960번</category>
      <category>백준 에라토스테네스의 체</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/67</guid>
      <comments>https://everydayidid.tistory.com/67#entry67comment</comments>
      <pubDate>Thu, 9 Jul 2020 22:53:10 +0900</pubDate>
    </item>
    <item>
      <title>Exception Handling</title>
      <link>https://everydayidid.tistory.com/66</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;프로젝트 분석 중 예외처리 문구를 보고 알아보고싶어 한번 정리하게 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;예외처리 (Exception Handling)은 잘못된 데이터입력 / 연선 / 로직 수행 이나 하드웨어 혹은 네트워크의 오작동 등 여러 원인으로 인해 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;Java에서는 이러한 예외처리를 위한 클래스가 구현되어있다.&lt;/span&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1697&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDxgBx/btqDXuvsgfH/eBwGG6kEpnZ7aHf7r3tDq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDxgBx/btqDXuvsgfH/eBwGG6kEpnZ7aHf7r3tDq1/img.png&quot; data-alt=&quot;예외처리의 최상위 클래스인 Throwable&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDxgBx/btqDXuvsgfH/eBwGG6kEpnZ7aHf7r3tDq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDxgBx%2FbtqDXuvsgfH%2FeBwGG6kEpnZ7aHf7r3tDq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1697&quot; height=&quot;647&quot; data-origin-width=&quot;1697&quot; data-origin-height=&quot;647&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예외처리의 최상위 클래스인 Throwable&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;Throwable&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Throwable 클래스는 모든 예외 클래스들이 가지고 있는 공통된 메소드를 정의하고 있다.&lt;/span&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;689&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ykJTR/btqDYv1IDkZ/wRIDP6IAgmlT0SFJYwcJE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ykJTR/btqDYv1IDkZ/wRIDP6IAgmlT0SFJYwcJE0/img.png&quot; data-alt=&quot;Exception클래스의 하위 클래스들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ykJTR/btqDYv1IDkZ/wRIDP6IAgmlT0SFJYwcJE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FykJTR%2FbtqDYv1IDkZ%2FwRIDP6IAgmlT0SFJYwcJE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;625&quot; height=&quot;386&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;689&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Exception클래스의 하위 클래스들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Exception은 크게 두가지 종류로 나뉜다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Checked Exception&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;- 예외처리가 필수이며, 처리하지 않으면 컴파일이 안됨.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- JVM 외부와 통신(네트워크, 파일시스템 등)할 때 주로 쓴다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 위 목록 중 RuntimeException을 제외한 다른 Exception들이 이에 해당한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ex) IOException&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;Unchecked Exception&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;- 컴파일 때 체크되지 않고, 런타임에 발생하는 Exception을 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;ex) NullPointerException&lt;/span&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj4R1t/btqDXFQ1GYo/4o5OiXPeSJf4KfUu9GWyOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj4R1t/btqDXFQ1GYo/4o5OiXPeSJf4KfUu9GWyOK/img.png&quot; data-alt=&quot;Error 클래스의 하위 클래스들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj4R1t/btqDXFQ1GYo/4o5OiXPeSJf4KfUu9GWyOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj4R1t%2FbtqDXFQ1GYo%2F4o5OiXPeSJf4KfUu9GWyOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;604&quot; height=&quot;391&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Error 클래스의 하위 클래스들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;Error 는 애플리케이션이 동작하는 가상머신에 문제가 생겼을 때 발생하는 예외다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;애플리케이션을 구동시키기 위한 메모리가 부족한 경우가 이에 속한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;Reference : &lt;a style=&quot;color: #000000;&quot; href=&quot;https://sjh836.tistory.com/122&quot;&gt;https://sjh836.tistory.com/122&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1588766075029&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;예외처리 (throwable, exception, error, throws)&quot; data-og-description=&quot;참조문서 : https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html 1. 예외처리란? Exception Handling 이라고 하며, 잘못된 하나로 인해 전체 시스템이 무너지는 결과를 방지하기 위한 기술적인..&quot; data-og-host=&quot;sjh836.tistory.com&quot; data-og-source-url=&quot;https://sjh836.tistory.com/122&quot; data-og-url=&quot;https://sjh836.tistory.com/122&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uPrsF/hyFXoLPBr5/9eO3nabM9dhxktvlBMnu41/img.jpg?width=728&amp;amp;height=276&amp;amp;face=0_0_728_276,https://scrap.kakaocdn.net/dn/zwy9N/hyFVGN5wM5/CRn5GTQmRLKAnFdURp5IL0/img.jpg?width=728&amp;amp;height=276&amp;amp;face=0_0_728_276,https://scrap.kakaocdn.net/dn/7vyZ9/hyFXpxcnPS/YB54S262VWZ6E3kA9r0LEK/img.jpg?width=728&amp;amp;height=469&amp;amp;face=0_0_728_469&quot;&gt;&lt;a href=&quot;https://sjh836.tistory.com/122&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sjh836.tistory.com/122&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uPrsF/hyFXoLPBr5/9eO3nabM9dhxktvlBMnu41/img.jpg?width=728&amp;amp;height=276&amp;amp;face=0_0_728_276,https://scrap.kakaocdn.net/dn/zwy9N/hyFVGN5wM5/CRn5GTQmRLKAnFdURp5IL0/img.jpg?width=728&amp;amp;height=276&amp;amp;face=0_0_728_276,https://scrap.kakaocdn.net/dn/7vyZ9/hyFXpxcnPS/YB54S262VWZ6E3kA9r0LEK/img.jpg?width=728&amp;amp;height=469&amp;amp;face=0_0_728_469');&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;예외처리 (throwable, exception, error, throws)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;참조문서 : https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html 1. 예외처리란? Exception Handling 이라고 하며, 잘못된 하나로 인해 전체 시스템이 무너지는 결과를 방지하기 위한 기술적인..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sjh836.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://edu.goorm.io/learn/lecture/41/%EB%B0%94%EB%A1%9C%EC%8B%A4%EC%8A%B5-%EC%83%9D%ED%99%9C%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94-java/lesson/39411/%EC%98%88%EC%99%B8%EC%9D%98-%EC%84%A0%EC%A1%B0-throwable&quot;&gt;https://edu.goorm.io/learn/lecture/41/%EB%B0%94%EB%A1%9C%EC%8B%A4%EC%8A%B5-%EC%83%9D%ED%99%9C%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94-java/lesson/39411/%EC%98%88%EC%99%B8%EC%9D%98-%EC%84%A0%EC%A1%B0-throwable&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1588766083550&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;구름EDU - Be Really Excellent!&quot; data-og-description=&quot;구름EDU는 전국 대학, 기업 등에서 활용 중인 온라인 학습 및 교수 마켓플레이스입니다. 다양한 IT분야에 대해 배워 보세요. 여러분의 커리어 패스에 확실한 도움을 드립니다.&quot; data-og-host=&quot;edu.goorm.io&quot; data-og-source-url=&quot;https://edu.goorm.io/learn/lecture/41/%EB%B0%94%EB%A1%9C%EC%8B%A4%EC%8A%B5-%EC%83%9D%ED%99%9C%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94-java/lesson/39411/%EC%98%88%EC%99%B8%EC%9D%98-%EC%84%A0%EC%A1%B0-throwable&quot; data-og-url=&quot;https://edu.goorm.io&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/coSiCt/hyFXqJDXfK/y25NlWukAj9l5EykXaFDIk/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628&quot;&gt;&lt;a href=&quot;https://edu.goorm.io/learn/lecture/41/%EB%B0%94%EB%A1%9C%EC%8B%A4%EC%8A%B5-%EC%83%9D%ED%99%9C%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94-java/lesson/39411/%EC%98%88%EC%99%B8%EC%9D%98-%EC%84%A0%EC%A1%B0-throwable&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://edu.goorm.io/learn/lecture/41/%EB%B0%94%EB%A1%9C%EC%8B%A4%EC%8A%B5-%EC%83%9D%ED%99%9C%EC%BD%94%EB%94%A9-%EC%9E%90%EB%B0%94-java/lesson/39411/%EC%98%88%EC%99%B8%EC%9D%98-%EC%84%A0%EC%A1%B0-throwable&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/coSiCt/hyFXqJDXfK/y25NlWukAj9l5EykXaFDIk/img.png?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628');&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;구름EDU - Be Really Excellent!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;구름EDU는 전국 대학, 기업 등에서 활용 중인 온라인 학습 및 교수 마켓플레이스입니다. 다양한 IT분야에 대해 배워 보세요. 여러분의 커리어 패스에 확실한 도움을 드립니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;edu.goorm.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Language/Java</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/66</guid>
      <comments>https://everydayidid.tistory.com/66#entry66comment</comments>
      <pubDate>Wed, 6 May 2020 21:03:44 +0900</pubDate>
    </item>
    <item>
      <title>[Chatbot] 5. 카카오 오픈빌더로 배포</title>
      <link>https://everydayidid.tistory.com/65</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;카카오 오픈빌더를 통해 배포를 해보겠다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[시나리오 작성]&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시나리오에 대해 간단히 알아보면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drm6NZ/btqDceViCnr/aaNXVqI4nKKSBvtkfD47p1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drm6NZ/btqDceViCnr/aaNXVqI4nKKSBvtkfD47p1/img.png&quot; data-alt=&quot;시나리오 블록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drm6NZ/btqDceViCnr/aaNXVqI4nKKSBvtkfD47p1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdrm6NZ%2FbtqDceViCnr%2FaaNXVqI4nKKSBvtkfD47p1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;248&quot; height=&quot;234&quot; data-origin-width=&quot;506&quot; data-origin-height=&quot;478&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시나리오 블록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;웰컴&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; : 봇을 처음 실행할 때 사용자가 받게되는 응답을 설정하는 곳&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;폴백&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; : 사용자의 입력이 매칭되지 않을 때 사용자가 받을 응답을 설정하는 곳&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;탈출 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: 사용자가 되묻는 상황에서 빠져나가는 것을 설정하는 곳&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;으로 나뉘며 사용자가 블록을 만들 수도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시나리오는 다음과 같이 구성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;838&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cX9v31/btqDaUJW5oJ/EThQWy8xkN0IDyNJcdCTik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cX9v31/btqDaUJW5oJ/EThQWy8xkN0IDyNJcdCTik/img.png&quot; data-alt=&quot;Mealtime 시나리오 블록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cX9v31/btqDaUJW5oJ/EThQWy8xkN0IDyNJcdCTik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcX9v31%2FbtqDaUJW5oJ%2FEThQWy8xkN0IDyNJcdCTik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1256&quot; height=&quot;838&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;838&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Mealtime 시나리오 블록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우선 식단을 호출할 때 아침 / 점심 / 저녁을 구분하기 위한 엔티티를 만들었다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;b&gt;엔티티&lt;/b&gt;&lt;br /&gt;봇이 이해할 수 있는 용어를 체계적으로 정리한 데이터 사전&lt;/span&gt;&lt;br /&gt;&lt;span&gt;엔티티가 정의되어 있다면, 봇은 사용자 발화로부터 사용자의 의도에 맞는 동작 수행을 위한 주요 데이터를 추출할 수 있게 된다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HrWsl/btqDc4YVefP/Xy8YOi6453E9Vnv6dPuU5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HrWsl/btqDc4YVefP/Xy8YOi6453E9Vnv6dPuU5K/img.png&quot; data-alt=&quot;엔티티 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HrWsl/btqDc4YVefP/Xy8YOi6453E9Vnv6dPuU5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHrWsl%2FbtqDc4YVefP%2FXy8YOi6453E9Vnv6dPuU5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;216&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;576&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;엔티티 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이렇게 되면 [dinner / 저녁밥 / 디너 / 저녁] &amp;rarr; &amp;lsquo;저녁' 으로 인식되게 되며 나머지 점심, 아침도 마찬가지다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이후 파라미터를 생성했다.&lt;/span&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v8LlK/btqDbFsd4a8/4CoJxa2GUPxbiPN4C9QlOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v8LlK/btqDbFsd4a8/4CoJxa2GUPxbiPN4C9QlOk/img.png&quot; data-alt=&quot;파라미터 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v8LlK/btqDbFsd4a8/4CoJxa2GUPxbiPN4C9QlOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv8LlK%2FbtqDbFsd4a8%2F4CoJxa2GUPxbiPN4C9QlOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;285&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;758&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파라미터 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;파라미터 명 부분은 알아보기 쉬운 이름으로, 엔티티쪽은 적용시키고자 하는 엔티티를 설정해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(값 부분에는 엔티티값($) / 특정 값(#) / 고정된 값을 적용시킬 수 있는데 자세한건 &lt;/span&gt;&lt;a href=&quot;https://i.kakao.com/docs/key-concepts-parameters#%EA%B0%92&quot;&gt;&lt;span&gt;카카오 오픈빌더 도움말&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에서 확인)&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[스킬작성]&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 AWS인스턴스의 퍼블릭 DNS(IPv4)를 복사한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DWfIp/btqDcxNPa7L/2462Wg7tzT3513MDvPRXT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DWfIp/btqDcxNPa7L/2462Wg7tzT3513MDvPRXT1/img.png&quot; data-alt=&quot;인스턴스 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DWfIp/btqDcxNPa7L/2462Wg7tzT3513MDvPRXT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDWfIp%2FbtqDcxNPa7L%2F2462Wg7tzT3513MDvPRXT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1188&quot; height=&quot;694&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인스턴스 정보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 스킬URL에 넣어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 ${DNS}/projectname/mapping_url 형식처럼 실제 spring 프로젝트가 request를 받고 response를 리턴하는 경로로 작성해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴백블록과 임의로 생성한 Mealtime 블록과 연결한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;727&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baLMno/btqDdGXPncq/LIIk7iw3PPmNcoZkbic4x1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baLMno/btqDdGXPncq/LIIk7iw3PPmNcoZkbic4x1/img.png&quot; data-alt=&quot;스킬&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baLMno/btqDdGXPncq/LIIk7iw3PPmNcoZkbic4x1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaLMno%2FbtqDdGXPncq%2FLIIk7iw3PPmNcoZkbic4x1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1167&quot; height=&quot;727&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;727&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스킬&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK5zDy/btqDc4klQq8/USoQCh4sMARx5GgKm0DEgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK5zDy/btqDc4klQq8/USoQCh4sMARx5GgKm0DEgK/img.png&quot; data-alt=&quot;스킬 등록 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK5zDy/btqDc4klQq8/USoQCh4sMARx5GgKm0DEgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK5zDy%2FbtqDc4klQq8%2FUSoQCh4sMARx5GgKm0DEgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;823&quot; height=&quot;306&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스킬 등록 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼 스킬을 등록했다면 시나리오에 다시 가서 봇 응답을 스킬데이터로 설정해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YVY5p/btqDbEGF3Kr/ub2ibyKhUkAxRL2HK6Jdr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YVY5p/btqDbEGF3Kr/ub2ibyKhUkAxRL2HK6Jdr0/img.png&quot; data-alt=&quot;봇 응답&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YVY5p/btqDbEGF3Kr/ub2ibyKhUkAxRL2HK6Jdr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYVY5p%2FbtqDbEGF3Kr%2Fub2ibyKhUkAxRL2HK6Jdr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;515&quot; height=&quot;167&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;봇 응답&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 출력되는 모습을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;873&quot; data-origin-height=&quot;721&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDo0K3/btqDeUA5BxX/TwFrB4REdHxCK25AuIOAak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDo0K3/btqDeUA5BxX/TwFrB4REdHxCK25AuIOAak/img.png&quot; data-alt=&quot;봇 테스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDo0K3/btqDeUA5BxX/TwFrB4REdHxCK25AuIOAak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDo0K3%2FbtqDeUA5BxX%2FTwFrB4REdHxCK25AuIOAak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;873&quot; height=&quot;721&quot; data-origin-width=&quot;873&quot; data-origin-height=&quot;721&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;봇 테스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[배포]&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포 탭에서 배포를 완료했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;581&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DkBTX/btqDbkPeAmG/QEX59s6bUn39WT9eVpHxwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DkBTX/btqDbkPeAmG/QEX59s6bUn39WT9eVpHxwk/img.png&quot; data-alt=&quot;배포&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DkBTX/btqDbkPeAmG/QEX59s6bUn39WT9eVpHxwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDkBTX%2FbtqDbkPeAmG%2FQEX59s6bUn39WT9eVpHxwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1282&quot; height=&quot;581&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;581&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;배포&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5일간 약 40시간에 거쳐 식단기능을 완성했다&lt;/p&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 data-ke-size=&quot;size16&quot;&gt;다음은 버스 기능을 추가해보고자 한다.&lt;/p&gt;</description>
      <category>  Project/kakao chatbot</category>
      <category>챗봇</category>
      <category>카카오 i 오픈빌더</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/65</guid>
      <comments>https://everydayidid.tistory.com/65#entry65comment</comments>
      <pubDate>Sun, 5 Apr 2020 22:41:23 +0900</pubDate>
    </item>
    <item>
      <title>[Chatbot] 4. spring 프로젝트 서버로 올리기</title>
      <link>https://everydayidid.tistory.com/64</link>
      <description>&lt;p&gt;Spring MVC로 작성한 프로젝트를 서버에 올려보겠다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;우선 우분투(EC2)에 jdk와 tomcatdmf 설치한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[jdk 설치]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt; &lt;span&gt;sudo&lt;/span&gt;&amp;nbsp;apt&lt;span&gt;-&lt;/span&gt;get&amp;nbsp;&lt;span&gt;install&lt;/span&gt;&amp;nbsp;openjdk&lt;span&gt;-&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;jre&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;apt&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;get&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;install&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;openjdk&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;8&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;jdk&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;자바가 설치되었는지 확인한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;javac -version&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;java -version&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;환경 변수 설정을 위해 &lt;b&gt;sudo vi /etc/profile&lt;/b&gt;로&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span&gt;export&lt;/span&gt;&amp;nbsp;JAVA_HOME&lt;span&gt;=&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;lib&lt;span&gt;/&lt;/span&gt;jvm&lt;span&gt;/&lt;/span&gt;java&lt;span&gt;-&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;openjdk&lt;span&gt;-&lt;/span&gt;amd64&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt; &lt;span&gt;export&lt;/span&gt;&amp;nbsp;PATH&lt;span&gt;=&lt;/span&gt;$JAVA_HOME&lt;span&gt;/&lt;/span&gt;bin:$PATH&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;CLASS_PATH&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;$JAVA_HOME&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;lib:$CLASS_PATH&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;를 추가해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이후 &lt;b&gt;source /etc/profile&lt;/b&gt;로&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;자세한 내용은&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://all-record.tistory.com/181?category=733055&quot;&gt;https://all-record.tistory.com/181?category=733055&lt;/a&gt;를 참고&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[tomcat 설치]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;tomcat8을 설치한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;sudo apt-get install tomcat8&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;톰캣 설치 이후 방화벽에서 톰캣의 포트를 외부에서 접속할 수 있도록 변경해야한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;sudo ufw allow 8080/tcp&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그 후 톰캣을 실행해본다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;sudo service tomcat8 start&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;ip에 EC2 인스턴스의 퍼블릭도메인:8080을 적어서 저 화면이 나오면 성공이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;811&quot; height=&quot;303&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dktjEC/btqDbEs2MUS/lbkdarog2c52kp2JkGcNB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dktjEC/btqDbEs2MUS/lbkdarog2c52kp2JkGcNB0/img.png&quot; data-alt=&quot;tomcat works&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dktjEC/btqDbEs2MUS/lbkdarog2c52kp2JkGcNB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdktjEC%2FbtqDbEs2MUS%2Flbkdarog2c52kp2JkGcNB0%2Fimg.png&quot; width=&quot;811&quot; height=&quot;303&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;figcaption&gt;tomcat works&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;Spring 프로젝트가 tomcat에서 구동하기 위해서는 .war확장자 파일이 있으면 된다.&lt;/p&gt;
&lt;p&gt;intelliJ를 기준으로 &lt;b&gt;Project Structure -&amp;gt; Artifacts -&amp;gt; + -&amp;gt; Web Application Archive -&amp;gt; For 'projectname':war exploded&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAXab5/btqDeUgK6Is/gEBbiCG1E0gpjGlsyNCAkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAXab5/btqDeUgK6Is/gEBbiCG1E0gpjGlsyNCAkk/img.png&quot; data-alt=&quot;Project Structure&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAXab5/btqDeUgK6Is/gEBbiCG1E0gpjGlsyNCAkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAXab5%2FbtqDeUgK6Is%2FgEBbiCG1E0gpjGlsyNCAkk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;figcaption&gt;Project Structure&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Build Artifacts... 탭에 들어가서 projectname:war &amp;gt; Build를 누른다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzHVBo/btqDcyso3TC/KQAxIqXAnUkjyE801OWCbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzHVBo/btqDcyso3TC/KQAxIqXAnUkjyE801OWCbk/img.png&quot; data-alt=&quot;Build - Build Artifacts&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzHVBo/btqDcyso3TC/KQAxIqXAnUkjyE801OWCbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzHVBo%2FbtqDcyso3TC%2FKQAxIqXAnUkjyE801OWCbk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;figcaption&gt;Build - Build Artifacts&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/efRkwP/btqDcyTul0d/EyMJMZEKMg2E7FkkAR0HpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/efRkwP/btqDcyTul0d/EyMJMZEKMg2E7FkkAR0HpK/img.png&quot; data-alt=&quot;Build&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/efRkwP/btqDcyTul0d/EyMJMZEKMg2E7FkkAR0HpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FefRkwP%2FbtqDcyTul0d%2FEyMJMZEKMg2E7FkkAR0HpK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;figcaption&gt;Build&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;빌드가 완료되면 다음 경로에 존재하게 된다.&lt;/p&gt;
&lt;p&gt;${ProjectPath}/out/artifacts/daily_menu_war/.daily_menu_war.war&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;해당 파일을 Filezilla를 이용하여 local에서 server로 옮기도록 한다.&lt;/p&gt;
&lt;p&gt;옮기는 경로는 ubuntu의 /var/lib/tomcat8/webapps 경로 아래에 .war파일을 옮긴다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;790&quot; height=&quot;235&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EjeZD/btqDc36O5r6/HAP5Dd0m2EhSt0s5BgOmMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EjeZD/btqDc36O5r6/HAP5Dd0m2EhSt0s5BgOmMk/img.png&quot; data-alt=&quot;접근권한이 없을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EjeZD/btqDc36O5r6/HAP5Dd0m2EhSt0s5BgOmMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEjeZD%2FbtqDc36O5r6%2FHAP5Dd0m2EhSt0s5BgOmMk%2Fimg.png&quot; width=&quot;790&quot; height=&quot;235&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;figcaption&gt;접근권한이 없을 때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;만약 위처럼 파일전송에 실패할 경우 webapps폴더의 접근권한을 변경해줘야한다.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;기존에 /var/lib/tomcat8/webapps의 접근권한이 rwxrwxr-x로 되어있으므로 외부에서 쓰기권한이 없다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;b&gt;chmod /var/lib/tomcat8/webapps 777&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;로 변경해주고 복사할 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;tomcat을 재시작하고 확인하니 정상적으로 동작하는 것을 볼 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span&gt;sudo service tomcat8 restart&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;602&quot; height=&quot;196&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cT25FH/btqDeJmeKLj/bKtUV9SnuKh8i9ZE969Dc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cT25FH/btqDeJmeKLj/bKtUV9SnuKh8i9ZE969Dc0/img.png&quot; data-alt=&quot;@RequestMapping (value = &amp;amp;quot;getmenu&amp;amp;quot;)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cT25FH/btqDeJmeKLj/bKtUV9SnuKh8i9ZE969Dc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcT25FH%2FbtqDeJmeKLj%2FbKtUV9SnuKh8i9ZE969Dc0%2Fimg.png&quot; width=&quot;602&quot; height=&quot;196&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;figcaption&gt;@RequestMapping (value = &quot;getmenu&quot;)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Project/kakao chatbot</category>
      <category>AWS EC2</category>
      <category>FileZilla</category>
      <category>Spring MVC</category>
      <category>tomcat</category>
      <category>ubuntu</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/64</guid>
      <comments>https://everydayidid.tistory.com/64#entry64comment</comments>
      <pubDate>Sun, 5 Apr 2020 22:04:20 +0900</pubDate>
    </item>
    <item>
      <title>[Chatbot] 3. crontab으로 스케줄링하기</title>
      <link>https://everydayidid.tistory.com/63</link>
      <description>&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;cron은 UNIX 계열에서 사용되는 시간기반 Job 스케줄러다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;작업을 고정된 시간, 날짜, 간격에 주기적으로 실행할 수 있도록 스케줄링하기 위해 cron을 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;* : 모든 값을 의미한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt; ? : 특정한 값이 없음을 의미한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt; - : 범위를 표현한다. (월요일 ~ 수요일은 MON-WED로 표현)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, : 특별한 값일 때만 동작 (월,수,금은 MON,WED,FRI로 표현)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;/ : 시작시간 / 단위를 의미한다.&amp;nbsp; (0분부터 매 5분은 0/5로 표현)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;L : 일에서 사용하면 마지막 일, 요일에서는 마지막 요일(토요일)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;W : 가장 가까운 평일을 의미한다. (15W는 15일에서 가장 가까운 평일 (월 ~ 금)을 찾는다.)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;# : 몇째주의 무슨 요일을 표현한다. (예) 3#2 : 2번째주 수요일&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;crontab -e로 crontab 설정으로 들어간다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o91mO/btqDcdveoeA/XhQH2mMatEY1KgE5QWKTK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o91mO/btqDcdveoeA/XhQH2mMatEY1KgE5QWKTK1/img.png&quot; data-alt=&quot;crontab -e&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o91mO/btqDcdveoeA/XhQH2mMatEY1KgE5QWKTK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo91mO%2FbtqDcdveoeA%2FXhQH2mMatEY1KgE5QWKTK1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;figcaption&gt;crontab -e&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;0,1,2 0 * * * python3 /usr/local/bin/webcrawling.py를 통해&lt;/p&gt;
&lt;p&gt;매일 오전 0시 0,1,2분에 /usr/local/bin/webcrawling.py가 실행되도록 설정했다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;/home/log/crawling.log에 실행 로그가 남는다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;출처:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://zamezzz.tistory.com/197&quot;&gt;https://zamezzz.tistory.com/197&lt;/a&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[배워가는블로거]&lt;/span&gt;&lt;/p&gt;</description>
      <category>  Project/kakao chatbot</category>
      <category>cron</category>
      <category>crontab</category>
      <category>linux</category>
      <category>scheduling</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/63</guid>
      <comments>https://everydayidid.tistory.com/63#entry63comment</comments>
      <pubDate>Sun, 5 Apr 2020 21:06:13 +0900</pubDate>
    </item>
    <item>
      <title>[Chatbot] 2. AWS 시작하기</title>
      <link>https://everydayidid.tistory.com/62</link>
      <description>&lt;p&gt;막상 크롤링하는 코드는 짰지만&amp;nbsp;Python으로 로컬로 일일히 눌러주면서 설정할수는 없다.&lt;/p&gt;
&lt;p&gt;이런 부분은 서버에서 자동으로 처리해주면 좋을 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;AWS를 한번도 사용해보지 않았고, 맨땅에 헤딩해가면서 쓴 글이라서 정확하고 세부적인 정보는 모르지만&lt;/p&gt;
&lt;p&gt;일단 경험해본 것을 정리해두고자 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1. AWS 가입&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2. AWS 인스턴스 생성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3. AWS MySQL 생성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. AWS 가입&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우선 AWS에 가입을 해보고자 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;623&quot; height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5UGzu/btqC9yGbwJZ/rJzM2YSTKCsUJ8A1ty30C1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5UGzu/btqC9yGbwJZ/rJzM2YSTKCsUJ8A1ty30C1/img.png&quot; data-alt=&quot;https://aws.amazon.com/ko/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5UGzu/btqC9yGbwJZ/rJzM2YSTKCsUJ8A1ty30C1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5UGzu%2FbtqC9yGbwJZ%2FrJzM2YSTKCsUJ8A1ty30C1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;623&quot; height=&quot;349&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;figcaption&gt;https://aws.amazon.com/ko/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;오른쪽 위에 있는 계정 생성을 누르면 아래와 같이 정보를 입력하는 란이 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;398&quot; height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YQcBJ/btqC9N32DrX/3cekBkGEplQRDZv190FX3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YQcBJ/btqC9N32DrX/3cekBkGEplQRDZv190FX3K/img.png&quot; data-alt=&quot;계정생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YQcBJ/btqC9N32DrX/3cekBkGEplQRDZv190FX3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYQcBJ%2FbtqC9N32DrX%2F3cekBkGEplQRDZv190FX3K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;398&quot; height=&quot;297&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;figcaption&gt;계정생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;389&quot; height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsyNVL/btqC8IWHXhT/ADoQXwhT0aZrjB5kbekt41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsyNVL/btqC8IWHXhT/ADoQXwhT0aZrjB5kbekt41/img.png&quot; data-alt=&quot;연락처 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsyNVL/btqC8IWHXhT/ADoQXwhT0aZrjB5kbekt41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsyNVL%2FbtqC8IWHXhT%2FADoQXwhT0aZrjB5kbekt41%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;389&quot; height=&quot;457&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;figcaption&gt;연락처 정보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;연락처 정보까지 다 적으면 카드를 등록하게 된다.&lt;/p&gt;
&lt;p&gt;프리티어 한도를 초과하게 되면 추가결제가 되는 형식이라고 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;329&quot; height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SvSGd/btqC78nPLtT/2BDBrJYu4g7U0E7hGKn2oK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SvSGd/btqC78nPLtT/2BDBrJYu4g7U0E7hGKn2oK/img.png&quot; data-alt=&quot;결제정보 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SvSGd/btqC78nPLtT/2BDBrJYu4g7U0E7hGKn2oK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSvSGd%2FbtqC78nPLtT%2F2BDBrJYu4g7U0E7hGKn2oK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;329&quot; height=&quot;379&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;figcaption&gt;결제정보 입력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이것까지 적으면 지원플랜을 선택하게 되고 &lt;span style=&quot;color: #333333;&quot;&gt;기본플랜으로 등록했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;634&quot; data-filename=&quot;blob&quot; width=&quot;466&quot; height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tukaF/btqDblMzV7u/V2kK2NEW5kv6koeidhnROK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tukaF/btqDblMzV7u/V2kK2NEW5kv6koeidhnROK/img.png&quot; data-alt=&quot;지원 플랜&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tukaF/btqDblMzV7u/V2kK2NEW5kv6koeidhnROK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtukaF%2FbtqDblMzV7u%2FV2kK2NEW5kv6koeidhnROK%2Fimg.png&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;634&quot; data-filename=&quot;blob&quot; width=&quot;466&quot; height=&quot;442&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;figcaption&gt;지원 플랜&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;하지만 결제정보를 등록해놨기에 잘못하면 소중한 내 돈이 순식간에 날아갈 수 있다...!&lt;/p&gt;
&lt;p&gt;그래서 아래 블로그를 참고하여 2차 비밀번호(OTP 설정)를 설정했다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://goddaehee.tistory.com/175&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://goddaehee.tistory.com/175&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. AWS EC2 인스턴스 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;가상 컴퓨터를 임대 받아 그 위에 자신만의 컴퓨터 애플리케이션들을 실행할 수 있게 해주는 &lt;span style=&quot;color: #333333;&quot;&gt;EC2를 사용해보고자 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;아래 서비스 탭에서 EC2를 눌러서 들어간다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;342&quot; height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pjQSG/btqDbESEq3g/B1EZQD2PiNRFDifTFGmkyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pjQSG/btqDbESEq3g/B1EZQD2PiNRFDifTFGmkyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pjQSG/btqDbESEq3g/B1EZQD2PiNRFDifTFGmkyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpjQSG%2FbtqDbESEq3g%2FB1EZQD2PiNRFDifTFGmkyK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;342&quot; height=&quot;233&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;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;인스턴스 시작 버튼을 누른다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;602&quot; height=&quot;312&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZRgCE/btqC9MKTvNt/W5FUIEnkb7eHzDkEFYa55K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZRgCE/btqC9MKTvNt/W5FUIEnkb7eHzDkEFYa55K/img.png&quot; data-alt=&quot;인스턴스 시작&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZRgCE/btqC9MKTvNt/W5FUIEnkb7eHzDkEFYa55K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZRgCE%2FbtqC9MKTvNt%2FW5FUIEnkb7eHzDkEFYa55K%2Fimg.png&quot; width=&quot;602&quot; height=&quot;312&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;figcaption&gt;인스턴스 시작&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;AMI를 선택하는 창이 나오는데 Ubuntu Server 16.04버전을 사용하기로 했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;602&quot; height=&quot;321&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7E1x9/btqC9OhEkyZ/EDWv9ZDkiycUYWByK06uJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7E1x9/btqC9OhEkyZ/EDWv9ZDkiycUYWByK06uJk/img.png&quot; data-alt=&quot;AMI 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7E1x9/btqC9OhEkyZ/EDWv9ZDkiycUYWByK06uJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7E1x9%2FbtqC9OhEkyZ%2FEDWv9ZDkiycUYWByK06uJk%2Fimg.png&quot; width=&quot;602&quot; height=&quot;321&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;figcaption&gt;AMI 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;중간에 캡쳐하는걸 까먹어서.. 바로 결과화면이다.&lt;/p&gt;
&lt;p&gt;아래와 같이 인스턴스가 생성된 모습을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;813&quot; height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diaXus/btqC8G5C1Yg/IKAJ3HQGJrMY0kmfpwGF2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diaXus/btqC8G5C1Yg/IKAJ3HQGJrMY0kmfpwGF2K/img.png&quot; data-alt=&quot;인스턴스 생성 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diaXus/btqC8G5C1Yg/IKAJ3HQGJrMY0kmfpwGF2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiaXus%2FbtqC8G5C1Yg%2FIKAJ3HQGJrMY0kmfpwGF2K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;813&quot; height=&quot;243&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;figcaption&gt;인스턴스 생성 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;아래를 보면 다음과 같이 IPv4 퍼블릭 IP를 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;622&quot; height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v3hp4/btqDaWfeYUI/1rcxUcpqXe0PbUDtKAnfzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v3hp4/btqDaWfeYUI/1rcxUcpqXe0PbUDtKAnfzK/img.png&quot; data-alt=&quot;IPv4 Public IP&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v3hp4/btqDaWfeYUI/1rcxUcpqXe0PbUDtKAnfzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv3hp4%2FbtqDaWfeYUI%2F1rcxUcpqXe0PbUDtKAnfzK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;622&quot; height=&quot;162&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;figcaption&gt;IPv4 Public IP&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;terminal에 다음과 같이 입력하여 ssh로 접근할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;ssh -i [Key pair filename] ubuntu@[Public DNS]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;517&quot; height=&quot;323&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciivFq/btqDaiQgj34/IfPRZrDkLmCvbaSPDYyUN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciivFq/btqDaiQgj34/IfPRZrDkLmCvbaSPDYyUN1/img.png&quot; data-alt=&quot;ssh로 접속한 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciivFq/btqDaiQgj34/IfPRZrDkLmCvbaSPDYyUN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciivFq%2FbtqDaiQgj34%2FIfPRZrDkLmCvbaSPDYyUN1%2Fimg.png&quot; width=&quot;517&quot; height=&quot;323&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;figcaption&gt;ssh로 접속한 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;자세한 내용은 아래 블로그를 참고했다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://steemit.com/kr/@sifnax/python-6-aws&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://steemit.com/kr/@sifnax/python-6-aws&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;* 추가로 인스턴스를 만들면서 생긴 키 페어 파일(.pem파일)은 Mac을 기준으로 ~/.ssh 경로에 두는것으로 권장하고 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. AWS MySQL 사용하기&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;AWS에서 DB를 관리한다면 내 컴퓨터가 꺼져있어도 동작할 것이다.&lt;/p&gt;
&lt;p&gt;이를 위해 AWS에 있는 MySQL을 만들었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;711&quot; height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yLUwH/btqDbk1cRiE/G9B8WRzBbhnRPJ0sebfKZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yLUwH/btqDbk1cRiE/G9B8WRzBbhnRPJ0sebfKZ1/img.png&quot; data-alt=&quot;Amazon RDS 관리 탭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yLUwH/btqDbk1cRiE/G9B8WRzBbhnRPJ0sebfKZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyLUwH%2FbtqDbk1cRiE%2FG9B8WRzBbhnRPJ0sebfKZ1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;711&quot; height=&quot;334&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;figcaption&gt;Amazon RDS 관리 탭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;테이블 구조는 다음과 같이 만들었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;495&quot; height=&quot;203&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEtqOC/btqDbEkPEOW/fqk65l2dLbV4NQNBBTMEk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEtqOC/btqDbEkPEOW/fqk65l2dLbV4NQNBBTMEk1/img.png&quot; data-alt=&quot;breakfast, lunch. dinner table 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEtqOC/btqDbEkPEOW/fqk65l2dLbV4NQNBBTMEk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEtqOC%2FbtqDbEkPEOW%2Ffqk65l2dLbV4NQNBBTMEk1%2Fimg.png&quot; width=&quot;495&quot; height=&quot;203&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;figcaption&gt;breakfast, lunch. dinner table 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;AWS MySQL DB를 생성하는 자세한 과정은 아래 블로그를 참고했다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ndb796.tistory.com/226&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ndb796.tistory.com/226&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[기타]&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;- ssh로 연결하고 mysql설치 후 기존에 작성해두었던 python 코드를 붙여넣고 동작시켰더니 정상적으로 동작하는 모습을 볼 수 있었다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;765&quot; height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAGn1C/btqDbmkqvkV/QUKyXCwZ6Bf0math6U62xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAGn1C/btqDbmkqvkV/QUKyXCwZ6Bf0math6U62xk/img.png&quot; data-alt=&quot;webcrawling.py&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAGn1C/btqDbmkqvkV/QUKyXCwZ6Bf0math6U62xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAGn1C%2FbtqDbmkqvkV%2FQUKyXCwZ6Bf0math6U62xk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;765&quot; height=&quot;97&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;figcaption&gt;webcrawling.py&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;- 중간에 한글이 깨져서 저장됐었는데 &lt;span style=&quot;color: #333333;&quot;&gt;MySQL&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;은&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;기본으로&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;서버&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt; character set이&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;latin1&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;으로&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;설정&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;되어&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;있어서 발생한 문제였다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;602&quot; height=&quot;113&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcncib/btqDaipgdcx/jDcxk1m8eujepmqdDAVfJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcncib/btqDaipgdcx/jDcxk1m8eujepmqdDAVfJK/img.png&quot; data-alt=&quot;DB&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcncib/btqDaipgdcx/jDcxk1m8eujepmqdDAVfJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcncib%2FbtqDaipgdcx%2FjDcxk1m8eujepmqdDAVfJK%2Fimg.png&quot; width=&quot;602&quot; height=&quot;113&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;figcaption&gt;DB&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;304&quot; height=&quot;324&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7AGSm/btqDbEZqjDt/sLt6LaDC4PznTZKUDSm0K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7AGSm/btqDbEZqjDt/sLt6LaDC4PznTZKUDSm0K1/img.png&quot; data-alt=&quot;table&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7AGSm/btqDbEZqjDt/sLt6LaDC4PznTZKUDSm0K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7AGSm%2FbtqDbEZqjDt%2FsLt6LaDC4PznTZKUDSm0K1%2Fimg.png&quot; width=&quot;304&quot; height=&quot;324&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;figcaption&gt;table&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;367&quot; height=&quot;175&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WNDLB/btqC9yeZ4NX/913VBv21HpEQ0gonMGJRA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WNDLB/btqC9yeZ4NX/913VBv21HpEQ0gonMGJRA1/img.png&quot; data-alt=&quot;columns&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WNDLB/btqC9yeZ4NX/913VBv21HpEQ0gonMGJRA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWNDLB%2FbtqC9yeZ4NX%2F913VBv21HpEQ0gonMGJRA1%2Fimg.png&quot; width=&quot;367&quot; height=&quot;175&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;figcaption&gt;columns&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;DB를 생성하기 전 에서 설명했던 파라미터를 편집하지 않아서 전부 latin1로 적용되었다.&lt;/p&gt;
&lt;p&gt;이 부분은 파라미터를 재설정하고 DB를 다시 만들면 되지만 다시 만들기가 싫어서 &lt;a href=&quot;https://velog.io/@pizzu/Mysql-db-character-set-%ED%99%95%EC%9D%B8-%EB%B0%8F-%EC%88%98%EC%A0%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;해당 블로그&lt;/a&gt;를 참고하여 수정하였다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;324&quot; height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brvXwW/btqC9NXhoLg/dKoezRm4TRkap3bli9Dkjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brvXwW/btqC9NXhoLg/dKoezRm4TRkap3bli9Dkjk/img.png&quot; data-alt=&quot;webcrawling.py 실행 후 DB 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brvXwW/btqC9NXhoLg/dKoezRm4TRkap3bli9Dkjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrvXwW%2FbtqC9NXhoLg%2FdKoezRm4TRkap3bli9Dkjk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;324&quot; height=&quot;300&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;figcaption&gt;webcrawling.py 실행 후 DB 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;DB에 저장되는 것 까지 잘 수행되는 것을 확인했다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;정말 아무것도 모르는 상태로 시작하려니 시작점을 잡는데 많은 어려움이 있었다.&lt;/p&gt;
&lt;p&gt;AWS의 종류도 상당히 많고, AWS 람다는 또 뭔지.. AWS에 대한 방향을 잡는데만 거의 모든 시간을 부었지만 그럼에도 AWS를 이해하지 못한것 같다. 그래도 평소에는 이름만 들어봤던 AWS랑 조금은 친해질 수 있었던 것 같다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음은 Crontab을 이용하여 스케줄링하는 것을 해봐야겠다.&lt;/p&gt;</description>
      <category>  Project/kakao chatbot</category>
      <category>AWS</category>
      <category>EC2</category>
      <category>MYSQL</category>
      <category>python</category>
      <category>ubuntu</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/62</guid>
      <comments>https://everydayidid.tistory.com/62#entry62comment</comments>
      <pubDate>Fri, 3 Apr 2020 05:54:28 +0900</pubDate>
    </item>
    <item>
      <title>[Chatbot] 1. Python으로 식단 정보 크롤링하기</title>
      <link>https://everydayidid.tistory.com/61</link>
      <description>&lt;p&gt;&lt;span&gt;아래 링크는 우리학교에서 식단 정보를 알려주는 사이트다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://coop.koreatech.ac.kr/dining/menu.php&quot;&gt;https://coop.koreatech.ac.kr/dining/menu.php&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;해당 사이트에서 정보를 읽어와서 DB에 저장해볼 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[사용 도구]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;언어 : Python 3.8.2&lt;/p&gt;
&lt;p&gt;IDE : Pycharm&lt;/p&gt;
&lt;p&gt;DB : MySQL 5.7&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[코드]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1585593144020&quot; class=&quot;python&quot; style=&quot;display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from urllib.request import urlopen
from bs4 import BeautifulSoup
import ssl
import re
import pymysql

context = ssl._create_unverified_context()
URL = urlopen(&quot;https://coop.koreatech.ac.kr/dining/menu.php&quot;, context=context)
bs = BeautifulSoup(URL, 'html.parser')

name = re.compile('menu-list?.')
menuList = []

for menulist in bs.find_all(&quot;td&quot;, {&quot;class&quot;:name}):
    before = menulist.text
    after = re.sub('\t', '', before)
    if(after==&quot;\r\n\xa0\r\n&quot;):
         menuList.append('-')
    else:
         menuList.append(after)

breakfast = []
lunch = []
dinner = []

for a in range(3):
    for b in range(8):
         if(a == 0):
              breakfast.append(menuList[a*8 + b])
         elif(a==1):
              lunch.append(menuList[a*8 + b])
         elif(a==2):
              dinner.append(menuList[a*8 + b])

conn = pymysql.connect(host='localhost', user='root', password='12345', db='daily_menu', charset='utf8')
try:
   with conn.cursor() as curs:
       curs.execute('TRUNCATE TABLE breakfast;')
       curs.execute('TRUNCATE TABLE lunch;')
       curs.execute('TRUNCATE TABLE dinner;')

       sql_b = 'INSERT INTO breakfast(korean, special, onedish, western ,faculty ,subak ,cam2_1 ,cam2_2) VALUES(%s, %s, %s, %s, %s, %s, %s, %s)'
       sql_l = 'INSERT INTO lunch(korean, special, onedish, western ,faculty ,subak ,cam2_1 ,cam2_2) VALUES(%s, %s, %s, %s, %s, %s, %s, %s)'
       sql_d = 'INSERT INTO dinner(korean, special, onedish, western ,faculty ,subak ,cam2_1 ,cam2_2) VALUES(%s, %s, %s, %s, %s, %s, %s, %s)'
       for flag in range(3):
            if(flag == 0):
                 var = tuple(breakfast)
                 curs.execute(sql_b, var)
            elif(flag == 1):
                 var = tuple(lunch)
                 curs.execute(sql_l, var)
            elif(flag == 2):
                 var = tuple(dinner)
                 curs.execute(sql_d, var)

       conn.commit()

       rs = curs.fetchall()
       for row in rs:
           print(rs[row])

finally:
       conn.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[설명]&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;breakfast, lunch, dinner 세 테이블의 구조는 아래와 동일하다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;394&quot; height=&quot;202&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7DWGo/btqC6mye74Y/IAFVdaImlC5CNEKAjXYf41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7DWGo/btqC6mye74Y/IAFVdaImlC5CNEKAjXYf41/img.png&quot; data-alt=&quot;breakfast table 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7DWGo/btqC6mye74Y/IAFVdaImlC5CNEKAjXYf41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7DWGo%2FbtqC6mye74Y%2FIAFVdaImlC5CNEKAjXYf41%2Fimg.png&quot; width=&quot;394&quot; height=&quot;202&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;figcaption&gt;breakfast table 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;코드는 다음과 같은 흐름으로 진행된다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;사이트에서 식단의 정보를 가져온다. -&amp;gt; 가져온 식단 정보를 8개씩 나누어 아침, 점심, 저녁 리스트에 각각 넣는다 (&lt;span style=&quot;color: #333333;&quot;&gt;식단의 내용은 8개의 주제로 나뉘어져 있다 {한식, 특식.. 등등}) -&amp;gt; 가져온 내용을 아침, 점심, 저녁 Table에 각각 저장한다.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- SSL&lt;span style=&quot;color: #000000;&quot;&gt;인증을 거쳐갈 임시의 context를 생성하기위해 &lt;span style=&quot;color: #000000;&quot;&gt;_create_unverified_context()함수를 사용했다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- execute() 메서드는 하나의 Row (하나의 Tuple 데이타)를 치환하여 실행하기 때문에 breakfast를 Tuple로 변환해주었다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;-&amp;nbsp; 당일날에 해당하는 데이터만을 필요로 하기 때문에 데이터를 갱신할 때 마다 테이블을 초기화 시키기 위해 SQL문에서 TRUNCATE를 사용했다.&lt;/span&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- td태그의 class값에 대해 크롤링해오는데 해당 시간대에 따라서 td태그의 클래스값 뒤에 'o'가 붙어서 정규표현식을 이용해 뒤에 한글자를 필터링했다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;'menu-time?.'&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;208&quot; height=&quot;110&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nihro/btqC6PUu0eO/LQsnCI4blqNCXmqTORGkC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nihro/btqC6PUu0eO/LQsnCI4blqNCXmqTORGkC0/img.png&quot; data-alt=&quot;해당 시간대의 td태그의 클래스값&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nihro/btqC6PUu0eO/LQsnCI4blqNCXmqTORGkC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnihro%2FbtqC6PUu0eO%2FLQsnCI4blqNCXmqTORGkC0%2Fimg.png&quot; width=&quot;208&quot; height=&quot;110&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;figcaption&gt;해당 시간대의 td태그의 클래스값&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Project/kakao chatbot</category>
      <category>Chatbot</category>
      <category>python</category>
      <category>webcrwaling</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/61</guid>
      <comments>https://everydayidid.tistory.com/61#entry61comment</comments>
      <pubDate>Tue, 31 Mar 2020 03:46:00 +0900</pubDate>
    </item>
    <item>
      <title>[Chatbot] 0. 프로젝트를 시작하며..</title>
      <link>https://everydayidid.tistory.com/60</link>
      <description>&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1달이라는 기간동안 카카오 챗봇을 이용한 서비스를 구현해보고자 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;작은 한챕터가 마무리 될 때마다 블로깅할 예정이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[주제와 기능 설정]&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;학교에 관련하여 여러 정보들을 알려줄 수 있는 봇이면 좋겠다는 생각에 이런 저런 기능을 생각해보았다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;식단&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;버스&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;각종 공지사항의 실시간 업데이트 여부 (업데이트 시 카톡 알림)&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시간표 등록 및 수업알림 (부가사항)&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[검토]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;선배님께 기능별 우선순위를 두고 하나씩 구현해보는것을 목표로 하는것이 좋겠다는 피드백을 받았다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우선 생각해둔 기능 3가지 &lt;span style=&quot;color: #000000;&quot;&gt;{ 식단, 버스, 공지사항 안내 }가 있는데&lt;/span&gt; (시간표를 제외하고)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;식단 &amp;rarr; 버스 &amp;rarr; 공지사항 안내 순서로 우선순위를 두기로 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공지사항이 올라왔을 경우 사용자에게 선톡을 보내고싶었는데&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사용자의 request 방식이 아닌 챗봇의 response 방식으로 사용자에게 선톡을 보내는것은 유료라고한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;때문에 해당 기능은 약간의 수정이 들어가야했다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한 공지사항 실시간 알림이라는 부분은 &quot;학교 서버를 실시간으로 지켜보면서 체크한다.&quot;라는 부분도 서버에 부하를 줄 수 있기 때문에 수정이 필요했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr; 서버에 부하가 가서 어렵다..;; &amp;rarr; 주기적으로 체크하는게 어떨까? &amp;rarr; 하루 4번 체크 후 새로운 공지가 생겼을 때 알림&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr; 선톡은 유료다.. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr; 사용자가 request를 보낼 때 마다 갱신 날짜와 함께 새로운 공지가 올라와있는지 알려준다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;프로젝트를 진행하면서 세부적인 내용은 조금씩 바뀔 수도 있을 것 같다.&lt;/p&gt;
&lt;p&gt;그래도 우선순위에 있어서는 식단이 우선이므로 식단에 집중해서 프로젝트를 진행해보자 &lt;s&gt;(어쩌면 이것만으로도 한달 걸릴지도)&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;제대로된 프로젝트는 이번이 처음이라 어디까지 구현할 수 있을지 잘 모르기 때문에 우선순위를 하나씩 해결해나가는 방향으로 진행해보기로 결정했다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[github 주소]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Choi-JJunho/chatbot&quot;&gt;https://github.com/Choi-JJunho/chatbot&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1585592433713&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Choi-JJunho/chatbot&quot; data-og-description=&quot;Contribute to Choi-JJunho/chatbot development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Choi-JJunho/chatbot&quot; data-og-url=&quot;https://github.com/Choi-JJunho/chatbot&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dv3daD/hyFu9BuGRv/Gd5YkpiDiJpTpT0wL0roxk/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://github.com/Choi-JJunho/chatbot&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Choi-JJunho/chatbot&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dv3daD/hyFu9BuGRv/Gd5YkpiDiJpTpT0wL0roxk/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Choi-JJunho/chatbot&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;Contribute to Choi-JJunho/chatbot development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Project/kakao chatbot</category>
      <category>시작</category>
      <category>프로젝트</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/60</guid>
      <comments>https://everydayidid.tistory.com/60#entry60comment</comments>
      <pubDate>Tue, 31 Mar 2020 03:23:12 +0900</pubDate>
    </item>
    <item>
      <title>org.apache.el.parser.ParseException</title>
      <link>https://everydayidid.tistory.com/59</link>
      <description>&lt;p&gt;&lt;b&gt;다음과 같은 에러가 발생했다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;org.apache.el.parser.ParseException: Encountered &quot; &quot;}&quot; &quot;} &quot;&quot; at line 1, column 3. Was expecting one of: &amp;lt;INTEGER_LITERAL&amp;gt; ...&lt;/p&gt;
&lt;p&gt;&amp;lt;FLOATING_POINT_LITERAL&amp;gt; ...&lt;/p&gt;
&lt;p&gt;&amp;lt;STRING_LITERAL&amp;gt; ...&lt;/p&gt;
&lt;p&gt;&quot;true&quot; ...&lt;/p&gt;
&lt;p&gt;&quot;false&quot; ...&lt;/p&gt;
&lt;p&gt;&quot;null&quot; ...&lt;/p&gt;
&lt;p&gt;&quot;(&quot; ...&lt;/p&gt;
&lt;p&gt;&quot;!&quot; ...&lt;/p&gt;
&lt;p&gt;&quot;not&quot; ...&lt;/p&gt;
&lt;p&gt;&quot;empty&quot; ...&lt;/p&gt;
&lt;p&gt;&quot;-&quot; ...&lt;/p&gt;
&lt;p&gt;&amp;lt;IDENTIFIER&amp;gt; ...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;518&quot; height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7g1oq/btqC0KT8Wqq/SMf23fQj7YwQDynz7gmF70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7g1oq/btqC0KT8Wqq/SMf23fQj7YwQDynz7gmF70/img.png&quot; data-alt=&quot;error 원인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7g1oq/btqC0KT8Wqq/SMf23fQj7YwQDynz7gmF70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7g1oq%2FbtqC0KT8Wqq%2FSMf23fQj7YwQDynz7gmF70%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;518&quot; height=&quot;250&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;figcaption&gt;error 원인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Expression Language를 잘못 사용했을 때 발생하는 에러였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Spring</category>
      <category>error</category>
      <category>Expression Language</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/59</guid>
      <comments>https://everydayidid.tistory.com/59#entry59comment</comments>
      <pubDate>Sat, 28 Mar 2020 01:33:29 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 389. Find the Difference</title>
      <link>https://everydayidid.tistory.com/58</link>
      <description>&lt;p&gt;Given two strings&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;i&gt;s&lt;/i&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;i&gt;t&lt;/i&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;which consist of only lowercase letters.&lt;/p&gt;
&lt;p&gt;String&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;i&gt;t&lt;/i&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is generated by random shuffling string&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;i&gt;s&lt;/i&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and then add one more letter at a random position.&lt;/p&gt;
&lt;p&gt;Find the letter that was added in&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;i&gt;t&lt;/i&gt;&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Example:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Input:&lt;/p&gt;
&lt;p&gt;s = &quot;abcd&quot;&lt;/p&gt;
&lt;p&gt;t = &quot;abcde&quot;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;p&gt;e Explanation: 'e' is the letter that was added.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1585068483263&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
public:
    char findTheDifference(string s, string t) {
        long int arr1[27] = {0,};
        long int arr2[27] = {0,};
        for(int i = 0; i &amp;lt; s.length(); i++){
            arr1[s[i]-'a']++;
        }
        
        for(int i = 0; i &amp;lt; t.length(); i++){
            arr2[t[i]-'a']++;
        }
        
        for(int i = 0; i &amp;lt; 26; i++) {
            if(arr1[i] &amp;lt; arr2[i])
                return (char)(i+'a');
        }
        return -1;
    }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이건 쫌;; 생각하기싫어서 대충짰더니 완전 별로인코드가 짜잔!&lt;/p&gt;
&lt;p&gt;나중에 다시짜봐야겠네&lt;/p&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>leetcode</category>
      <category>LeetCode 389</category>
      <category>LeetCode Find the Difference</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/58</guid>
      <comments>https://everydayidid.tistory.com/58#entry58comment</comments>
      <pubDate>Wed, 25 Mar 2020 01:49:49 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 397. Integer Replacement</title>
      <link>https://everydayidid.tistory.com/57</link>
      <description>&lt;p&gt;Given a positive integer&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;n&lt;/i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and you can do operations as follow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;n&lt;/i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is even, replace&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;n&lt;/i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;with&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;n&lt;/i&gt;/2.&lt;/li&gt;
&lt;li&gt;If&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;n&lt;/i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is odd, you can replace&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;n&lt;/i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;with either&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;n&lt;/i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;+ 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;or&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;n&lt;/i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- 1.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What is the minimum number of replacements needed for&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;n&lt;/i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;to become 1?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Input:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Output:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Explanation:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;8 -&amp;gt; 4 -&amp;gt; 2 -&amp;gt; 1&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Input:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Output:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Explanation:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;7 -&amp;gt; 8 -&amp;gt; 4 -&amp;gt; 2 -&amp;gt; 1&lt;/p&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;p&gt;7 -&amp;gt; 6 -&amp;gt; 3 -&amp;gt; 2 -&amp;gt; 1&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1584993549880&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
public:
    int integerReplacement(int n) {
        long int k{n};
        int cnt{0};
        while(k!=1){
            if(k == 3)
                return cnt + 2;
            if(k%2 == 1){
                if((k-1)/2 % 2 == 1)
                    k+=1;
                else
                    k-=1;
            }
            else
                k/=2;
            cnt++;
        }
        return cnt;
    }
};&lt;/code&gt;&lt;/pre&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>leetcode</category>
      <category>LeetCode 397</category>
      <category>LeetCode Integer Replacement</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/57</guid>
      <comments>https://everydayidid.tistory.com/57#entry57comment</comments>
      <pubDate>Tue, 24 Mar 2020 04:59:56 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 278. First Bad Version</title>
      <link>https://everydayidid.tistory.com/56</link>
      <description>&lt;p&gt;You are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the quality check. Since each version is developed based on the previous version, all the versions after a bad version are also bad.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Suppose you have&lt;span&gt;&amp;nbsp;&lt;/span&gt;n&lt;span&gt;&amp;nbsp;&lt;/span&gt;versions&lt;span&gt;&amp;nbsp;&lt;/span&gt;[1, 2, ..., n]&lt;span&gt;&amp;nbsp;&lt;/span&gt;and you want to find out the first bad one, which causes all the following ones to be bad.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;You are given an API&lt;span&gt;&amp;nbsp;&lt;/span&gt;bool isBadVersion(version)&lt;span&gt;&amp;nbsp;&lt;/span&gt;which will return whether&lt;span&gt;&amp;nbsp;&lt;/span&gt;version&lt;span&gt;&amp;nbsp;&lt;/span&gt;is bad. Implement a function to find the first bad version. You should minimize the number of calls to the API.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Example:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Given n = 5, and version = 4 is the first bad version.&lt;/p&gt;
&lt;p&gt;call isBadVersion(3) -&amp;gt; false&lt;/p&gt;
&lt;p&gt;call isBadVersion(5)&amp;nbsp;-&amp;gt; true&lt;/p&gt;
&lt;p&gt;call isBadVersion(4)&amp;nbsp;-&amp;gt; true&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Then 4 is the first bad version.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1584993223890&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Forward declaration of isBadVersion API.
bool isBadVersion(int version);

class Solution {
public:
    int firstBadVersion(int n) {
        long long low{0};
        long long high{n};
        int mid;
        while(1) {
            mid = (low + high)/2;
            if(!isBadVersion(mid) &amp;amp;&amp;amp; isBadVersion(mid+1))
                return mid+1;
            
            if(!isBadVersion(mid) &amp;amp;&amp;amp; !isBadVersion(mid+1))
                low = mid;
            
            else if(isBadVersion(mid) &amp;amp;&amp;amp; isBadVersion(mid+1)) 
                high = mid;
          
        }
    }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>leetcode</category>
      <category>LeetCode 278</category>
      <category>LeetCode First Bad Version</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/56</guid>
      <comments>https://everydayidid.tistory.com/56#entry56comment</comments>
      <pubDate>Tue, 24 Mar 2020 04:57:34 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 7. Reverse Integer</title>
      <link>https://everydayidid.tistory.com/55</link>
      <description>&lt;p&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Reverse Integer&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Given a 32-bit signed integer, reverse digits of an integer.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Input:&lt;/b&gt; 123 &lt;b&gt;Output:&lt;/b&gt; 321&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Input:&lt;/b&gt; -123 &lt;b&gt;Output:&lt;/b&gt; -321&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Input:&lt;/b&gt; 120 &lt;b&gt;Output:&lt;/b&gt; 21&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt;&lt;br /&gt;Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [&amp;minus;231,&amp;nbsp; 231&amp;nbsp;&amp;minus; 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1584896431918&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

class Solution {
public:
	int reverse(int x) {
        long long int answer = 0;

        while (x != 0) {
        	// INT_MAX가 overflow, underflow가 일어나는 조건에 맞춰 0을 반환한다.
            if (((answer * 10) &amp;gt; INT_MAX) || ((answer * 10) &amp;lt; INT_MIN))
                return 0;
            answer *= 10;
            answer += x % 10;
            x /= 10;
        }
        return answer;
    }
};


int main() {
	int n;
	cout &amp;lt;&amp;lt; &quot;-2,147,483,646 ~ 2,147,483,647 사이의 값을 입력하세요 :&quot;;
	cin &amp;gt;&amp;gt; n;
	Solution s;
	cout &amp;lt;&amp;lt; s.reverse(n);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Success&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Runtime:&amp;nbsp;&lt;span&gt;0 ms&lt;/span&gt;&lt;span&gt;, faster than&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;100.00%&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;of&lt;span&gt;&amp;nbsp;&lt;/span&gt;C++&lt;span&gt;&amp;nbsp;&lt;/span&gt;online submissions for&lt;span&gt;&amp;nbsp;&lt;/span&gt;Reverse Integer.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Memory Usage:&amp;nbsp;&lt;span&gt;5.9 MB&lt;/span&gt;&lt;span&gt;, less than&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;100.00%&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;of&lt;span&gt;&amp;nbsp;&lt;/span&gt;C++&lt;span&gt;&amp;nbsp;&lt;/span&gt;online submissions for&lt;span&gt;&amp;nbsp;&lt;/span&gt;Reverse Integer.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>leetcode</category>
      <category>Reverse Integer</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/55</guid>
      <comments>https://everydayidid.tistory.com/55#entry55comment</comments>
      <pubDate>Mon, 23 Mar 2020 02:03:59 +0900</pubDate>
    </item>
    <item>
      <title>python으로 웹 크롤링하기</title>
      <link>https://everydayidid.tistory.com/54</link>
      <description>&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;HTML 및 XML 문서를 구문분석하기 위한 Python 패키지인 beautifulsoup를 설치하자&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;pip install requests beautifulsoup4&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Pycharm에서는 다음과 같은 방법으로도 패키지를 추가할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Setting - Project:~ - Project interpreter - + - 원하는패키지 선택 후 install&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;먼저 내 블로그(eveydayidid.tistory.com)의 html 정보를 가져와보자&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1584811296113&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen(&quot;https://everydayidid.tistory.com/52&quot;)
bs = BeautifulSoup(html, &quot;html.parser&quot;)

print(bs)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;602&quot; height=&quot;335&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sGSiJ/btqCPzsnHqp/5Gv6ozYQ0YLAKFxuSTJnA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sGSiJ/btqCPzsnHqp/5Gv6ozYQ0YLAKFxuSTJnA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sGSiJ/btqCPzsnHqp/5Gv6ozYQ0YLAKFxuSTJnA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsGSiJ%2FbtqCPzsnHqp%2F5Gv6ozYQ0YLAKFxuSTJnA1%2Fimg.png&quot; width=&quot;602&quot; height=&quot;335&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;HTML 전체로써는 데이터의 가치가 없기 때문에 가공해서 가져와야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BeautifulSoup 객체에서 다음과 같이 HTML 태그를 구분지어 뽑아올 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;head의 title 속성값을 가져온다.&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1584811335460&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print (bs.head.title)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;웹 문서 중 메타데이터만 찾아서 content 속성값을 가져온다.&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1584811368360&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for meta in bs.head.find_all('meta'):
   print(meta.get('content'))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;메인 화면에서 표시된 제목들을 가져와봤다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1584811515777&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from urllib.request import urlopen
from bs4 import BeautifulSoup

URL = urlopen(&quot;https://everydayidid.tistory.com&quot;)
bs = BeautifulSoup(URL, 'html.parser')
data = ''
for text in bs.find_all(&quot;strong&quot;, {&quot;class&quot;:&quot;title_post&quot;}) :
    data = data + str(text.text) + '\n'

print(data)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;619&quot; height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kL58J/btqCQ30Xqi3/eBMqkoxRc604aLYpr7aktK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kL58J/btqCQ30Xqi3/eBMqkoxRc604aLYpr7aktK/img.png&quot; data-alt=&quot;everydayidid.tistory.com&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kL58J/btqCQ30Xqi3/eBMqkoxRc604aLYpr7aktK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkL58J%2FbtqCQ30Xqi3%2FeBMqkoxRc604aLYpr7aktK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;619&quot; height=&quot;446&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;figcaption&gt;everydayidid.tistory.com&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;359&quot; height=&quot;102&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZWtg1/btqCO0RjcaI/1BNlJuDnW60DWmMEdJUkSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZWtg1/btqCO0RjcaI/1BNlJuDnW60DWmMEdJUkSk/img.png&quot; data-alt=&quot;출력 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZWtg1/btqCO0RjcaI/1BNlJuDnW60DWmMEdJUkSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZWtg1%2FbtqCO0RjcaI%2F1BNlJuDnW60DWmMEdJUkSk%2Fimg.png&quot; width=&quot;359&quot; height=&quot;102&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;figcaption&gt;출력 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Language</category>
      <category>python</category>
      <category>Web Crawling</category>
      <category>웹 크롤링</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/54</guid>
      <comments>https://everydayidid.tistory.com/54#entry54comment</comments>
      <pubDate>Sun, 22 Mar 2020 02:33:28 +0900</pubDate>
    </item>
    <item>
      <title>[BAEKJOON] 7568번 : 덩치</title>
      <link>https://everydayidid.tistory.com/52</link>
      <description>&lt;h2&gt;문제&lt;/h2&gt;
&lt;p&gt;우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x,y)로 표시된다. 두 사람 A 와 B의 덩치가 각각 (x,y), (p,q)라고 할 때 x&amp;gt;p 그리고 y&amp;gt;q 이라면 우리는 A의 덩치가 B의 덩치보다 &quot;더 크다&quot;고 말한다. 예를 들어 어떤 A, B 두 사람의 덩치가 각각 (56,177), (45,165) 라고 한다면 A의 덩치가 B보다 큰 셈이 된다. 그런데 서로 다른 덩치끼리 크기를 정할 수 없는 경우도 있다. 예를 들어 두 사람 C와 D의 덩치가 각각 (45, 181), (55,173)이라면 몸무게는 D가 C보다 더 무겁고, 키는 C가 더 크므로, &quot;덩치&quot;로만 볼 때 C와 D는 누구도 상대방보다 더 크다고 말할 수 없다.&lt;/p&gt;
&lt;p&gt;N명의 집단에서 각 사람의 덩치 등수는 자신보다 더 &quot;큰 덩치&quot;의 사람의 수로 정해진다. 만일 자신보다 더 큰 덩치의 사람이 k명이라면 그 사람의 덩치 등수는 k+1이 된다. 이렇게 등수를 결정하면 같은 덩치 등수를 가진 사람은 여러 명도 가능하다. 아래는 5명으로 이루어진 집단에서 각 사람의 덩치와 그 등수가 표시된 표이다.&lt;/p&gt;
&lt;p&gt;이름&amp;lt;몸무게, 키&amp;gt;덩치 등수&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;&amp;lt;55, 185&amp;gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;&amp;lt;58, 183&amp;gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;&amp;lt;88, 186&amp;gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;&amp;lt;60, 175&amp;gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;&amp;lt;46, 155&amp;gt;&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;위 표에서 C보다 더 큰 덩치의 사람이 없으므로 C는 1등이 된다. 그리고 A, B, D 각각의 덩치보다 큰 사람은 C뿐이므로 이들은 모두 2등이 된다. 그리고 E보다 큰 덩치는 A, B, C, D 이렇게 4명이므로 E의 덩치는 5등이 된다. 위 경우에 3등과 4등은 존재하지 않는다. 여러분은 학생 N명의 몸무게와 키가 담긴 입력을 읽어서 각 사람의 덩치 등수를 계산하여 출력해야 한다.&lt;/p&gt;
&lt;h2&gt;입력&lt;/h2&gt;
&lt;p&gt;첫 줄에는 전체 사람의 수 N이 주어진다. 그리고 이어지는 N개의 줄에는 각 사람의 몸무게와 키를 나타내는 양의 정수 x와 y가 하나의 공백을 두고 각각 나타난다. 단, 2 &amp;le; N &amp;le; 50, 10 &amp;le; x,y &amp;le; 200 이다.&lt;/p&gt;
&lt;h2&gt;출력&lt;/h2&gt;
&lt;p&gt;여러분은 입력에 나열된 사람의 덩치 등수를 구해서 그 순서대로 첫 줄에 출력해야 한다. 단, 각 덩치 등수는 공백문자로 분리되어야 한다.&lt;/p&gt;
&lt;h2&gt;예제 입력 1&lt;/h2&gt;
&lt;p&gt;5 55 185 58 183 88 186 60 175 46 155&lt;/p&gt;
&lt;h2&gt;예제 출력 1&lt;/h2&gt;
&lt;p&gt;2 2 1 2 5&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1584646136797&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

using namespace std;

int reverse(int x);

int arrx[50] = { 0, };
int arry[50] = { 0, };

int main() {
	int x, y, n, cnt = 1;
	cin &amp;gt;&amp;gt; n;
	for (int i = 0; i &amp;lt; n; i++)
		cin &amp;gt;&amp;gt; arrx[i]&amp;gt;&amp;gt; arry[i];

	for (int i = 0; i &amp;lt; n; i++) {
		for (int j = i; j &amp;lt; n + i; j++) {
			if (arrx[j - i] &amp;gt; arrx[i] &amp;amp;&amp;amp; arry[j - i] &amp;gt; arry[i])
				cnt++;
		}
		cout &amp;lt;&amp;lt; cnt &amp;lt;&amp;lt; &quot; &quot;;
		cnt = 1;
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>백준</category>
      <category>백준 7568번</category>
      <category>백준 덩치</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/52</guid>
      <comments>https://everydayidid.tistory.com/52#entry52comment</comments>
      <pubDate>Fri, 20 Mar 2020 04:30:31 +0900</pubDate>
    </item>
    <item>
      <title>[BAEKJOON] 1152번 : 단어의 개수</title>
      <link>https://everydayidid.tistory.com/51</link>
      <description>&lt;h2&gt;문제&lt;/h2&gt;
&lt;p&gt;영어 대소문자와 띄어쓰기만으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오.&amp;nbsp;단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.&lt;/p&gt;
&lt;h2&gt;입력&lt;/h2&gt;
&lt;p&gt;첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는&amp;nbsp;띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열의 앞과 뒤에는 공백이 있을 수도 있다.&lt;/p&gt;
&lt;h2&gt;출력&lt;/h2&gt;
&lt;p&gt;첫째 줄에 단어의 개수를 출력한다.&lt;/p&gt;
&lt;h2&gt;예제 입력 1&lt;/h2&gt;
&lt;p&gt;The Curious Case of Benjamin Button&lt;/p&gt;
&lt;h2&gt;예제 출력 1&lt;/h2&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;h2&gt;예제 입력 2&lt;/h2&gt;
&lt;p&gt;Mazatneunde Wae Teullyeoyo&lt;/p&gt;
&lt;h2&gt;예제 출력 2&lt;/h2&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;h2&gt;예제 입력 3&lt;/h2&gt;
&lt;p&gt;Teullinika Teullyeotzi&lt;/p&gt;
&lt;h2&gt;예제 출력 3&lt;/h2&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1584561162775&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

char str[1000001] = { 0, };
int cnt = 1;
int main() {
	
	scanf(&quot;%[^\n]&quot;, str);

	if (str[0] == ' ' &amp;amp;&amp;amp; str[1] == NULL) {
		cnt = 0;
	}

	int i = 1;
	while (1) {
		if (str[i + 1] == NULL)
			break;
		if (str[i] == ' ')
			cnt++;
		i++;
	}
	printf(&quot;%d&quot;, cnt);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>백준</category>
      <category>백준 1152번</category>
      <category>백준 단어의 개수</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/51</guid>
      <comments>https://everydayidid.tistory.com/51#entry51comment</comments>
      <pubDate>Thu, 19 Mar 2020 04:54:36 +0900</pubDate>
    </item>
    <item>
      <title>[BAEKJOON] 2444번 : 별 찍기-7</title>
      <link>https://everydayidid.tistory.com/50</link>
      <description>&lt;h2&gt;문제&lt;/h2&gt;
&lt;p&gt;예제를 보고&amp;nbsp;규칙을 유추한 뒤에 별을 찍어 보세요.&lt;/p&gt;
&lt;h2&gt;입력&lt;/h2&gt;
&lt;p&gt;첫째 줄에 N(1 &amp;le; N &amp;le; 100)이 주어진다.&lt;/p&gt;
&lt;h2&gt;출력&lt;/h2&gt;
&lt;p&gt;첫째 줄부터 2&amp;times;N-1번째 줄까지 차례대로 별을 출력한다.&lt;/p&gt;
&lt;h2&gt;예제 입력 1&lt;/h2&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;h2&gt;예제 출력 1&lt;/h2&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; *&lt;br /&gt;&amp;nbsp; &amp;nbsp;*** &lt;br /&gt;&amp;nbsp; ***** &lt;br /&gt;&amp;nbsp;******* &lt;br /&gt;********* &lt;br /&gt;&amp;nbsp;******* &lt;br /&gt;&amp;nbsp; ***** &lt;br /&gt;&amp;nbsp; &amp;nbsp;*** &lt;br /&gt;&amp;nbsp; &amp;nbsp; *&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1584463501514&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

using namespace std;

int main() {

	int n;
	scanf(&quot;%d&quot;, &amp;amp;n);

	for (int i = 1; i &amp;lt;= n; i++) {
		for (int k = n - i; k &amp;gt;= 0; k--) {
			printf(&quot; &quot;);
		}

		for (int j = 0; j &amp;lt; (i*2 - 1); j++) {
			printf(&quot;*&quot;);
		}
		printf(&quot;\n&quot;);
	}

	for (int i = n-1; i &amp;gt; 0; i--) {
		for (int k = n - i; k &amp;gt;= 0; k--) {
			printf(&quot; &quot;);
		}

		for (int j = 0; j &amp;lt; (i * 2 - 1); j++) {
			printf(&quot;*&quot;);
		}
		printf(&quot;\n&quot;);
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;오랜만의 별찍기다 ★&lt;/p&gt;
&lt;p&gt;개강하고 정신없어서 간단한거 풀어봤다&lt;/p&gt;
&lt;p&gt;5분정도 걸렸다&lt;/p&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>백준</category>
      <category>백준 2444번</category>
      <category>백준 별 찍기 - 7</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/50</guid>
      <comments>https://everydayidid.tistory.com/50#entry50comment</comments>
      <pubDate>Wed, 18 Mar 2020 01:47:17 +0900</pubDate>
    </item>
    <item>
      <title>[BAEKJOON] 2193번 : 이친수</title>
      <link>https://everydayidid.tistory.com/49</link>
      <description>&lt;h2&gt;문제&lt;/h2&gt;
&lt;p&gt;0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;이친수는 0으로 시작하지 않는다.&lt;/li&gt;
&lt;li&gt;이친수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;예를 들면 1, 10, 100, 101, 1000, 1001 등이 이친수가 된다. 하지만 0010101이나 101101은 각각 1, 2번 규칙에 위배되므로 이친수가 아니다.&lt;/p&gt;
&lt;p&gt;N(1 &amp;le; N &amp;le; 90)이 주어졌을 때, N자리 이친수의 개수를 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;h2&gt;입력&lt;/h2&gt;
&lt;p&gt;첫째 줄에 N이 주어진다.&lt;/p&gt;
&lt;h2&gt;출력&lt;/h2&gt;
&lt;p&gt;첫째 줄에 N자리 이친수의 개수를 출력한다.&lt;/p&gt;
&lt;h2&gt;예제 입력 1&lt;/h2&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;h2&gt;예제 출력 1&lt;/h2&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;풀이&lt;/h2&gt;
&lt;p&gt;노가다로 n=8까지 개수를 세어보니 피보나치 규칙이었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ug6uI/btqCLcWT0Io/UodLvQCN4z2iHSPJHDgQHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ug6uI/btqCLcWT0Io/UodLvQCN4z2iHSPJHDgQHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ug6uI/btqCLcWT0Io/UodLvQCN4z2iHSPJHDgQHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fug6uI%2FbtqCLcWT0Io%2FUodLvQCN4z2iHSPJHDgQHK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1584271244773&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

using namespace std;

int main() {
	int n;
	long int s, n1 = 1, n2 = 1;
	cin &amp;gt;&amp;gt; n;

	if (n == 1 || n == 2)
		cout &amp;lt;&amp;lt; 1;
	else {
		for (int i = 2; i &amp;lt; n; i++) {
			s = n1 + n2;
			n1 = n2;
			n2 = s;
		}
		cout &amp;lt;&amp;lt; s;
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>백준</category>
      <category>백준 2193번</category>
      <category>백준 이친수</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/49</guid>
      <comments>https://everydayidid.tistory.com/49#entry49comment</comments>
      <pubDate>Sun, 15 Mar 2020 20:26:45 +0900</pubDate>
    </item>
    <item>
      <title>cannot resolve web.servlet.view.InternalResourceViewResolver</title>
      <link>https://everydayidid.tistory.com/48</link>
      <description>&lt;p&gt;사용 툴 : IntelliJ&lt;/p&gt;
&lt;p&gt;사용 Framework : Spring MVC&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;프로젝트에서 코드를 작성하다가 로컬 경로명이 잠깐 바뀐적이 있다.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;그 뒤부터 자꾸 web.servlet.view.InternalResourceViewResolver 쪽이 cannot reslove class 하면서 나를 약올리기 시작했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;프로젝트 세팅에서 모듈도 확인해보고 경로도 변경해보고...&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chGj5X/btqCLdhaBqx/QBh2gbyVcphdHxQLFcEjz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chGj5X/btqCLdhaBqx/QBh2gbyVcphdHxQLFcEjz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chGj5X/btqCLdhaBqx/QBh2gbyVcphdHxQLFcEjz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchGj5X%2FbtqCLdhaBqx%2FQBh2gbyVcphdHxQLFcEjz1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;이런 저런 삽질 끝에 pom.xml의 dependency에 spring-webmvc가 없는데 이걸 어떻게 사용하려고 하고있나.. 라는 생각이 들었다. 기존에는 &lt;/span&gt;&lt;span&gt;&lt;/span&gt;어떤 경유에서 spring-webmvc가 자동으로 추가되어있었는지는 잘 모르겠으나 (아마 IntelliJ가 어딘가에서 자동으로 import 해줬겠지) 보다 정확하게 사용하기 위해서는 spring-webmvc를 사용해줘야 InternalResourceViewResolver를 사용할 수 있다는 것을 알 수 있었다.&lt;/p&gt;
&lt;pre id=&quot;code_1584266140414&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;spring-webmvc&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;s&gt;이후 메챠쿠챠 프로젝트를 실행시켰다고한다.&lt;/s&gt;&lt;/p&gt;</description>
      <category>  Spring</category>
      <category>cannot resolve class</category>
      <category>error</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/48</guid>
      <comments>https://everydayidid.tistory.com/48#entry48comment</comments>
      <pubDate>Sun, 15 Mar 2020 19:05:01 +0900</pubDate>
    </item>
    <item>
      <title>[PROGRAMMERS] K번째수</title>
      <link>https://everydayidid.tistory.com/47</link>
      <description>&lt;p&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.&lt;/p&gt;
&lt;p&gt;예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.&lt;/li&gt;
&lt;li&gt;1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.&lt;/li&gt;
&lt;li&gt;2에서 나온 배열의 3번째 숫자는 5입니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.&lt;/p&gt;
&lt;p&gt;제한사항&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;array의 길이는 1 이상 100 이하입니다.&lt;/li&gt;
&lt;li&gt;array의 각 원소는 1 이상 100 이하입니다.&lt;/li&gt;
&lt;li&gt;commands의 길이는 1 이상 50 이하입니다.&lt;/li&gt;
&lt;li&gt;commands의 각 원소는 길이가 3입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;입출력 예&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 57px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;array&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;commands&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;return&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 33.3721%; height: 19px;&quot;&gt;[1, 5, 2, 6, 3, 7, 4]&lt;/td&gt;
&lt;td style=&quot;width: 33.3721%; height: 19px;&quot;&gt;[[2, 5, 3], [4, 4, 1], [1, 7, 3]]&lt;/td&gt;
&lt;td style=&quot;width: 33.3721%; height: 19px;&quot;&gt;[5, 6, 3]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;입출력 예 설명&lt;/p&gt;
&lt;p&gt;[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.&lt;br /&gt;[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.&lt;br /&gt;[1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1584115890541&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;

using namespace std;

void swap(int &amp;amp;a, int &amp;amp;b) {
    int temp = a;
    a = b;
    b = temp;
}

int solution(int a, int b, int c, vector&amp;lt;int&amp;gt; arr) { 
    vector&amp;lt;int&amp;gt; temp;
    int cnt = 1;
    for(int i = a-1; i &amp;lt;= b-1; i++) {
        temp.push_back(arr[i]);
    }
    int min;
    
    for(int i = 0; i &amp;lt; temp.size(); i++) {
        min = i;
        for (int j = i; j &amp;lt; temp.size(); j++) {
            if(temp[min] &amp;gt; temp[j]) {
                min = j;
            }
        }
        if(min!=i)
            swap(temp[min], temp[i]);
    }
    
    return temp[(c-1)%(b-a+1)];
   
}

vector&amp;lt;int&amp;gt; solution(vector&amp;lt;int&amp;gt; array, vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; commands) {
    vector&amp;lt;int&amp;gt; answer;
    
    for(int i = 0; i &amp;lt; commands.size(); i++) {
        answer.push_back(solution(commands[i][0],commands[i][1],commands[i][2], array));
    }
    
    return answer;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>programmers K번째수</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/47</guid>
      <comments>https://everydayidid.tistory.com/47#entry47comment</comments>
      <pubDate>Sat, 14 Mar 2020 01:13:14 +0900</pubDate>
    </item>
    <item>
      <title>오류탐색기록</title>
      <link>https://everydayidid.tistory.com/46</link>
      <description>&lt;p&gt;mybatis 환경설정을 하면서 일어난 에러들을 차근차근 해결해보면서 적은 일지다.&lt;/p&gt;
&lt;p&gt;디렉토리, 패키지, 파일들은 다음과같이 구성되어있으며 해당 에러에 대한 해결 방법을 메모해두고자한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;262&quot; height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7dMjB/btqCJl0Ai9b/iN6z2jOSR9nhDWZse1kkG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7dMjB/btqCJl0Ai9b/iN6z2jOSR9nhDWZse1kkG0/img.png&quot; data-alt=&quot;디렉토리, 파일 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7dMjB/btqCJl0Ai9b/iN6z2jOSR9nhDWZse1kkG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7dMjB%2FbtqCJl0Ai9b%2FiN6z2jOSR9nhDWZse1kkG0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;262&quot; height=&quot;600&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;figcaption&gt;디렉토리, 파일 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;첫번째 에러&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;java.lang.IllegalStateException:&amp;nbsp;ApplicationEventMulticaster&amp;nbsp;not&amp;nbsp;initialized&amp;nbsp;-&amp;nbsp;call&amp;nbsp;'refresh'&amp;nbsp;before&amp;nbsp;multicasting&amp;nbsp;events&amp;nbsp;via&amp;nbsp;the&amp;nbsp;context:&amp;nbsp;Root&amp;nbsp;WebApplicationContext:&amp;nbsp;startup&amp;nbsp;date&amp;nbsp;[Thu&amp;nbsp;Mar&amp;nbsp;12&amp;nbsp;16:14:31&amp;nbsp;KST&amp;nbsp;2020];&amp;nbsp;root&amp;nbsp;of&amp;nbsp;context&amp;nbsp;hierarchy &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;시도 1&lt;/b&gt;&lt;br /&gt;mybatis-spring의 버전이 맞지 않았다. &lt;br /&gt;https://mvnrepository.com/artifact/org.mybatis/mybatis-spring/1.3.2 &lt;br /&gt;위&amp;nbsp;링크에서&amp;nbsp;1.3.2version의&amp;nbsp;Dependencies에서&amp;nbsp;spring의&amp;nbsp;버전이&amp;nbsp;4.x.x인것을&amp;nbsp;보아하니&amp;nbsp;버전이&amp;nbsp;안맞는듯&amp;nbsp;하다... &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;시도 2&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;찾아본 결과 id나 class가 없는 태그가 있을때 해당 오류가 발생할 수 있다고 한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;config.xml에서&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;lt;context:property-placeholder &lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;=&quot;classpath*:config/config.properties&quot;&lt;/span&gt;&lt;span&gt;/&amp;gt;가 &lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;bean&amp;gt; 태그로 감싸져있는것을 없애보았다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;id도 class도 없는 bean태그로 뭘 하려고했던건지..&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;이를 없애고 &lt;/span&gt;해당&amp;nbsp;에러는&amp;nbsp;해결되었다. &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;두번째 에러&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;org.apache.commons.dbcp.SQLNestedException:&amp;nbsp;Cannot&amp;nbsp;create&amp;nbsp;PoolableConnectionFactory&amp;nbsp;(Unknown&amp;nbsp;database&amp;nbsp;'community')&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;시도 1&lt;/b&gt;&lt;br /&gt;Tomcat 실행전 mysql을 실행하지 않고 시작해버렸다.. mysql을 실행하고 서버를 재시작해보자 &lt;br /&gt;하지만 mysql을 실행하지 않은 문제가아니었다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;시도 2&lt;/b&gt;&lt;br /&gt;에러메시지를 읽어보니 community라는 데이터베이스를 찾을 수 없다고 하는것 같다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;config.properties를&amp;nbsp;확인해보니&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;jdbc.url&amp;nbsp;=&amp;nbsp;jdbc:mysql://localhost:3306/community?characterEncoding=utf8&amp;amp;useUnicode=true&amp;amp;mysqlEncoding=utf8&amp;amp;zeroDateTimeBehavior=convertToNull&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;라고&amp;nbsp;되어있었다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;나에겐&amp;nbsp;communitiy라는&amp;nbsp;DB가없는데&amp;nbsp;나는&amp;nbsp;도데체&amp;nbsp;어디로&amp;nbsp;접속을&amp;nbsp;시도하고자했던&amp;nbsp;것일까..?&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;community라는 DB를 임시로 만들고 재시작하자 해당 에러는 해결되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;세번째 에러&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;org.apache.commons.dbcp.SQLNestedException:&amp;nbsp;Cannot&amp;nbsp;create&amp;nbsp;PoolableConnectionFactory&amp;nbsp;(The&amp;nbsp;server&amp;nbsp;time&amp;nbsp;zone&amp;nbsp;value&amp;nbsp;'���ѹ&amp;alpha;�&amp;nbsp;ǥ�ؽ�'&amp;nbsp;is&amp;nbsp;unrecognized&amp;nbsp;or&amp;nbsp;represents&amp;nbsp;more&amp;nbsp;than&amp;nbsp;one&amp;nbsp;time&amp;nbsp;zone.&amp;nbsp;You&amp;nbsp;must&amp;nbsp;configure&amp;nbsp;either&amp;nbsp;the&amp;nbsp;server&amp;nbsp;or&amp;nbsp;JDBC&amp;nbsp;driver&amp;nbsp;(via&amp;nbsp;the&amp;nbsp;serverTimezone&amp;nbsp;configuration&amp;nbsp;property)&amp;nbsp;to&amp;nbsp;use&amp;nbsp;a&amp;nbsp;more&amp;nbsp;specifc&amp;nbsp;time&amp;nbsp;zone&amp;nbsp;value&amp;nbsp;if&amp;nbsp;you&amp;nbsp;want&amp;nbsp;to&amp;nbsp;utilize&amp;nbsp;time&amp;nbsp;zone&amp;nbsp;support.)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다른 에러가나왔다. servertimezone에 관련된 에러같다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;시도 1&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a href=&quot;https://yenaworldblog.wordpress.com/2018/01/24/java-mysql-%EC%97%B0%EB%8F%99%EC%8B%9C-%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94-%EC%97%90%EB%9F%AC-%EB%AA%A8%EC%9D%8C/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이곳&lt;/a&gt;을 참고하여&amp;nbsp;url에&amp;nbsp;serverTimezone을&amp;nbsp;추가했다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;jdbc.url&amp;nbsp;=&amp;nbsp;jdbc:mysql://localhost:3306/community?characterEncoding=utf8&amp;amp;useUnicode=true&amp;amp;mysqlEncoding=utf8&amp;amp;serverTimezone=UTC&amp;amp;zeroDateTimeBehavior=convertToNull&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;로&amp;nbsp;바꾸었다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;참고로 mysql 5.1.x버전 이상에서는 KST 시간을 확인하지 못하기 때문에 다음과 같은 serverTimezone설정을 해줘야한다고한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;b&gt;네번째 에러&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;org.springframework.web.servlet.DispatcherServlet&amp;nbsp;noHandlerFound &lt;br /&gt;경고:&amp;nbsp;No&amp;nbsp;mapping&amp;nbsp;found&amp;nbsp;for&amp;nbsp;HTTP&amp;nbsp;request&amp;nbsp;with&amp;nbsp;URI&amp;nbsp;[/hello]&amp;nbsp;in&amp;nbsp;DispatcherServlet&amp;nbsp;with&amp;nbsp;name&amp;nbsp;'dispatcher' &lt;br /&gt;&lt;br /&gt;중간에&amp;nbsp;C드라이브&amp;nbsp;하위&amp;nbsp;디렉터리&amp;nbsp;명을&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[C:\Koreatech 2019\Private Study\SpringStudy\spring-hello-world]에서&lt;/p&gt;
&lt;p&gt;[C:\ChoiJunho\Private Study\SpringStudy\spring-hello-world]로&lt;/p&gt;
&lt;p&gt;바꿨더니&amp;nbsp;갑자기&amp;nbsp;cannot&amp;nbsp;resolve&amp;nbsp;symbol&amp;nbsp;requestmapping이&amp;nbsp;뜬다..&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;dispatcher-servlet.xml 파일을 보니까 &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&amp;gt;부분이&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; 빨간색으로 뜨면서 Cannot resolve 에러를 내뱉고있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;시도 1&lt;/b&gt;&lt;br /&gt;dependency에 spring-web을 추가해봤다.&lt;br /&gt;이는 해결방법이 아니었다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;시도 2&lt;/b&gt;&lt;br /&gt;이런저런 시도끝에 그냥 새로운 프로젝트를 생성했더니 해결되었다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;하루종일 에러메시지랑 마주하다보니 친해져버릴것만같다.&lt;/p&gt;
&lt;p&gt;내가 쓴 코드가 제대로 되어있을거라고 믿으면 안된다는 교훈을 얻었다.&lt;/p&gt;
&lt;p&gt;또한 에러메시지를 잘 읽고 해석해보는 연습이 많이 필요할것 같다...&lt;/p&gt;</description>
      <category>  Spring</category>
      <category>exception</category>
      <category>Spring</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/46</guid>
      <comments>https://everydayidid.tistory.com/46#entry46comment</comments>
      <pubDate>Fri, 13 Mar 2020 21:59:43 +0900</pubDate>
    </item>
    <item>
      <title>[BAEKJOON] 10773번 : 제로</title>
      <link>https://everydayidid.tistory.com/45</link>
      <description>&lt;h2&gt;문제&lt;/h2&gt;
&lt;p&gt;나코더 기장 재민이는 동아리 회식을 준비하기 위해서 장부를 관리하는 중이다.&lt;/p&gt;
&lt;p&gt;재현이는 재민이를 도와서 돈을 관리하는 중인데, 애석하게도 항상 정신없는 재현이는 돈을 실수로 잘못 부르는 사고를 치기 일쑤였다.&lt;/p&gt;
&lt;p&gt;재현이는 잘못된 수를 부를 때마다 0을 외쳐서, 가장 최근에 재민이가 쓴 수를 지우게 시킨다.&lt;/p&gt;
&lt;p&gt;재민이는 이렇게 모든 수를 받아 적은 후 그 수의 합을 알고 싶어 한다. 재민이를 도와주자!&lt;/p&gt;
&lt;h2&gt;입력&lt;/h2&gt;
&lt;p&gt;첫 번째 줄에 정수 K가 주어진다. (1 &amp;le; K &amp;le; 100,000)&lt;/p&gt;
&lt;p&gt;이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 &quot;0&quot; 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경우 해당 수를 쓴다.&lt;/p&gt;
&lt;p&gt;정수가 &quot;0&quot;일 경우에 지울 수 있는 수가 있음을 보장할 수 있다.&lt;/p&gt;
&lt;h2&gt;출력&lt;/h2&gt;
&lt;p&gt;재민이가 최종적으로 적어 낸 수의 합을 출력한다. 최종적으로 적어낸 수의 합은 231-1보다 작거나 같은 정수이다.&lt;/p&gt;
&lt;h2&gt;예제 입력 1&lt;span&gt; &lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;4 3 0 4 0&lt;/p&gt;
&lt;h2&gt;예제 출력 1&lt;span&gt; &lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;h2&gt;예제 입력 2&lt;span&gt; &lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;10 1 3 5 4 0 0 7 0 0 6&lt;/p&gt;
&lt;h2&gt;예제 출력 2&lt;span&gt; &lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1583594880077&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;

using namespace std;

int arr[100000] = { 0 };

int main() {
	int k, n, sum = 0;
	cin &amp;gt;&amp;gt; k;
	vector&amp;lt;int&amp;gt; v;

	for (int i = 0; i &amp;lt; k; i++) {
		cin &amp;gt;&amp;gt; n;
		if (n == 0)
			v.pop_back();
		else
			v.push_back(n);
	}
	for (int j = 0; j &amp;lt; v.size(); j++) {
		sum += v[j];
	}
	cout &amp;lt;&amp;lt; sum;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>백준</category>
      <category>백준 10733번</category>
      <category>백준 제로</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/45</guid>
      <comments>https://everydayidid.tistory.com/45#entry45comment</comments>
      <pubDate>Sun, 8 Mar 2020 00:28:24 +0900</pubDate>
    </item>
    <item>
      <title>순차탐색과 이진탐색 속도차이</title>
      <link>https://everydayidid.tistory.com/44</link>
      <description>&lt;p&gt;Spring을 이용해 순차탐색과 이진탐색의 속도차이를 재보았다.&lt;/p&gt;
&lt;p&gt;Controller와 Service를 분리하고&amp;nbsp;AOP도 적용해보았다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;SearchController.java&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583590140191&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package kr.org.exam.search.controller;

import kr.org.exam.search.service.Search;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class SearchController {
    private Search search;

    @Autowired
    // Search 객체가 존재하는지를 확인한 후에 그 객체를 변수에 주입한다.
    public void setSearch(Search search) {
        this.search = search;
    }

    // URL 패턴을 매핑하여 해당 메소드를 실행한다.
    // URL이 localhost:8080/search 일 때 아래 test 메소드 수행
    @RequestMapping(value = &quot;/search&quot;, method = RequestMethod.GET)
    public String test() {
        search.SequentialSearch();
        search.BinarySearch();
        return &quot;search&quot;;
    }

}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Search.java&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583590132473&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package kr.org.exam.search.service;

// 순차, 이진탐색을 위한 인터페이스
public interface Search {
    String BinarySearch();
    String SequentialSearch();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;SearchImpl.java&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583590125511&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package kr.org.exam.search.service;

import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

// Service임을 명시
// ComponentScan을 통해 빈으로 등록된다.
@Service
public class SearchImpl implements Search {
    private List&amp;lt;Integer&amp;gt; data = new ArrayList();
    private int key = 9999999;

    // 객체가 생성될 때 랜덤한 수들을 리스트에 넣는다.
    public SearchImpl() {
        for (int i = 0; i &amp;lt; 10000000; i++) {
             // data.add((int)(Math.random() * 10000 + 1));
            data.add(i);
        }
        // Collections.sort(data);
    }
    // 순차 탐색을 수행한다.
    @Override
    public String SequentialSearch() {
        data.indexOf(key);
        // TimeMeasure에서 본 함수가 실행되었음을 표기하기위해 String으로 반환
        return &quot;SequentialSearch&quot;;
    }

    // 정렬 ~ 이진탐색까지 시간측정에 넣었다.
    @Override
    public String BinarySearch() {
        Collections.binarySearch(data, key);
        // TimeMeasure에서 본 함수가 실행되었음을 표기하기위해 String으로 반환
        return &quot;BinarySearch&quot;;
    }

}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;시간을 측정하는 부분이 순차탐색, 이진탐색 두 메소드의 공통된 기능이므로 TimeMeasure.java로 기능을 분리했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;TimeMeasure.java&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583590152012&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package kr.org.exam.search.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

// AOP임을 명시하기 위한 어노테이션
@Aspect
// Component로 등록함으로써 dispatcher-servlet.xml에서 설정해둔 Component scan에서 해당 클래스를 찾아 빈으로 등록
@Component
public class TimeMeasure {
    // 해당 객체의 메소드 실행 전, 후에 공통 기능을 수행하기 위해 @Around 사용
    // execution 문은 &quot;kr.org.exam.search.. 패키지 아래에 있는 모든 파일 중 Search라는 이름의 메소드 중 파라미터가 0개 이상인 것이 실행될 때&quot; 를 의미한다.
    @Around(&quot;execution(* kr.org.exam.search.service.*.*Search(..))&quot;)
    // Around 어드바이스를 구현한 메소드는 ProceedingJoinPoint를 반드시 첫 번째 파라미터로 지정해야한다.
    public Object measure(ProceedingJoinPoint joinPoint) throws Throwable {

        double start = System.nanoTime();
        // joinPoint.proceed()를 기준으로 윗부분은 Before, 아래부분은 AfterThrowing 부분으로 구분지어진다.
        // proceed()의 리턴값이 Object이므로 아래 result변수를 Object로 설정했다.
        // Aspect로 연결된 본래 메소드의 리턴값을 형변환하여 받을 수 있다.
        Object result = joinPoint.proceed();
        double stop = System.nanoTime();
        // joinPoint.proceed()는 대상 포인트컷 수행 결과값을 반환한다. (해당 메소드의 return값을 반환)
        System.out.println(result);
        System.out.println(stop - start + &quot;ns&quot;);

        return result;
    }

}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이론만보다가 실습해보니 정말 많이 모르고있었던것을 알수있었다.&lt;/p&gt;
&lt;p&gt;추가로 view단에 Controller의 값을 넘기는것은 아직 모르겠다..&lt;/p&gt;</description>
      <category>  Spring</category>
      <category>aop</category>
      <category>SpringMVC</category>
      <category>순차탐색</category>
      <category>이진탐색</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/44</guid>
      <comments>https://everydayidid.tistory.com/44#entry44comment</comments>
      <pubDate>Sat, 7 Mar 2020 23:10:20 +0900</pubDate>
    </item>
    <item>
      <title>Spring 첫 실습</title>
      <link>https://everydayidid.tistory.com/43</link>
      <description>&lt;p&gt;이론으로만 이해하다가 실제로 실습해보니&amp;nbsp;이해한척 하고 넘어갔던것들이 너무 많이 보였다.&lt;/p&gt;
&lt;p&gt;간단한 Bean 등록부터 시작해서 RequestMapping, AOP 구조까지 계속해서 난관이었다.&lt;/p&gt;
&lt;p&gt;어려운만큼 계속 반복해서 보고 익숙해져야겠다는 생각밖에 들지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;s&gt;Spring 너무어렵다으아아아아으아&lt;/s&gt;&lt;/p&gt;</description>
      <category>  Daily/잡담</category>
      <category>Spring</category>
      <category>잡담</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/43</guid>
      <comments>https://everydayidid.tistory.com/43#entry43comment</comments>
      <pubDate>Sat, 7 Mar 2020 04:45:58 +0900</pubDate>
    </item>
    <item>
      <title>[BAEKJOON] 2822번 : 점수계산</title>
      <link>https://everydayidid.tistory.com/42</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상근이는 퀴즈쇼의 PD이다. 이 퀴즈쇼의 참가자는 총 8개 문제를 푼다. 참가자는 각 문제를 풀고, 그 문제를 풀었을 때 얻는 점수는 문제를 풀기 시작한 시간부터 경과한 시간과 난이도로 결정한다. 문제를 풀지 못한 경우에는 0점을 받는다. 참가자의 총 점수는 가장 높은 점수 5개의 합이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상근이는 잠시 여자친구와 전화 통화를 하느라 참가자의 점수를 계산하지 않고 있었다. 참가자의 8개 문제 점수가 주어졌을 때, 총 점수를 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8개 줄에 걸쳐서 각 문제에 대한 참가자의 점수가 주어진다. 점수는 0보다 크거나 같고, 150보다 작거나 같다. 모든 문제에 대한 점수는 서로 다르다. 입력으로 주어지는 순서대로 1번 문제, 2번 문제, ... 8번 문제이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째 줄에 참가자의 총점을 출력한다. 둘째 줄에는 어떤 문제가 최종 점수에 포함되는지를 공백으로 구분하여 출력한다. 출력은 문제 번호가 증가하는 순서이어야 한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;예제 입력&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20 30 50 48 33 66 0 64&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;예제 출력&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;261&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3 4 5 6 8&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1582996047701&quot; class=&quot;c++ cpp arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

using namespace std;

int main() {
	int x, sum = 0, cnt = 0;
	bool a[151] = { false, };
	int b[9];
	for (int i = 1; i &amp;lt; 9; i++) {
		cin &amp;gt;&amp;gt; b[i];
		a[b[i]] = true;
	}

	for (int i = 150; i &amp;gt; 0; i--) {
		if (a[i]) {
			sum += i;
			cnt++;
			a[i] = false;
		}
		if (cnt == 5)
			break;
	}

	cout &amp;lt;&amp;lt; sum &amp;lt;&amp;lt; endl;

	for (int i = 1; i &amp;lt; 9; i++) {
		if (!(a[b[i]]))
			cout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &quot; &quot;;
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>백준</category>
      <category>백준 2822번</category>
      <category>백준 점수계산</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/42</guid>
      <comments>https://everydayidid.tistory.com/42#entry42comment</comments>
      <pubDate>Sun, 1 Mar 2020 02:08:37 +0900</pubDate>
    </item>
    <item>
      <title>[BAEKJOON] 1100번 : 하얀 칸</title>
      <link>https://everydayidid.tistory.com/41</link>
      <description>&lt;h2&gt;문제&lt;/h2&gt;
&lt;p&gt;체스판은 8*8크기이고, 검정 칸과 하얀 칸이 번갈아가면서 색칠되어 있다. 가장 왼쪽 위칸 (0,0)은 하얀색이다. 체스판의 상태가 주어졌을 때, 하얀 칸 위에 말이 몇 개 있는지 출력하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;h2&gt;입력&lt;/h2&gt;
&lt;p&gt;첫째 줄부터 8개의 줄에 체스판의 상태가 주어진다. &amp;lsquo;.&amp;rsquo;은 빈 칸이고, &amp;lsquo;F&amp;rsquo;는 위에 말이 있는 칸이다.&lt;/p&gt;
&lt;h2&gt;출력&lt;/h2&gt;
&lt;p&gt;첫째 줄에 문제의 정답을 출력한다.&lt;/p&gt;
&lt;h2&gt;예제 입력 1&lt;span&gt; &lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;.F.F...F F...F.F. ...F.F.F F.F...F. .F...F.. F...F.F. .F.F.F.F ..FF..F.&lt;/p&gt;
&lt;h2&gt;예제 출력 1&lt;span&gt; &lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1582213757611&quot; class=&quot;c++ cpp&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;
using namespace std;

int main() {
	string n[8];
	int count = 0;
	for (int i = 0; i &amp;lt; 8; i++) {
		cin &amp;gt;&amp;gt; n[i];
	}
	for (int i = 0; i &amp;lt; 8; i++) {
		for (int j = 0; j &amp;lt; 8; j++) {
			if (i % 2 == 0) {
				if (j % 2 == 0 &amp;amp;&amp;amp; n[i][j] == 'F') {
					count++;
				}
			}
			else {
				if (j % 2 == 1 &amp;amp;&amp;amp; n[i][j] == 'F') {
					count++;
				}
			}
		}
	}
	cout &amp;lt;&amp;lt; count;
	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>백준</category>
      <category>백준 1100번</category>
      <category>백준 하얀칸</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/41</guid>
      <comments>https://everydayidid.tistory.com/41#entry41comment</comments>
      <pubDate>Fri, 21 Feb 2020 00:49:54 +0900</pubDate>
    </item>
    <item>
      <title>[BAEKJOON] 1032번 : 명령프롬프트</title>
      <link>https://everydayidid.tistory.com/40</link>
      <description>&lt;h2&gt;문제&lt;/h2&gt;
&lt;p&gt;시작 -&amp;gt; 실행 -&amp;gt; cmd를 쳐보자. 검정 화면이 눈에 보인다. 여기서 dir이라고 치면 그 디렉토리에 있는 서브디렉토리와 파일이 모두 나온다. 이때 원하는 파일을 찾으려면 다음과 같이 하면 된다.&lt;/p&gt;
&lt;p&gt;dir *.exe라고 치면 확장자가 exe인 파일이 다 나온다. &quot;dir 패턴&quot;과 같이 치면 그 패턴에 맞는 파일만 검색 결과로 나온다. 예를 들어, dir a?b.exe라고 검색하면 파일명의 첫 번째 글자가 a이고, 세 번째 글자가 b이고, 확장자가 exe인 것이 모두 나온다. 이때 두 번째 문자는 아무거나 나와도 된다. 예를 들어, acb.exe, aab.exe, apb.exe가 나온다.&lt;/p&gt;
&lt;p&gt;이 문제는 검색 결과가 먼저 주어졌을 때, 패턴으로 뭘 쳐야 그 결과가 나오는지를 출력하는 문제이다. 패턴에는 알파벳과 &quot;.&quot; 그리고 &quot;?&quot;만 넣을 수 있다. 가능하면 ?을 적게 써야 한다. 그 디렉토리에는 검색 결과에 나온 파일만 있다고 가정하고, 파일 이름의 길이는 모두 같다.&lt;/p&gt;
&lt;h2&gt;입력&lt;/h2&gt;
&lt;p&gt;첫째 줄에 파일 이름의 개수 N이 주어진다. 둘째 줄부터 N개의 줄에는 파일 이름이 주어진다. N은 50보다 작거나 같은 자연수이고 파일 이름의 길이는 모두 같고 길이는 최대 50이다. 파일이름은 알파벳과 &quot;.&quot; 그리고 &quot;?&quot;로만 이루어져 있다.&lt;/p&gt;
&lt;h2&gt;출력&lt;/h2&gt;
&lt;p&gt;첫째 줄에 패턴을 출력하면 된다.&lt;/p&gt;
&lt;h2&gt;예제 입력 1&lt;/h2&gt;
&lt;p&gt;3 config.sys config.inf configures&lt;/p&gt;
&lt;h2&gt;예제 출력 1&lt;/h2&gt;
&lt;p&gt;config????&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1582213034304&quot; class=&quot;c++ cpp&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;
using namespace std;

bool name[100] = { false };

int main() {
	int n;
	string s1, s2;
	cin &amp;gt;&amp;gt; n;
	cin &amp;gt;&amp;gt; s1;
	for (int i = 0; i &amp;lt; n-1; i++) {
		cin &amp;gt;&amp;gt; s2;
		for (int j = 0; j &amp;lt; s2.length(); j++) {
			if (s1[j] != s2[j]) {
				name[j] = true;
			}
		}
	}

	for (int i = 0; i &amp;lt; s1.length(); i++) {
		if (name[i])
			cout &amp;lt;&amp;lt; &quot;?&quot;;
		else
			cout &amp;lt;&amp;lt; s1[i];
	}

	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category> ️ Computer/Algorithm Solution</category>
      <category>백준</category>
      <category>백준 1032번</category>
      <category>백준 명령프롬프트</category>
      <author>_주노</author>
      <guid isPermaLink="true">https://everydayidid.tistory.com/40</guid>
      <comments>https://everydayidid.tistory.com/40#entry40comment</comments>
      <pubDate>Fri, 21 Feb 2020 00:37:34 +0900</pubDate>
    </item>
  </channel>
</rss>