{
    "componentChunkName": "component---src-templates-blog-template-js",
    "path": "/daily-22-1/",
    "result": {"data":{"cur":{"id":"4bc09057-3401-53e3-a469-9b7e17a9cb59","html":"<p>벌써 22년도 절반이 지나가고 있고, 4학년 1학기를 마무리하며 지난 1학기를 되돌아보려 합니다.</p>\n<p>4학년 1학기는 바쁘게 아주 빠르게 지나갔네요.<br>\n19학점을 들으면서 취업 준비를 위한 준비도 하다보니 시간 가는 줄 모를 정도였습니다^^,,<br>\n백엔드로 진로를 정하고 처음으로 프로젝트도 2개나 진행해보고, 처음으로 코테도 치고 면접 경험도 하면서 많은 경험을 할 수 있었던 학기였습니다.</p>\n<h2 id=\"-프로젝트\" style=\"position:relative;\"><a href=\"#-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8\" aria-label=\" 프로젝트 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🎞 프로젝트</h2>\n<p>우선, 이번 학기 프로젝트는 2개를 진행했는데 <strong>종합설계프로젝트2</strong>와 <strong>모바일앱프로그래밍2</strong> 과목을 들으면서 각각 프로젝트를 진행했습니다.</p>\n<h3 id=\"종프2-carbon-tracker\" style=\"position:relative;\"><a href=\"#%EC%A2%85%ED%94%842-carbon-tracker\" aria-label=\"종프2 carbon tracker permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>[종프2] Carbon-Tracker</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 40.55555555555556%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABxklEQVQoz0WPyW4TURBF/Yf8DDvEF/ABrNiERcQiYsGCUcmCIEiMQyKFJB5it+eeX09+/abuA+6IUNLVVemqjm71WmdRdY1RiraxWGsxxnSutSHNKoK4YDLbMptuuBsvuRl6LDcpaSbJix3O/b/pHQ8WvP3mcXhyz+DOh9Z14V5BlFPtarSxBHFFEGzwllMW64SskFS7BFHsofIR2ntzMuHF0TXPX//i888FjX2AKW0ZTeb0z8+YzWaEqeFmNKR/e06UarZBxGB0jchLoqSgcQ9Fegefhjw7uODpqz4f+/OuYdM4lFIkoup2kUtWYUVd11hlyUtFmJQ4ayjLHVFa4v4BD4/Hjw3fn3lkuSTOJH4i8dYZUjk2ocbPA2b5b9a7CcPtlKKyNC0Y2yDyChqH2wP7tz5Hp3Pe/VhyPY2wWnfhTsTEoqIFlHZYZ7GNQVuJazXaOPJKIwrFcBqT1gahLD0pFbJ27CcTJd/vK76efsB7+YTJ/RKpIU4VX1YeV0nIKBOdJ7JG65ZQ1JxfrrnMNBeFoRcmBeN5ircWpKIkKA1X4zHJuM/KT9mERad5KFhFGcsoYx3n+HGJH5Ws/JyyqlHWUv99+Q/L8lSwrYkHLwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"CT-structure.png\"\n        title=\"CT-structure.png\"\n        src=\"/static/e62b1a4368168998beb9906760e5955c/37523/CT-structure.png\"\n        srcset=\"/static/e62b1a4368168998beb9906760e5955c/e9ff0/CT-structure.png 180w,\n/static/e62b1a4368168998beb9906760e5955c/f21e7/CT-structure.png 360w,\n/static/e62b1a4368168998beb9906760e5955c/37523/CT-structure.png 720w,\n/static/e62b1a4368168998beb9906760e5955c/302a4/CT-structure.png 1080w,\n/static/e62b1a4368168998beb9906760e5955c/07a9c/CT-structure.png 1440w,\n/static/e62b1a4368168998beb9906760e5955c/555cf/CT-structure.png 1960w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>종프2는 작년 종프1이랑은 다르게 <strong>Elastic Stack</strong>, <strong>Kafka</strong> 등을 사용하면서 더 제대로 된 프로젝트를 할 수 있었고, 그래서 시작할 때부터 많은 기대와 흥미를 느끼며 시작했습니다.<br>\n추후에 프로젝트 회고도 올릴 예정이어서 프로젝트에 대한 자세한 설명은 거기서 하고, 아무튼 처음으로 <strong>Spring</strong>을 사용해서 다른 사람들과 프로젝트를 진행해서 재미있었고 <strong>Elastic Stack</strong>, <strong>Kafka</strong> 등 다양한 기술들을 처음으로 사용해보면서 설치부터 중간중간 헤매는 부분들이 많았지만 그래서 더 재밌었고,, 많은 걸 배울 수 있는 프로젝트였습니다. ꉂꉂ(ᵔᗜᵔ*)<br>\n특히, 아주 간단한 머신러닝을 통해 예측 모델을 생성하고 <strong>FastAPI</strong>를 사용해서 모델을 서빙하는 과정을 경험해봤는데 재밌었다..! 덕분에 <strong>MLOps</strong>에 조금이나마 흥미가 생겼고 더 알아봐야겠다,,,!</p>\n<h3 id=\"모앱2-taboo-drug\" style=\"position:relative;\"><a href=\"#%EB%AA%A8%EC%95%B12-taboo-drug\" aria-label=\"모앱2 taboo drug permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>[모앱2] Taboo-Drug</h3>\n<p><img src=\"/c6b0e7069c15127073b1b66fa7716116/TD-structure.jpg\" alt=\"TD-structure.JPG\"></p>\n<p>모앱2에서는 처방전을 스마트폰 카메라로 인식해서 자동으로 약품을 등록하도록 하는 기능을 구현하고자 했습니다.<br>\n처방전 인식을 위해 <strong>Tesseract OCR</strong>을 사용하려고 하다가 <strong>EasyOCR</strong>이라는 비교적 최근에 나온 좋은 프레임워크가 있는 걸 보고 <strong>EasyOCR</strong>을 학습시켜서 구현하기로 했습니다.<br>\n하지만 전체 프로젝트를 구현하는데 이틀 정도의 짧은 시간 밖에 없어서 제대로 학습시키기에는 시간이 부족했고 그래서 우선 인식 후, <strong>Elasticsearch</strong>에서 <code class=\"language-text\">fuzzy query</code>를 사용해 DB에 있는 약품명과 비교하여 정확한 값만 반환하도록 구현했습니다.</p>\n<p>다른 프로젝트랑 시험, 면접 등 다른 일정들 때문에 프로젝트를 늦게 시작해서 시간이 부족해 제대로 구현하지 못한게 아쉬운 프로젝트였다,, 처음부터 설계를 제대로 하고 OCR 학습도 제대로 한 다음에 했다면 정말 괜찮은 결과물이 나왔을텐데 이 점이 너무 아쉽게 느껴졌다. 그래도 종프2 프로젝트를 하면서 사용하지 못한 <strong>Elasticsearch</strong> 기능들을 사용해보고, OCR 기술을 가볍게지만 사용해볼 수 있어서 좋은 경험이 되었습니다. 특히 OCR 기술은 나중에 가능하다면 현재 진행하고 있는 야구장 좌석뷰 프로젝트에서도 티켓 인식하는 기능으로 추가할 수 있을 것 같아서 조금 흥미가 생겼다..!</p>\n<hr>\n<h2 id=\"-코테--면접\" style=\"position:relative;\"><a href=\"#-%EC%BD%94%ED%85%8C--%EB%A9%B4%EC%A0%91\" aria-label=\" 코테  면접 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🎙 코테 &#x26; 면접</h2>\n<p>이번 학기에 제일 큰 경험은 역시 코테와 면접인 것 같습니다.</p>\n<ol>\n<li><code class=\"language-text\">[프로그래머스] 2022 Dev-Matching: 웹 백엔드 개발자(상반기)-1</code> - 코테 탈</li>\n<li><code class=\"language-text\">[프로그래머스] 2022 Summer Coding</code> - 코테 합 -> 면접 합 -> <code class=\"language-text\">미리디 인턴</code> 최종 합</li>\n<li><code class=\"language-text\">[KAKAO] 2022 카카오 테크 인턴십</code> - 코테 + 서류 합 -> 면접 탈</li>\n<li><code class=\"language-text\">[Works Mobile] 2022 웍스모바일 하계 인턴</code> - 서류 탈</li>\n<li><code class=\"language-text\">[NCSOFT] 2022 인턴</code> - 코테 + 서류 탈</li>\n<li><code class=\"language-text\">[LINE] 2022 SUMMER LINE 채용 연계형 INTERNSHIP</code> - 코테 탈</li>\n<li><code class=\"language-text\">[SKT] 2022 SK텔레콤 T-WorX</code> - 코테 탈</li>\n<li><code class=\"language-text\">[NAVER] 2022 네이버 기술 직군 신입 채용 : Track_공채</code> - 코테 + 서류 합 -> 1차 면접 탈</li>\n<li><code class=\"language-text\">[프로그래머스] 2022 Dev-Matching: 웹 백엔드 개발자(상반기)-2</code> - ??</li>\n</ol>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 180.55555555555554%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAkABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAIBBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAe7s0AQoaAAD/8QAGhAAAQUBAAAAAAAAAAAAAAAAIAABEBEhMf/aAAgBAQABBQLSfsUsH//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQMBAT8BX//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQIBAT8BX//EABQQAQAAAAAAAAAAAAAAAAAAADD/2gAIAQEABj8Cf//EAB4QAAIBAwUAAAAAAAAAAAAAAAABERAxcSAhQaHw/9oACAEBAAE/IbrqMGKbJuX2JVIfmcEGxLS//9oADAMBAAIAAwAAABDjygzzz//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQMBAT8QX//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQIBAT8QX//EAB4QAAICAgIDAAAAAAAAAAAAAAERADEhcRBhQVGx/9oACAEBAAE/ELH0Gf2ID0PeYO8wlAgnwYQEGdlyoDLDq403ApqFgSdQlrO4gMCo4zx//9k='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"kakao-test.jpg\"\n        title=\"kakao-test.jpg\"\n        src=\"/static/c09b8381d3a8c97efc271c2fa6fca868/80e3c/kakao-test.jpg\"\n        srcset=\"/static/c09b8381d3a8c97efc271c2fa6fca868/4ec73/kakao-test.jpg 180w,\n/static/c09b8381d3a8c97efc271c2fa6fca868/158ba/kakao-test.jpg 360w,\n/static/c09b8381d3a8c97efc271c2fa6fca868/80e3c/kakao-test.jpg 720w,\n/static/c09b8381d3a8c97efc271c2fa6fca868/47311/kakao-test.jpg 1080w,\n/static/c09b8381d3a8c97efc271c2fa6fca868/ec605/kakao-test.jpg 1125w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>아직 4학년 1학기고 내세울만한 프로젝트 경험이 아직 없다는 것도 알고 있어서 거의 인턴 채용 위주로 코테 경험삼아 지원해봤습니다. 그리고 결과는 나름 만족이었습니다. 처음 지원하기도 했고 아직 제대로 된 경험과 포트폴리오가 준비되어 있지 않다는 사실을 알고 있어서 서류 탈락은 어느 정도 예상된 결과였습니다. 하지만 코테의 경우에는 테스트 케이스를 주지 않는 코테에서 거의 다 탈락하는 것을 보고 혼자서 엣지 케이스를 많이 만들어보며 코테 준비를 해야겠다는 생각을 하게 되었습니다,,</p>\n<p>그래도 나름 만족스러운 결과라고 생각했던 이유가 우선 카카오 코테+서류 합격이었습니다. 학기 초에 코테 준비가 잘 되어있지 않을 때 쳤던 코테인데도 만족스러운 결과가 나왔고, 서류도 합격을 해서 면접까지 경험해볼 수 있었다는 점에서 만족스러웠습니다.</p>\n<p><img src=\"/caa17e4628c84d1f2bcba06f8247ec92/kakao-interview.jpg\" alt=\"kakao-interview.JPG\"></p>\n<p>비록 면접에서는 좋은 결과를 얻진 못했지만 첫 면접이어서 면접이 어떤 식으로 진행되는지 알 수 있었고 학교 수업 때 배운 CS 지식들을 거의 다 까먹어서 아직 많이 부족하다는 것을 알 수 있었습니다… 그리고 프로젝트 관련 질문들도 처음 해봐서 정리되지 않은 상태로 대답을 많이 했는데 주로 면접관들이 원하는 것이 <code class=\"language-text\">왜 이 기술을 선택했는지</code> 라는 점과 특히 카카오가 원하는 인재상, 방향 등에 대해 알 수 있어서 많은 도움이 되었습니다.</p>\n<p>프로그래머스에서 진행한 <strong>Summer Coding</strong>에서는 코테를 통과하고, 지원했던 미리디에서 전화 면접을 진행했었는데 면접 대답을 엄청 못해서.. 떨어질 거라고 예상했었습니다. 예상대로 탈락이라는 결과를 받고 별 생각을 안하고 있었는데, 한달 뒤 쯤 추가 합격했다는 연락을 받고 놀랐습니다,,^<br>\n하지만 비대면과 숙박 지원이 안돼서 인턴 기간 동안 지낼 곳이 없다는 문제도 있고, 이것저것 고려해본 결과 미리디 인턴은 포기하고 방학동안 개인적으로 공부를 열심히 하자고 결론을 내렸습니다ㅎ,,</p>\n<hr>\n<h2 id=\"-회고\" style=\"position:relative;\"><a href=\"#-%ED%9A%8C%EA%B3%A0\" aria-label=\" 회고 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>📝 회고</h2>\n<p>이번 한학기를 돌아보면 반은 성공이고 남은 절반은 만족스럽지 않았던 것 같습니다.</p>\n<p>종프 프로젝트를 진행하면서 새로운 기술들을 많이 배운 점은 엄청 마음에 들었고, 카카오 인턴 면접 경험해보고 미리디 인턴 합격도 해보고 좋은 경험들이 많이 있었던 학기여서 이런 점은 마음에 들었습니다. 항상 원하는 방향이 공부할 땐 하고, 놀 땐 놀자라는 마인드인데 물론 이 점도 잘 충족해서 마음에 든 학기였기도 합니다ㅎ,,</p>\n<p>하지만 생각보다 바빠서 학기 초에 하고 싶었던 개인 프로젝트를 많이 진행하지 못한 점도 아쉽고, 아직 코테랑 면접도 준비해야 하는 것들이 많이 남아있다는 점에서 반쯤은 아쉽긴 합니다.. 그래도 아직 시간은 많으니 차근차근 나답게 천천히 준비해 나가야지^^</p>\n<p>이번 방학 목표는 스프링 기본기를 확실히 다지고 다음 학기에도 있을 면접들을 위해 CS 정리도 꾸준히 하면서 다음 학기 준비해볼게요 ꉂꉂ(ᵔᗜᵔ*)</p>\n<div class=\"table-of-contents\">\n<ul>\n<li>\n<p><a href=\"#-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8\">🎞 프로젝트</a></p>\n<ul>\n<li><a href=\"#%EC%A2%85%ED%94%842-carbon-tracker\">[종프2] Carbon-Tracker</a></li>\n<li><a href=\"#%EB%AA%A8%EC%95%B12-taboo-drug\">[모앱2] Taboo-Drug</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#-%EC%BD%94%ED%85%8C--%EB%A9%B4%EC%A0%91\">🎙 코테 &#x26; 면접</a></p>\n</li>\n<li>\n<p><a href=\"#-%ED%9A%8C%EA%B3%A0\">📝 회고</a></p>\n</li>\n</ul>\n</div>","excerpt":"벌써 22년도 절반이 지나가고 있고, 4학년 1학기를 마무리하며 지난 1학기를 되돌아보려 합니다. 4학년 1학기는 바쁘게 아주 빠르게 지나갔네요. 19학점을 들으면서 취업 준비를 위한 준비도 하다보니 시간 가는 줄 모를 정도였습니다^^,, 백엔드로 진로를 정하고 처음으로 프로젝트도 2개나 진행해보고, 처음으로 코테도 치고 면접 경험도 하면서 많은 경험을 할 수 있었던 학기였습니다. 🎞 프로젝트 우선, 이번 학기 프로젝트는 2개를 진행했는데 종합설계프로젝트2와 모바일앱프로그래밍2 과목을 들으면서 각각 프로젝트를 진행했습니다. [종프2] Carbon-Tracker  종프2는 작년 종프1이랑은 다르게 Elastic Stack, Kafka 등을 사용하면서 더 제대로 된 프로젝트를 할 수 있었고, 그래서 시작할 때부터 많은 기대와 흥미를 느끼며 시작했습니다. 추후에 프로젝트 회고도 올릴 예정이어서 프로젝트에 대한 자세한 설명은 거기서 하고, 아무튼 처음으로 Spring을 사용해서 다른 사람…","frontmatter":{"date":"July 13, 2022","title":"[일상] 4학년 1학기 회고","categories":"일상","author":"JFe","emoji":"🔥"},"fields":{"slug":"/daily-22-1/"}},"next":{"id":"cd77af0d-cdbf-5db6-9593-3596bb266fac","html":"<h2 id=\"2018-kakao-blind-recruitment-3차\" style=\"position:relative;\"><a href=\"#2018-kakao-blind-recruitment-3%EC%B0%A8\" aria-label=\"2018 kakao blind recruitment 3차 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>[2018 KAKAO BLIND RECRUITMENT 3차]</h2>\n<h2 id=\"문제\" style=\"position:relative;\"><a href=\"#%EB%AC%B8%EC%A0%9C\" aria-label=\"문제 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>문제</h2>\n<p><a href=\"https://programmers.co.kr/learn/courses/30/lessons/17683\">https://programmers.co.kr/learn/courses/30/lessons/17683</a></p>\n<p>라디오를 자주 듣는 네오는 라디오에서 방금 나왔던 음악이 무슨 음악인지 궁금해질 때가 많다. 그럴 때 네오는 다음 포털의 ‘방금그곡’ 서비스를 이용하곤 한다. 방금그곡에서는 TV, 라디오 등에서 나온 음악에 관해 제목 등의 정보를 제공하는 서비스이다.</p>\n<p>네오는 자신이 기억한 멜로디를 가지고 방금그곡을 이용해 음악을 찾는다. 그런데 라디오 방송에서는 한 음악을 반복해서 재생할 때도 있어서 네오가 기억하고 있는 멜로디는 음악 끝부분과 처음 부분이 이어서 재생된 멜로디일 수도 있다. 반대로, 한 음악을 중간에 끊을 경우 원본 음악에는 네오가 기억한 멜로디가 들어있다 해도 그 곡이 네오가 들은 곡이 아닐 수도 있다. 그렇기 때문에 네오는 기억한 멜로디를 재생 시간과 제공된 악보를 직접 보면서 비교하려고 한다. 다음과 같은 가정을 할 때 네오가 찾으려는 음악의 제목을 구하여라.</p>\n<ul>\n<li>방금그곡 서비스에서는 음악 제목, 재생이 시작되고 끝난 시각, 악보를 제공한다.</li>\n<li>네오가 기억한 멜로디와 악보에 사용되는 음은 C, C#, D, D#, E, F, F#, G, G#, A, A#, B 12개이다.</li>\n<li>각 음은 1분에 1개씩 재생된다. 음악은 반드시 처음부터 재생되며 음악 길이보다 재생된 시간이 길 때는 음악이 끊김 없이 처음부터 반복해서 재생된다. 음악 길이보다 재생된 시간이 짧을 때는 처음부터 재생 시간만큼만 재생된다.</li>\n<li>음악이 00:00를 넘겨서까지 재생되는 일은 없다.</li>\n<li>조건이 일치하는 음악이 여러 개일 때에는 라디오에서 재생된 시간이 제일 긴 음악 제목을 반환한다. 재생된 시간도 같을 경우 먼저 입력된 음악 제목을 반환한다.</li>\n<li>조건이 일치하는 음악이 없을 때에는 “<code class=\"language-text\">(None)</code>”을 반환한다.</li>\n</ul>\n<hr>\n<h2 id=\"입력-형식\" style=\"position:relative;\"><a href=\"#%EC%9E%85%EB%A0%A5-%ED%98%95%EC%8B%9D\" aria-label=\"입력 형식 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>입력 형식</h2>\n<p>입력으로 네오가 기억한 멜로디를 담은 문자열 <code class=\"language-text\">m</code>과 방송된 곡의 정보를 담고 있는 배열 <code class=\"language-text\">musicinfos</code>가 주어진다.</p>\n<ul>\n<li><code class=\"language-text\">m</code>은 음 <code class=\"language-text\">1</code>개 이상 <code class=\"language-text\">1439</code>개 이하로 구성되어 있다.</li>\n<li><code class=\"language-text\">musicinfos</code>는 <code class=\"language-text\">100</code>개 이하의 곡 정보를 담고 있는 배열로, 각각의 곡 정보는 음악이 시작한 시각, 끝난 시각, 음악 제목, 악보 정보가 ’<code class=\"language-text\">,</code>‘로 구분된 문자열이다.\n<ul>\n<li>음악의 시작 시각과 끝난 시각은 24시간 <code class=\"language-text\">HH:MM</code> 형식이다.</li>\n<li>음악 제목은 ’<code class=\"language-text\">,</code>’ 이외의 출력 가능한 문자로 표현된 길이 <code class=\"language-text\">1</code> 이상 <code class=\"language-text\">64</code> 이하의 문자열이다.</li>\n<li>악보 정보는 음 <code class=\"language-text\">1</code>개 이상 <code class=\"language-text\">1439</code>개 이하로 구성되어 있다.</li>\n</ul>\n</li>\n</ul>\n<hr>\n<h2 id=\"출력-형식\" style=\"position:relative;\"><a href=\"#%EC%B6%9C%EB%A0%A5-%ED%98%95%EC%8B%9D\" aria-label=\"출력 형식 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>출력 형식</h2>\n<p>조건과 일치하는 음악 제목을 출력한다.</p>\n<hr>\n<h2 id=\"예제-입출력\" style=\"position:relative;\"><a href=\"#%EC%98%88%EC%A0%9C-%EC%9E%85%EC%B6%9C%EB%A0%A5\" aria-label=\"예제 입출력 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>예제 입출력</h2>\n<table>\n<thead>\n<tr>\n<th>m</th>\n<th>musicinfos</th>\n<th>answer</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>“ABCDEFG”</td>\n<td>[“12:00,12:14,HELLO,CDEFGAB”, “13:00,13:05,WORLD,ABCDEF”]</td>\n<td>“HELLO”</td>\n</tr>\n<tr>\n<td>“CC#BCC#BCC#BCC#B”</td>\n<td>[“03:00,03:30,FOO,CC#B”, “04:00,04:08,BAR,CC#BCC#BCC#B”]</td>\n<td>“FOO”</td>\n</tr>\n<tr>\n<td>“ABC”</td>\n<td>[“12:00,12:14,HELLO,C#DEFGAB”, “13:00,13:05,WORLD,ABCDEF”]</td>\n<td>“WORLD”</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2 id=\"-algorithm\" style=\"position:relative;\"><a href=\"#-algorithm\" aria-label=\" algorithm permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🔍 Algorithm</h2>\n<p><strong>문자열</strong></p>\n<h2 id=\"-logic\" style=\"position:relative;\"><a href=\"#-logic\" aria-label=\" logic permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>💻 Logic</h2>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># '#' 들어간 음 변환</span>\n    <span class=\"token keyword\">for</span> org<span class=\"token punctuation\">,</span> rep <span class=\"token keyword\">in</span> <span class=\"token builtin\">zip</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">'A#'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'C#'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'D#'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'F#'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'G#'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'H'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'I'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'J'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'K'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'L'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        m <span class=\"token operator\">=</span> m<span class=\"token punctuation\">.</span>replace<span class=\"token punctuation\">(</span>org<span class=\"token punctuation\">,</span> rep<span class=\"token punctuation\">)</span></code></pre></div>\n<ul>\n<li><strong>’#’ 들어간 음 변환</strong><br>\n탐색 편리하게 하기 위해서 ’#’ 들어간 문자들 전부 다른 문자들로 변환</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">    <span class=\"token comment\"># time만큼 악보 정보 반복해서 message 저장</span>\n        <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            message <span class=\"token operator\">+=</span> info<span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>i<span class=\"token operator\">%</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>info<span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n    <span class=\"token comment\"># pattern이 있고, 현재 저장된 길이보다 크면 answer 변경</span>\n        <span class=\"token keyword\">if</span> pattern<span class=\"token punctuation\">.</span>search<span class=\"token punctuation\">(</span>message<span class=\"token punctuation\">)</span> <span class=\"token keyword\">and</span> length <span class=\"token operator\">&lt;</span> time<span class=\"token punctuation\">:</span>\n            answer <span class=\"token operator\">=</span> info<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span>\n            length <span class=\"token operator\">=</span> time</code></pre></div>\n<ul>\n<li><strong>time만큼 악보 정보 반복해서 message 저장</strong></li>\n<li><strong>pattern이 있고, 현재 저장된 길이보다 크면 answer 변경</strong></li>\n</ul>\n<hr>\n<h2 id=\"-code\" style=\"position:relative;\"><a href=\"#-code\" aria-label=\" code permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🧩 Code</h2>\n<details><summary>전체 코드 확인</summary>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> re\n<span class=\"token keyword\">def</span> <span class=\"token function\">solution</span><span class=\"token punctuation\">(</span>m<span class=\"token punctuation\">,</span> musicinfos<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    answer<span class=\"token punctuation\">,</span> length <span class=\"token operator\">=</span> <span class=\"token string\">\"(None)\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span>\n    <span class=\"token comment\"># '#' 들어간 음 변환</span>\n    <span class=\"token keyword\">for</span> org<span class=\"token punctuation\">,</span> rep <span class=\"token keyword\">in</span> <span class=\"token builtin\">zip</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">'A#'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'C#'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'D#'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'F#'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'G#'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'H'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'I'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'J'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'K'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'L'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        m <span class=\"token operator\">=</span> m<span class=\"token punctuation\">.</span>replace<span class=\"token punctuation\">(</span>org<span class=\"token punctuation\">,</span> rep<span class=\"token punctuation\">)</span>\n    pattern <span class=\"token operator\">=</span> re<span class=\"token punctuation\">.</span><span class=\"token builtin\">compile</span><span class=\"token punctuation\">(</span>m<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">for</span> info <span class=\"token keyword\">in</span> musicinfos<span class=\"token punctuation\">:</span>\n        info <span class=\"token operator\">=</span> info<span class=\"token punctuation\">.</span>split<span class=\"token punctuation\">(</span><span class=\"token string\">','</span><span class=\"token punctuation\">)</span>\n        info<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> info<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>split<span class=\"token punctuation\">(</span><span class=\"token string\">':'</span><span class=\"token punctuation\">)</span>\n        info<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> info<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>split<span class=\"token punctuation\">(</span><span class=\"token string\">':'</span><span class=\"token punctuation\">)</span>\n        time <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>info<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token number\">60</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>info<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>info<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token number\">60</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>info<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token comment\"># '#' 들어간 음 변환</span>\n        <span class=\"token keyword\">for</span> org<span class=\"token punctuation\">,</span> rep <span class=\"token keyword\">in</span> <span class=\"token builtin\">zip</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">'A#'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'C#'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'D#'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'F#'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'G#'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'H'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'I'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'J'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'K'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'L'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            info<span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> info<span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>replace<span class=\"token punctuation\">(</span>org<span class=\"token punctuation\">,</span> rep<span class=\"token punctuation\">)</span>\n        message <span class=\"token operator\">=</span> <span class=\"token string\">''</span>\n        <span class=\"token comment\"># time만큼 악보 정보 반복해서 message 저장</span>\n        <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            message <span class=\"token operator\">+=</span> info<span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>i<span class=\"token operator\">%</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>info<span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n        <span class=\"token comment\"># pattern이 있고, 현재 저장된 길이보다 크면 answer 변경</span>\n        <span class=\"token keyword\">if</span> pattern<span class=\"token punctuation\">.</span>search<span class=\"token punctuation\">(</span>message<span class=\"token punctuation\">)</span> <span class=\"token keyword\">and</span> length <span class=\"token operator\">&lt;</span> time<span class=\"token punctuation\">:</span>\n            answer <span class=\"token operator\">=</span> info<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span>\n            length <span class=\"token operator\">=</span> time\n    <span class=\"token keyword\">return</span> answer</code></pre></div>\n</details>\n<hr>\n<h2 id=\"-review\" style=\"position:relative;\"><a href=\"#-review\" aria-label=\" review permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>📝 Review</h2>\n<p>정규표현식 써서 해당하는 문자열이 있는지 찾으면 되는 문제.<br>\n’#‘이 들어간 부분을 계산하기 쉽게 다른 문자들로 변환해두고 푸는 것이 포인트</p>\n<div class=\"table-of-contents\">\n<ul>\n<li><a href=\"#2018-kakao-blind-recruitment-3%EC%B0%A8\">[2018 KAKAO BLIND RECRUITMENT 3차]</a></li>\n<li><a href=\"#%EB%AC%B8%EC%A0%9C\">문제</a></li>\n<li><a href=\"#%EC%9E%85%EB%A0%A5-%ED%98%95%EC%8B%9D\">입력 형식</a></li>\n<li><a href=\"#%EC%B6%9C%EB%A0%A5-%ED%98%95%EC%8B%9D\">출력 형식</a></li>\n<li><a href=\"#%EC%98%88%EC%A0%9C-%EC%9E%85%EC%B6%9C%EB%A0%A5\">예제 입출력</a></li>\n<li><a href=\"#-algorithm\">🔍 Algorithm</a></li>\n<li><a href=\"#-logic\">💻 Logic</a></li>\n<li><a href=\"#-code\">🧩 Code</a></li>\n<li><a href=\"#-review\">📝 Review</a></li>\n</ul>\n</div>","frontmatter":{"date":"May 29, 2022","title":"[Programmers] 17683번: 방금그곡 (Python)","categories":"Algorithm","author":"JFe","emoji":"💻"},"fields":{"slug":"/pg-17683/"}},"prev":{"id":"a19de102-1ba5-599b-8118-7db4c497f0fc","html":"<p>마지막 포스팅 이후 거의 세달 만에 다시 돌아왔다,,<br>\n자소서 쓰고 코테 치고 이것 저것 공부하다 보니 바빠서 블로그 관리할 생각을 못하고 있었다. 하지만 취준을 하다보니 지난 프로젝트를 되돌아보고 정리할 필요성을 느껴서 끝난지 조금 지난 프로젝트지만 늦게나마 정리해보려고 한다. (블로그도 다시 써야지)</p>\n<h2 id=\"-프로젝트-소개\" style=\"position:relative;\"><a href=\"#-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%86%8C%EA%B0%9C\" aria-label=\" 프로젝트 소개 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🎞 프로젝트 소개</h2>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 49.44444444444444%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAACRUlEQVQoz13PS2/TWACGYf//NdKskNhUM0iAZkCDUAuU0gtJ2tzs2Mc+vp3Y8bFz7DhpG2hu8CIYNsMrPZtv91mHw54ffVnfY+Yly2VLY+bstw+s1/fc3t6x3W5/2mw27HY79vv9//zYDocDXw87rFIr0mzKXNkYHdLMM0b2BZPhWxqd0i5XNE1NXdcYY9gfDvzXt19gv9tyvzLczSOsxaIkSwRRNETOEiZJwCRymWWSti6pKkOpK6qyROc5m4cv/N76YcNlGJFGPla90BSzAZE/4CqQDLIpQT5naTSmLMhzxWyWUFQlflaQz2vuVw1mkVC3De3dZ26XNdehx9i7wlrUGW72D13xGF9KQjUk0B+I1Smu+AtfXSDKF+SF5DyJOBMh3eA9veIRn6ZHhEUPpWPulgbHu8Zyg2uyPEBOX9J1RwjVQZTH3HhPOBdP8aIO7wbPuXIuSGLJxHf5e+jiTa955h3xWnboqymzQmBMjJVphRNLbN9hFl/Rmhg1DRHxJR3X4UadMHZf0hc2wyhH5R4fvCPOZcKJL3FTxbot0IWkqDysptEsFwV2IhiIS6psQGUUdTpiHHaQekA/DolCF6UkWREjxDFxOmGQ9PEKxcLMqOspVZlgrVrN55Vh0Wb8Oz4jLlwq5SCiV3xKXuBkf5JrB+G7DMc90thnIgUj6dEPT+jpI3QpiWKfKBZYx/Ypl26X995H+n6fMI04s4+5yf/ATt9wGjzmo7RJogl+0MeZdMiSMT23+/OuSkeIYIzrDfGDMd8BZ4zQHTzbH28AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"CT-main.png\"\n        title=\"CT-main.png\"\n        src=\"/static/0b9699f313a1acff2b30d243109fae42/37523/CT-main.png\"\n        srcset=\"/static/0b9699f313a1acff2b30d243109fae42/e9ff0/CT-main.png 180w,\n/static/0b9699f313a1acff2b30d243109fae42/f21e7/CT-main.png 360w,\n/static/0b9699f313a1acff2b30d243109fae42/37523/CT-main.png 720w,\n/static/0b9699f313a1acff2b30d243109fae42/302a4/CT-main.png 1080w,\n/static/0b9699f313a1acff2b30d243109fae42/07a9c/CT-main.png 1440w,\n/static/0b9699f313a1acff2b30d243109fae42/d9ed5/CT-main.png 2880w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 40.55555555555556%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABxklEQVQoz0WPyW4TURBF/Yf8DDvEF/ABrNiERcQiYsGCUcmCIEiMQyKFJB5it+eeX09+/abuA+6IUNLVVemqjm71WmdRdY1RiraxWGsxxnSutSHNKoK4YDLbMptuuBsvuRl6LDcpaSbJix3O/b/pHQ8WvP3mcXhyz+DOh9Z14V5BlFPtarSxBHFFEGzwllMW64SskFS7BFHsofIR2ntzMuHF0TXPX//i888FjX2AKW0ZTeb0z8+YzWaEqeFmNKR/e06UarZBxGB0jchLoqSgcQ9Fegefhjw7uODpqz4f+/OuYdM4lFIkoup2kUtWYUVd11hlyUtFmJQ4ayjLHVFa4v4BD4/Hjw3fn3lkuSTOJH4i8dYZUjk2ocbPA2b5b9a7CcPtlKKyNC0Y2yDyChqH2wP7tz5Hp3Pe/VhyPY2wWnfhTsTEoqIFlHZYZ7GNQVuJazXaOPJKIwrFcBqT1gahLD0pFbJ27CcTJd/vK76efsB7+YTJ/RKpIU4VX1YeV0nIKBOdJ7JG65ZQ1JxfrrnMNBeFoRcmBeN5ircWpKIkKA1X4zHJuM/KT9mERad5KFhFGcsoYx3n+HGJH5Ws/JyyqlHWUv99+Q/L8lSwrYkHLwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"CT-structure.png\"\n        title=\"CT-structure.png\"\n        src=\"/static/e62b1a4368168998beb9906760e5955c/37523/CT-structure.png\"\n        srcset=\"/static/e62b1a4368168998beb9906760e5955c/e9ff0/CT-structure.png 180w,\n/static/e62b1a4368168998beb9906760e5955c/f21e7/CT-structure.png 360w,\n/static/e62b1a4368168998beb9906760e5955c/37523/CT-structure.png 720w,\n/static/e62b1a4368168998beb9906760e5955c/302a4/CT-structure.png 1080w,\n/static/e62b1a4368168998beb9906760e5955c/07a9c/CT-structure.png 1440w,\n/static/e62b1a4368168998beb9906760e5955c/555cf/CT-structure.png 1960w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p><a href=\"https://github.com/Go-Jaecheol/Carbon-Tracker\">https://github.com/Go-Jaecheol/Carbon-Tracker</a><br>\n<strong>Carbon-Tracker</strong>는 <code class=\"language-text\">대구 주택 단지별 탄소 배출량 및 탄소 포인트 예측/시각화</code>라는 주제의 프로젝트로, 종합설계프로젝트2 과목을 수강하면서 진행한 산학 협력 프로젝트다.</p>\n<p><strong>22.03 ~ 22.06</strong> 기간 동안 4명의 팀원이 크게 <strong>React</strong>를 사용한 프론트엔드 2명 / <strong>Spring Boot</strong>를 사용한 백엔드 2명으로 나뉘어 진행했고, 그 중 백엔드 파트를 담당했다.</p>\n<p>프로젝트는 국토 교통부에서 제공하는 공공데이터 API를 활용해 데이터를 수집하고, <strong>Elastic Stack</strong>을 사용해 데이터 처리/시각화하는 과정으로 진행했다. 또한 기상청에서 제공하는 공공데이터도 활용하여 하루 탄소 배출량 예측 모델을 만들고, 이를 <strong>FastAPI</strong>를 통해 서비스를 제공해주는 과정도 진행했다.</p>\n<hr>\n<h2 id=\"-프로젝트를-통해-배운-점\" style=\"position:relative;\"><a href=\"#-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-%ED%86%B5%ED%95%B4-%EB%B0%B0%EC%9A%B4-%EC%A0%90\" aria-label=\" 프로젝트를 통해 배운 점 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>👨‍💻 프로젝트를 통해 배운 점</h2>\n<h3 id=\"-elk-stack-kafka\" style=\"position:relative;\"><a href=\"#-elk-stack-kafka\" aria-label=\" elk stack kafka permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>✅ ELK Stack‼ Kafka‼</h3>\n<p>이번 프로젝트를 통해 가장 큰 경험을 한 부분이라고 할 수 있다.<br>\n<strong>Elastic Stack</strong>과 <strong>Kafka</strong>라는 기술들에 대해 하나도 모르는 상태에서 직접 찾아보고 시행착오를 겪으면서 사용해보았다는 점에서 좋은 경험이 되었다고 생각한다.</p>\n<p>처음에는 <strong>공공데이터 API</strong>에서 받은 정보들을 <strong>csv</strong> 파일로 저장해서 <strong>Beats</strong>로 읽고 <strong>Logstash</strong>를 통해 데이터 처리 후 <strong>Elasticsearch</strong>에 보내서 데이터를 저장하도록 해야겠다고 생각하고 구현했다. 이 과정에서도 클라우드 환경이 아닌 <strong>Mac OS</strong>에 <strong>Elastic Stack</strong>을 설치하는 과정부터 제대로 정리된 글들이 많지 않아서 시간이 걸렸고, 특히 <strong>xml</strong> 형식으로 제공하는 공공데이터 API의 특성상 어떻게 데이터를 처리해야 하는지 알기 어려워 고생했어서 이 과정들을 추후 확인하고 다른 사람들에게도 공유하기 위해 블로그에 정리해뒀다.<br>\n<a href=\"https://jfelog.netlify.app/elastic-mac-install/\">[Elastic] Elastic Stack(ELK Stack) - Mac OS 설치 방법</a><br>\n<a href=\"https://jfelog.netlify.app/elastic-open-data-api/\">[Elastic] Elastic Stack + 공공데이터 api 활용</a></p>\n<p>종합설계프로젝트 과목의 특성상 다른 중소기업과 같이 연계하여 프로젝트를 진행하기 때문에 해당 기업의 요청사항에 맞게 구현해야 했는데, <strong>Elastic Stack</strong>과 <strong>Kafka</strong>의 사용 이유도 이 때문이다. <strong>Kafka</strong>를 사용해달라는 요청을 받고 어떻게 해야할지 고민하다가 문득 <strong>xml</strong>형식을 <strong>csv</strong> 파일로 변환하고, 이를 <strong>Beats</strong>가 읽어서 <strong>Logstash</strong>에서 다시 데이터 처리를 한다는 점이 불필요하다는 생각이 들었다. csv 파일 변환이 과연 필요할까..??<br>\n그래서 공공데이터 API에서 반환한 <strong>xml</strong> 데이터를 <strong>json</strong> 형태로 <strong>Kafka</strong>에 보내고, <strong>Logstash</strong>가 <strong>topic</strong>별로 데이터를 처리해서 <strong>Elasticsearch</strong>에 저장하는 방식으로 변경했다.</p>\n<div class=\"gatsby-highlight\" data-language=\"shell\"><pre class=\"language-shell\"><code class=\"language-shell\">input <span class=\"token punctuation\">{</span>\n  kafka <span class=\"token punctuation\">{</span>\n    bootstrap_servers <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token string\">\"localhost:9092\"</span>\n    group_id <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token string\">\"carbon\"</span>\n    topics <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"energy\"</span>, <span class=\"token string\">\"apt\"</span><span class=\"token punctuation\">]</span>\n    consumer_threads <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token number\">2</span>\n    decorate_events <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token boolean\">true</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\nfilter <span class=\"token punctuation\">{</span>\n  json <span class=\"token punctuation\">{</span>\n    <span class=\"token builtin class-name\">source</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token string\">\"message\"</span>\n  <span class=\"token punctuation\">}</span>\n  mutate <span class=\"token punctuation\">{</span>\n    add_field <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span><span class=\"token string\">\"[@metadata][index]\"</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token string\">\"%{[@metadata][kafka][topic]}\"</span><span class=\"token punctuation\">}</span>\n    remove_field <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"ecs\"</span>, <span class=\"token string\">\"host\"</span>, <span class=\"token string\">\"@version\"</span>, <span class=\"token string\">\"agent\"</span>, <span class=\"token string\">\"log\"</span>, <span class=\"token string\">\"tags\"</span>, <span class=\"token string\">\"input\"</span>, <span class=\"token string\">\"message\"</span><span class=\"token punctuation\">]</span>\n  <span class=\"token punctuation\">}</span>\n\n  mutate <span class=\"token punctuation\">{</span>\n    convert <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string\">\"helect\"</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token string\">\"integer\"</span>\n      <span class=\"token string\">\"hgas\"</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token string\">\"integer\"</span>\n      <span class=\"token string\">\"hwaterCool\"</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token string\">\"integer\"</span>\n    <span class=\"token punctuation\">}</span>\n    remove_field <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">[</span> <span class=\"token string\">\"@timestamp\"</span> <span class=\"token punctuation\">]</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\noutput <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">[</span>@metadata<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>kafka<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>topic<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">\"energy\"</span> <span class=\"token punctuation\">{</span>\n    elasticsearch <span class=\"token punctuation\">{</span>\n      hosts <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"http://localhost:9200\"</span><span class=\"token punctuation\">]</span>\n      index <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token string\">\"energy\"</span>\n      document_id <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token string\">\"%{kaptCode}%{date}\"</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">[</span>@metadata<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>kafka<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>topic<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">\"apt\"</span> <span class=\"token punctuation\">{</span>\n    elasticsearch <span class=\"token punctuation\">{</span>\n      hosts <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"http://localhost:9200\"</span><span class=\"token punctuation\">]</span>\n      index <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token string\">\"apt\"</span>\n      document_id <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token string\">\"%{kaptCode}\"</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    elasticsearch <span class=\"token punctuation\">{</span>\n      hosts <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"http://localhost:9200\"</span><span class=\"token punctuation\">]</span>\n      index <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token string\">\"kafka-%{[@metadata][index]}\"</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<center>[그래서 바꾼 `logstash.conf` 설정 파일]</center>  \n<p><code class=\"language-text\">input</code> 부분을 <strong>beats</strong>에서 <strong>kafka</strong>로 바꾸고, 해당 kafka 서버를 설정하고 원하는 <strong>group</strong>, <strong>topic</strong>들을 설정했다.<br>\n<code class=\"language-text\">filter</code> 설정에서 <strong>json</strong>으로 받은 message에서 원하는 필드를 추가/삭제하고, 데이터 형도 알맞게 설정했다.<br>\n처리한 데이터는 <strong>Elasticsearch</strong>로 보내야 하기 때문에 각각 <strong>topic</strong>에 맞는 <strong>index</strong>에 위치하도록 <code class=\"language-text\">output</code>을 설정했다.</p>\n<hr>\n<h3 id=\"-머신러닝과-fastapi\" style=\"position:relative;\"><a href=\"#-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D%EA%B3%BC-fastapi\" aria-label=\" 머신러닝과 fastapi permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>✅ 머신러닝과 FastAPI</h3>\n<p>프로젝트 설계 초기부터 가능하면 기상청 공공데이터 API를 통해 기상 정보를 제공 받아서 에너지 사용량을 예측해보자! 라는 의견이 나왔었고, 꼭 기한 내에 이 부분까지 완성하고 싶었다. 머신 러닝은 잘 모르지만 학교 수업 때 들은 내용들과 예전 대회에서 상 받을 때 썼던 모델들을 가지고 예측 모델을 만들어봤다.</p>\n<p>우선 에너지 사용량을 예측하기 위해 과거 날짜별 전기, 가스, 수도 사용량 데이터를 얻으려고 했는데, 여기서부터 문제가 생겼다.<br>\n수도 사용량은 과거 데이터를 제공해주지 않았고, 전기/가스 사용량도 월별 데이터만 제공해줘서 학습용 데이터가 많이 부족했다.<br>\n그래도 우선 이 데이터들과 기상청에서 제공해주는 과거 기상 정보들로 필요한 데이터들을 전처리해주고, 해당 데이터들간의 상관 관계를 비교하여 학습 데이터로 사용했다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 51.11111111111111%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAAC4ElEQVQozwXBWUzTBwDA4f+bWab1YQYdM4v6oInJppksDCw0E+VYQzpBGNlgLDNKgkKhK6UIFKVABgUKKKUUVC45KpdXRBbFyVBQQBAoLRRpBY0BMUFBYYz+9n0CrNFjNJPvmYhBlsElWTp6WRr3pGq6JCpe9QzC+kdgnZGrHWQFn6Hidx2dUfm0/JrPaKSWnogc5oYs4FpFeNzQwTWNidGCPzF6hJDkFo7qizDyPg9Fs0mGpbEF/nvDeNcgN86WcTtCQcyG/Ug2eyMReRImOoBpUzBzbddZ/zCP0J5WQ+epVFi6T3tMKnGbQ1B/GUHSjkjkO6OxXK6G5RluVdyhVnoaWuspCYzmu41eHNnii8TtEJm7onldV4drwYnQoWumyiuEUVMZt3KqqY7SUHMiB3NYHLG7Q+nNuwAvbXQ2d6P+xIMeRTrd+gaaQtNoidTSHBRLzNc/M1h0ARw2hDuFTSi3hnF6o4yHxnr418nK/ARcz+W3byW0JhfDxBTD5m6kIjGST73p19fBqoOV12O4zFqO+wTSmVoC1imErgIzGvdwlO7hPCi6iOvtJIv2ftbLFMgP+NGoMvFxzMF48wMiRL5I3fzoza1k7Y2N9xN9LBfJUYiDuaauZGnUgXCjsAmF+zGU247xt+EKa68GeDdjwdWax3EPH0pVBhasLxhu6SZAJCboMwl9BTWszPaz5HzGcn02J8T+VKaUM29xIlh1DRjcjpKw/ReeKJVwWcFqqRxmHxHgJyP5pIbpyRkWr95DLvLk8LZAhuKUcCmRtfI/wNZFkP9RMuKymbU6EUa0teRuCELu/hPxe/1J+kZM4j4vfvxeSom+kCumWv7pfcrLhruUCr6otsg4ucefhH0Hif3Kmx98ArlYXkaVoYqBx8MIz//q56a6grbMagqTizmn0pOVUkxUVDz2sSEcdjuWCTtzI9MMaGrozW3kvNaE7pwRXaaR+Ph0ZqdsTFptTDtm+B8cVh7RfBmUTQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"energy-corr.png\"\n        title=\"energy-corr.png\"\n        src=\"/static/fadc4fefbe7b206027ddea51e24c3366/37523/energy-corr.png\"\n        srcset=\"/static/fadc4fefbe7b206027ddea51e24c3366/e9ff0/energy-corr.png 180w,\n/static/fadc4fefbe7b206027ddea51e24c3366/f21e7/energy-corr.png 360w,\n/static/fadc4fefbe7b206027ddea51e24c3366/37523/energy-corr.png 720w,\n/static/fadc4fefbe7b206027ddea51e24c3366/302a4/energy-corr.png 1080w,\n/static/fadc4fefbe7b206027ddea51e24c3366/47218/energy-corr.png 1344w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>상관 관계를 비교하여 선정한 feature들로 train 데이터들을 만들고 train 데이터와 test 데이터를 나누었다.<br>\n그리고 학습에 필요한 데이터가 부족하다고 생각해서 <strong>K-Fold 교차 검증</strong>을 진행해야겠다는 생각이 들었다.<br>\n학습에는 그나마 대회에서 썼을 때 좋은 결과를 냈던 <strong>XGBoost</strong> 알고리즘으로 학습해봤고, <strong>RandomizedSearchCV</strong>로 학습에 적합한 하이퍼 파라미터를 찾아서 학습을 진행했다.</p>\n<p>결과는 만족스럽지 못했다,, 85퍼센트 정도의 정확도로 학습 데이터가 부족하기 때문에 어느정도 예상했던 결과였지만, 이상치를 더 확실하게 제거하는 등 전처리를 더 잘하거나 더 적합한 하이퍼 파라미터를 찾았다면 어땠을까 아쉬움이 남았다..</p>\n<p>예측 모델을 서빙하기 위한 프레임워크로는 <strong>FastAPI</strong>를 선택했다.<br>\n우선 기한 내에 빠르게 구현하기 위해 그래도 익숙한 웹 프레임워크 중에서 고민을 했고, 파이썬 웹 프레임워크들 중에서도 <strong>FastAPI</strong>가 <strong>Django</strong>, <strong>Flask</strong>보다 더 경량화 되고 빠르다고 최근 주목받고 있어서 선택했다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 26.111111111111107%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAh0lEQVQY06XOvQrCMBiF4dz/5bi5ujkpiIODtEiLTfqT6pcmTQp5Rb0C6wvPdoajGtNRlDVVU+Ki5l3OeTUVfWKZF/4uf56gDm3Bub0hwWO9Q1LApRn5wXcfkBhQG3Nkez9RdYZi0NQyYOYnegXjH6hdf2HfXxmcoN1I5wWbPDZO2PSbMU68AEfogxjcerT7AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"CT-FastAPI.png\"\n        title=\"CT-FastAPI.png\"\n        src=\"/static/bf2fc7986e987de503d10ba9008fe219/37523/CT-FastAPI.png\"\n        srcset=\"/static/bf2fc7986e987de503d10ba9008fe219/e9ff0/CT-FastAPI.png 180w,\n/static/bf2fc7986e987de503d10ba9008fe219/f21e7/CT-FastAPI.png 360w,\n/static/bf2fc7986e987de503d10ba9008fe219/37523/CT-FastAPI.png 720w,\n/static/bf2fc7986e987de503d10ba9008fe219/302a4/CT-FastAPI.png 1080w,\n/static/bf2fc7986e987de503d10ba9008fe219/07a9c/CT-FastAPI.png 1440w,\n/static/bf2fc7986e987de503d10ba9008fe219/92a6b/CT-FastAPI.png 2334w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p><strong>FastAPI</strong>를 사용해보고 나서 왜 이름에 <strong>Fast</strong>가 붙었는지 알 것 같았다. 구현이 빠르다. 디렉토리 구조도 간단하다. 심플하다.<br>\n파이썬 프레임워크를 처음 사용해서 패키지 버전 관리에서 살짝 버벅였지만 이는 <code class=\"language-text\">requirements.txt</code>를 이용하여 빠르게 해결했고, 코테에서 써서 익숙한 파이썬이기도 하고 전체적으로도 예측 결과만 제공해주면 됐기 때문에 큰 이슈없이 구현할 수 있었다.</p>\n<hr>\n<h3 id=\"-협업을-위한-git-convention\" style=\"position:relative;\"><a href=\"#-%ED%98%91%EC%97%85%EC%9D%84-%EC%9C%84%ED%95%9C-git-convention\" aria-label=\" 협업을 위한 git convention permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>✅ 협업을 위한 Git Convention</h3>\n<p>이전에 진행했던 프로젝트에서는 특별한 <strong>convention</strong> 없이 <strong>commit</strong>하고 <strong>push</strong>하고 프로젝트를 진행했다. 하지만 협업을 하면서 이런 규칙 없는 정리되지 않은 방식은 불편함을 느낄 수 있었고, 그래서 프로젝트 시작 전부터 미리 규칙을 정한 후 진행했다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 67.77777777777777%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAABiElEQVQ4y52S23LbIBRF/Sf1RTdLSCAESLYF8iXxJG0y/f+vWR3hTKZPtd0H3mCx9jl7sRU9Zn9B2pFK9ajxzPDzN6IPLFPBppCs8+bhs8jKDmk9q6xik9c01qN2R5rdEeECeW1YPwFd5JVBDyfSUpFVLcoFpBmxl1+410+Kxj5nmFcWaQOltBS1oe0n1BAo9gO5cSSFYpXV32ed3Y1sYuS/DVUfEINHuJFS9WSiI600iWjZlPJ+5LY/UtRdhM7Abn+mtQHR7pDdiHYTcvBs/Y5MG1ZpfQfopggsRBeB7WxpPbU9kO8cSatZJhWrpP4n7AYsDcqGaJduJbIP6MOFxnny2VreosYHxYNbnq3iDEtFezjhrh/UQ+DHbJV+LePxHt4Mc6FjbOU82r9gLu8Uqn8K9l1sofdsijpayq9iq3BFWE9W6f/oofHRLp+XYj3SebrzO/r0RlK2zwINjRkjbC62dAE9vSIPZ9JqrlL7fGTlJlZpyTLZxi130xU5vlDIIX4yX3x0ln8A5NapOLa5h/wAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"CT-issue.png\"\n        title=\"CT-issue.png\"\n        src=\"/static/a40d69604521d5d206e1d7cb8ce10b53/37523/CT-issue.png\"\n        srcset=\"/static/a40d69604521d5d206e1d7cb8ce10b53/e9ff0/CT-issue.png 180w,\n/static/a40d69604521d5d206e1d7cb8ce10b53/f21e7/CT-issue.png 360w,\n/static/a40d69604521d5d206e1d7cb8ce10b53/37523/CT-issue.png 720w,\n/static/a40d69604521d5d206e1d7cb8ce10b53/302a4/CT-issue.png 1080w,\n/static/a40d69604521d5d206e1d7cb8ce10b53/07a9c/CT-issue.png 1440w,\n/static/a40d69604521d5d206e1d7cb8ce10b53/6c86f/CT-issue.png 1720w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>우선 <strong>Github issue</strong>를 활용해 구현이 필요한 이슈 사항을 작성하고 해당하는 label을 달아서 issue를 만들었다.<br>\n이후 해당하는 <code class=\"language-text\">label/issue번호</code>로 <strong>branch</strong>를 만들어서 작업하고, [<code class=\"language-text\">#해당 issue 번호</code> <code class=\"language-text\">label</code>: 구현 내용] 형식으로 <strong>commit message</strong>를 작성하도록 했다.<br>\n<strong>push</strong> 한 후에는 <strong>Pull Request</strong>를 만들어서 협업하는 팀원이 확인할 수 있도록 했고, 확인했으면 <strong>merge</strong> 하는 방식으로 진행했다.</p>\n<hr>\n<h2 id=\"-keep\" style=\"position:relative;\"><a href=\"#-keep\" aria-label=\" keep permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🔒 Keep</h2>\n<ul>\n<li><strong>Git Convention</strong>을 정해두고 <strong>branch/issue</strong> 나누어서 협업하는 방식</li>\n<li>새로운 기술에 대한 도전 (더 많이 새로운 걸 경험해보자!)</li>\n</ul>\n<h2 id=\"-problem\" style=\"position:relative;\"><a href=\"#-problem\" aria-label=\" problem permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🚧 Problem</h2>\n<ul>\n<li>새로운 기술 겉핥기 (새로운 경험을 한다는 건 좋은 시도지만 더 파고들어보자!)</li>\n<li><strong>Spring</strong> 경험 부족 (Spring을 사용해보기 위해 처음 진행한 백엔드 프로젝트였지만 너무 다른 기술들과 인프라 쪽에 치우쳐져서 진행한 것 같다,,)</li>\n<li><strong>테스트 코드</strong> 작성 필요 (테스트 코드 작성이 주는 장점은 알고 있다. 그럼 해보자!)</li>\n</ul>\n<h2 id=\"-try\" style=\"position:relative;\"><a href=\"#-try\" aria-label=\" try permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🎯 Try</h2>\n<ul>\n<li><strong>ELK Stack</strong>, <strong>Kafka</strong>를 제대로 활용한 프로젝트를 진행해보자</li>\n<li><strong>Spring Boot</strong>를 이용한 프로젝트를 더 많이 진행해보자</li>\n<li><strong>Junit</strong>를 이용해 단위 테스트 코드를 작성하며 구현해보자</li>\n</ul>\n<div class=\"table-of-contents\">\n<ul>\n<li>\n<p><a href=\"#-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%86%8C%EA%B0%9C\">🎞 프로젝트 소개</a></p>\n</li>\n<li>\n<p><a href=\"#-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-%ED%86%B5%ED%95%B4-%EB%B0%B0%EC%9A%B4-%EC%A0%90\">👨‍💻 프로젝트를 통해 배운 점</a></p>\n<ul>\n<li><a href=\"#-elk-stack-kafka\">✅ ELK Stack‼ Kafka‼</a></li>\n<li><a href=\"#-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D%EA%B3%BC-fastapi\">✅ 머신러닝과 FastAPI</a></li>\n<li><a href=\"#-%ED%98%91%EC%97%85%EC%9D%84-%EC%9C%84%ED%95%9C-git-convention\">✅ 협업을 위한 Git Convention</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#-keep\">🔒 Keep</a></p>\n</li>\n<li>\n<p><a href=\"#-problem\">🚧 Problem</a></p>\n</li>\n<li>\n<p><a href=\"#-try\">🎯 Try</a></p>\n</li>\n</ul>\n</div>","frontmatter":{"date":"October 14, 2022","title":"[Carbon-Tracker] Carbon-Tracker 프로젝트 회고","categories":"Project","author":"JFe","emoji":"🌲"},"fields":{"slug":"/project-carbon-tracker/"}},"site":{"siteMetadata":{"siteUrl":"https://jfelog.netlify.app","comments":{"utterances":{"repo":"Go-Jaecheol/Jfe_Blog"}}}}},"pageContext":{"slug":"/daily-22-1/","nextSlug":"/pg-17683/","prevSlug":"/project-carbon-tracker/"}},
    "staticQueryHashes": ["1073350324","1956554647","2938748437"]}