<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>N01R</title>
        <link>https://velog.io/</link>
        <description>in verbs not nouns</description>
        <lastBuildDate>Sun, 25 Feb 2024 10:45:44 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. N01R. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/n01r1r_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[23 동계 모각소] 05. 최종 결과물 ]]></title>
            <link>https://velog.io/@n01r1r_/23-%EB%8F%99%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-05.-%EC%B5%9C%EC%A2%85-%EA%B2%B0%EA%B3%BC%EB%AC%BC</link>
            <guid>https://velog.io/@n01r1r_/23-%EB%8F%99%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-05.-%EC%B5%9C%EC%A2%85-%EA%B2%B0%EA%B3%BC%EB%AC%BC</guid>
            <pubDate>Sun, 25 Feb 2024 10:45:44 GMT</pubDate>
            <description><![CDATA[<h2 id="요약">요약</h2>
<ul>
<li>2/16 18:30 ~ 21:30 (원천정보관 대면 진행)</li>
<li>전원 참석</li>
</ul>
<hr>
<h2 id="내용">내용</h2>
<h3 id="전체적인-프로그램의-구조">전체적인 프로그램의 구조</h3>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/dc682f81-9d97-471b-865c-c4005d1469d5/image.png" alt="">
<a href="https://github.com/n01r1r/Sparse-Motion-Field-Tracker/">https://github.com/n01r1r/Sparse-Motion-Field-Tracker/</a></p>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/00ea86c8-cc76-406b-b55a-4b7bf0ef16b8/image.png" alt="">
처음 frame에서 ROI를 결정하고, ROI 내부에서 feature point들을 감지한다.
(ROI 내부에서의 좌표계를 영상 frame 좌표로 변환하는 과정을 추가로 거친다)</p>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/67b2f24e-914f-4651-ade5-f874d3caaed4/image.png" alt="">
앞 단계의 feature point를 대상으로 optical flow를 계산하여 sparse motion field를 얻는다. 이후 RANSAC 기법을 활용하여 inlier를 계산한다. 이 단계에서 구한 homography는 쓰이지 않는다.</p>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/3a27f12f-2a48-4d32-82d9-0c830e4c8ff3/image.png" alt="">
앞에서 계산된 최종 feature point들을 통해 ROI를 2D Rotation/Translation으로 근사한다(RotatedRect()).
소실된 order를 결정하기 위해 별도로 정의한 sortCorner를 호출하고, 이후 homography를 계산하여 overlay image를 warp하는데 사용한다.</p>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/9dd4e74c-649b-42c4-87b0-937f7b2c5fc6/image.png" alt="">
SortCorners()는 주어진 점들(cv::Point2f)이 그 중심에 대해서 어떤 방향에 있는지 결정하고, 
그에 따라 순서를 정해주는 함수이다.</p>
<h3 id="ui-추가-cvui">UI 추가 (cvui)</h3>
<p><a href="https://github.com/Dovyski/cvui">https://github.com/Dovyski/cvui</a>
<img src="https://velog.velcdn.com/images/n01r1r_/post/493ff8fe-60c6-4c76-aad9-9ee88fa73ef0/image.png" alt="">
OpenCV를 위해서 만들어진 UI 추가 라이브러리로, header-only로 추가할 수 있어서 프로젝트 이식에 용이했다. 이 프로그램에서는 영상 중간에 프로그램을 종료하는 기능과, 해당 frame에서의 feature point 개수, 그리고 마스크를 씌울지 말지 결정하는 체크박스를 추가했다.</p>
<hr>
<h2 id="아쉬웠던-점-보완할-점">아쉬웠던 점, 보완할 점</h2>
<ul>
<li><p>영상의 frame에 따라 성능이 좌우된다. 이는 최적화가 더 필요한 부분이고, 기존의 알고리즘은 비약적으로 일반화시킨 점이 있으므로 추후 더 보완해야 할 것이다.</p>
</li>
<li><p>RotatedRect()로 ROI를 1차로 근사한 뒤, 이후 Homography를 통해 2차로 근사하여 총 2회의 transformation을 통해 별도의 feature matching이나 딥러닝 등을 활용하지 않고도 충분한 성능을 낼 수 있었다. Homography를 연산하는 부분이나, ROI를 갱신하는 부분이 아직 미약하다고 생각되므로, 학술지 및 다른 프로그램에 적용된 예시를 통해 이를 더 보완할 수 있다고 생각한다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[23 동계 모각소] 04. 적절한 motion model을 도출하려면 어떻게 할까]]></title>
            <link>https://velog.io/@n01r1r_/23-%EB%8F%99%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-04.-%EC%A0%81%EC%A0%88%ED%95%9C-motion-model-%EB%8F%84%EC%B6%9C</link>
            <guid>https://velog.io/@n01r1r_/23-%EB%8F%99%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-04.-%EC%A0%81%EC%A0%88%ED%95%9C-motion-model-%EB%8F%84%EC%B6%9C</guid>
            <pubDate>Sun, 11 Feb 2024 05:01:00 GMT</pubDate>
            <description><![CDATA[<h2 id="요약">요약</h2>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/0201c5fc-a28c-41df-93af-5e2a1efacbb8/image.png" alt="">
2024/02/07 19:00~22:00 온라인 미팅 (Google Meet)</p>
<ul>
<li>지금까지 작성한 코드를 다시 살펴보고, 개선점을 논의</li>
<li>교수님과의 면담을 통해 앞으로 도입해볼 부분, 바꿀 부분을 피드백받음</li>
<li>모각소 기간 내에는 전체적인 프로그램의 흐름과, 필요한 기능이 적절히 도입되어 작동하는지의 여부는 확인 가능할 것 같음</li>
</ul>
<h2 id="의논한-내용">의논한 내용</h2>
<h3 id="1-feature-matching의-도입">1. Feature Matching의 도입</h3>
<p>원래는 real-time으로 동작하는 교통 카메라 등, camera의 motion이 없고 거의 모든 feature와 optical flow가 일정하게 감지되기 때문에 feature matching을 하지 않고도 &quot;어느 정도&quot; feature를 따라가는 것은 가능했다. 하지만 camera의 motion과 object의 motion이 동시에 일어나는 경우, affine이나 homography를 계산해 줄 필요가 있다. </p>
<h3 id="2-적절한-motion-model의-도출을-위해서-고려해야-할-것">2. 적절한 Motion Model의 도출을 위해서 고려해야 할 것</h3>
<ul>
<li><p>기존과 동일하게, dense motion field를 계산하는 것이 아닌, goodFeaturesToTrack()을 통해 감지한 feature들을 대상으로 calcOpticalFlowPyrLK()를 계산하는 sparse motion field의 방식은 유지한다.</p>
</li>
<li><p>다만 motion field로 도출하는 translation만으로는 자유도가 높은 object의 transformation에 대해 대응할 수 있는 motion model에 한계가 있다.</p>
</li>
<li><p>sparse motion field를 계산하는 시점에서, 기존에는 feature matching이 도입되지 않았으므로 이를 도입하여 더 정확한 motion field를 도출할 수 있을 것이다.</p>
</li>
<li><p>또한 대응되는 feature 사이에서도 더 정확하게 Homography를 계산할 수 있을 것이다. 이전에는 ROI와 mask의 transformation을 분리하지 않았으나, ROI의 transformation과 mask의 transformation을 별도의 단계로 계산하여 조금 더 정확도를 높여보고자 한다.</p>
<h2 id="결론">결론</h2>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/38efc504-6b43-440a-aa03-e13dbc7a29c5/image.png" alt="">
전체적인 프로그램의 흐름. 계속 수정해봐야 한다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[23 동계 모각소] 03. ROI를 지정하여 원하는 feature만 추적하기]]></title>
            <link>https://velog.io/@n01r1r_/23-%EB%8F%99%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-03.-ROI%EB%A5%BC-%EC%A7%80%EC%A0%95%ED%95%98%EC%97%AC-%EC%9B%90%ED%95%98%EB%8A%94-feature%EB%A7%8C-%EC%B6%94%EC%A0%81%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@n01r1r_/23-%EB%8F%99%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-03.-ROI%EB%A5%BC-%EC%A7%80%EC%A0%95%ED%95%98%EC%97%AC-%EC%9B%90%ED%95%98%EB%8A%94-feature%EB%A7%8C-%EC%B6%94%EC%A0%81%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 02 Feb 2024 06:41:34 GMT</pubDate>
            <description><![CDATA[<h2 id="요약">요약</h2>
<p>2024/02/01 19:00~22:00 (원천정보관)
<img src="https://velog.velcdn.com/images/n01r1r_/post/9189416b-3735-47e6-ba2c-ec0b472014c6/image.png" alt=""></p>
<h2 id="원하는-영역-추적하기">원하는 영역 추적하기</h2>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/efb6d1c2-f740-4209-96d6-8e69909a59c6/image.png" alt=""></p>
<ul>
<li>selectROI() 혹은 selectROIs()를 활용하여 ROI를 쉽게 마우스로 지정 가능하다.</li>
<li>inputArray 파라미터는 영상의 맨 처음 frame을 넣어준다.</li>
<li>return되는 cv::Rect가 바로 ROI이며 이 좌표를 통해 ROI 내부에서 감지되는 feature들도 이동시킨다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/bfe0a576-8a96-4753-8e7a-a1c4fcfbd6a9/image.png" alt=""></p>
<ul>
<li>코드 실행 영상 참조
!youtube[Z-XTyE7_UFk]</li>
</ul>
<h2 id="문제점-추가해야-할-기능">문제점, 추가해야 할 기능</h2>
<ul>
<li>소실점일 경우 feature point가 움직이지 않음. 일정 frame 이상 움직임이 없다면 소실점이거나 (아래에서 서술한) outlier라고 간주하고 제외할 필요가 있다.</li>
<li>Occlusion이나 기타 이유로 ROI가 사라졌다 다시 등장하는 경우의 처리 필요</li>
<li>depth 변화율이 클때 feature point가 &quot;튀는&quot; 경우가 발생한다. 이런 경우도 감안하여 outlier가 발생하면 이를 제외시키는 기능 필요</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[23 동계 모각소] 02. Optical Flow를 활용한 Sparse Motion Field 추적]]></title>
            <link>https://velog.io/@n01r1r_/23-%EB%8F%99%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-02.-Optical-Flow-%EC%B6%94%EC%A0%81</link>
            <guid>https://velog.io/@n01r1r_/23-%EB%8F%99%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-02.-Optical-Flow-%EC%B6%94%EC%A0%81</guid>
            <pubDate>Thu, 25 Jan 2024 12:16:22 GMT</pubDate>
            <description><![CDATA[<h2 id="요약">요약</h2>
<ul>
<li>2024년 1월 25일 18:30 ~ 21:30 (원천정보관, 전원 참석)
<img src="https://velog.velcdn.com/images/n01r1r_/post/5746649b-95a4-4b6f-9f12-5226a3d455c9/image.png" alt="">
<img src="https://velog.velcdn.com/images/n01r1r_/post/de62ab17-aecb-4b2c-9308-a987d0a7b282/image.jpg" alt=""></li>
</ul>
<h2 id="내용">내용</h2>
<h3 id="1-지난주에-했던-과제-opencv로-영상-읽고-재생하기">1. 지난주에 했던 과제: OpenCV로 영상 읽고 재생하기</h3>
<ul>
<li>OpenCV 바이너리에서 videoio~가 붙어있는 dll 파일을 프로젝트 빌드 폴더에 추가해준다.
<img src="https://velog.velcdn.com/images/n01r1r_/post/9948c9d5-07a8-41fe-9fed-a45333d68c53/image.png" alt=""></li>
<li>영상 파일 읽는 데에 사용한 예제 코드
<img src="https://velog.velcdn.com/images/n01r1r_/post/78cd989c-c42b-452b-bcc7-670cc30768b9/image.png" alt="Sparse Motion Field"></li>
</ul>
<h3 id="2-영상을-읽고-sparse-motion-field-계산해서-추적하기">2. 영상을 읽고 Sparse Motion Field 계산해서 추적하기</h3>
<p><a href="https://docs.opencv.org/4.x/d4/dee/tutorial_optical_flow.html">https://docs.opencv.org/4.x/d4/dee/tutorial_optical_flow.html</a>
<img src="https://velog.velcdn.com/images/n01r1r_/post/77ed5d7b-0e57-4f52-9f17-021775561c5c/image.png" alt=""></p>
<h4 id="2-1-cvgoodfeaturestotrack-분석">2-1) cv::goodFeaturesToTrack() 분석</h4>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/eeaa2b31-f7b1-4da6-85b2-0b348541c6db/image.png" alt=""></p>
<ul>
<li>이미지에서 분명한 corner를 찾아주는 함수</li>
<li>cv::Mat 이미지를 입력 받아서, Point2f vector에 corner의 좌표를 알려줌</li>
<li>감지할 corner의 갯수, corner 간의 minimum distance 등을 설정 가능</li>
<li>minimum eigenvalue를 사용할지, Harris detector를 사용할지 설정 가능</li>
</ul>
<h4 id="2-2-cvcalcopticalflowpyrlk-분석">2-2) cv::calcOpticalFlowPyrLK() 분석</h4>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/5e97ad96-99d9-430e-9dba-fe9111ff06bd/image.png" alt=""></p>
<ul>
<li>Optical Flow를 Lucas-Kanade method로 pyramid를 건설해서 iterative하게 적용한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/5caa3d3b-487f-4766-88ae-d21f3c9e2af4/image.png" alt=""></p>
<h2 id="결과">결과</h2>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/74476f5c-4272-4b10-afb5-697cdedeeca1/image.png" alt="">
<img src="https://velog.velcdn.com/images/n01r1r_/post/491c0d26-be50-4772-a386-2d127315c4d7/image.png" alt=""></p>
<h2 id="추후-논의">추후 논의</h2>
<h3 id="추가할-기능들">추가할 기능들</h3>
<ul>
<li>Mouse로 추적할 feature를 골라서, goodFeaturesToTrack()으로 나온 feature와 대조해서 feature와 맞으면 계속 추적하기. </li>
<li>영상마다 parameter tuning이 필요한 부분이 있으므로 어느 정도 일반적으로 적용할 수 있는 범위 한정</li>
<li>위 사진에서 볼 수 있듯이, 멀어서 거의 움직이지 않는 점들, 나무와 같은 점들도 feature로 감지되고 있기 때문에 적절한 parameter 범위를 찾아야 할 필요가 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[23 동계 모각소] 01. OT]]></title>
            <link>https://velog.io/@n01r1r_/23-%EB%8F%99%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-01.-OT</link>
            <guid>https://velog.io/@n01r1r_/23-%EB%8F%99%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-01.-OT</guid>
            <pubDate>Thu, 18 Jan 2024 13:20:56 GMT</pubDate>
            <description><![CDATA[<h4 id="모각소-팀개별-웹사이트-링크">모각소 팀/개별 웹사이트 링크</h4>
<p><a href="https://n01r1r.notion.site/23-2abcef6b17b7423cacd3b3c8e7882015?pvs=25">팀 공동 Notion</a></p>
<p><a href="https://n01r1r.notion.site/cd0e0aaf514c4d9da061f4d7bda220a6">엄채윤 개인 페이지</a>
<a href="https://n01r1r.notion.site/75240a62a9e041d7a562af79dc6e7b23">우지수 개인 페이지</a>
<a href="https://n01r1r.notion.site/52ae0a6792ea4bb89d5bc014b81c6d52">한동엽 개인 페이지</a>
<a href="https://n01r1r.notion.site/717e6e0c61d5485fbfd6ecc6950a7719">한송헌 개인 페이지</a></p>
<h4 id="20240118목-1830---2130">2024/01/18(목) 18:30 - 21:30</h4>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/bf724256-7efb-4152-aa3c-926eb1e07298/image.png" alt=""> <img src="https://velog.velcdn.com/images/n01r1r_/post/4389a70b-9105-4103-81c3-165d9f8127b9/image.png" alt=""> </p>
<h3 id="오늘-한-것들-요약">오늘 한 것들 요약</h3>
<ul>
<li>모임 일자 정하기, 일자별 진행 내용 정리</li>
<li>주제 정리, Optical Flow 복습</li>
<li>cv::VideoCapture() 사용, 웹캠 및 영상 읽어오기
<img src="https://velog.velcdn.com/images/n01r1r_/post/6885d805-455f-4cd0-bedf-779f0d3d02f8/image.png" alt="웹캠 테스트"></li>
</ul>
<h3 id="다음-회차까지-준비할-내용">다음 회차까지 준비할 내용</h3>
<ul>
<li>Windows에서 video file read가 잘 되지 않는 문제 해결</li>
<li>Track할 point를 직접 지정하는 기능 고민해보기 - OpenCV에서 mouse input 받는 방법 등</li>
<li>Motion model 계산해서 image warping까지의 전반적인 diagram 고민해보기 (계속)</li>
</ul>
<h3 id="추후-진행-일자-및-진행-내용">추후 진행 일자 및 진행 내용</h3>
<ul>
<li>01/18(목) 1회차 </li>
<li>01/25(목) 2회차</li>
<li>02/01(목) 3회차</li>
<li>02/07(수) 4회차</li>
<li>02/15(목) 5회차</li>
<li>02/22(목) 6회차(미정)</li>
</ul>
<h3 id="optical-flow-복습">Optical Flow 복습</h3>
<p><a href="http://vision.stanford.edu/teaching/cs231a_autumn1112/lecture/lecture13_optical_flow_cs231a.pdf">Stanford CS231a Computer Vision Lecture Notes</a></p>
<h3 id="앞으로-진행할-주제들">앞으로 진행할 주제들</h3>
<p>1) Real-time Object Tracking - calcOpticalFlowPyrLk() 사용
2) Motion Model을 계산해서 추적하는 물체를 중앙에 오도록 frame을 warp시키기.
3) (모각소 이후) <a href="https://www.youtube.com/watch?v=2phcFh2mQSc&amp;ab_channel=MatthieuGarrigues">Optical Flow and Point Tracking with GPU</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[2023 하계 모각소] 미팅 #5 (08/26)]]></title>
            <link>https://velog.io/@n01r1r_/2023-%ED%95%98%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-%EB%AF%B8%ED%8C%85-5-0826</link>
            <guid>https://velog.io/@n01r1r_/2023-%ED%95%98%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-%EB%AF%B8%ED%8C%85-5-0826</guid>
            <pubDate>Sun, 27 Aug 2023 03:48:04 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/n01r1r_/post/1dc8e518-a552-4734-9ce6-6b3124ce10a8/image.png" alt=""></p>
<p>2023/08/26 10:00 ~ 13:00
한동엽 개인 사정으로 결석, 이외 3명 참석</p>
<h3 id="summary">Summary</h3>
<ul>
<li><a href="https://school.programmers.co.kr/learn/courses/30/parts/12244">https://school.programmers.co.kr/learn/courses/30/parts/12244</a> (프로그래머스 Greedy 문제모음)</li>
<li>진행(공종혁), 이외 스터디원들 각자 언어로 풀이한 것 공유 및 Q&amp;A</li>
<li>최종 발표 전 각자 모각소 활동내용 정리, 향후 목표(계획 설정)</li>
</ul>
<h3 id="팀원별-최종-성과">팀원별 최종 성과</h3>
<p>공종혁</p>
<ul>
<li>프로그래머스 코딩테스트 고득점 kit 완료 (<a href="https://school.programmers.co.kr/learn/challenges?tab=algorithm_practice_kit">https://school.programmers.co.kr/learn/challenges?tab=algorithm_practice_kit</a>)</li>
</ul>
<p>강전찬</p>
<ul>
<li>&#39;HTML, CSS, JS로 만드는 스타벅스 웹사이트&#39; 강의 수강 완료</li>
</ul>
<p>남현원</p>
<ul>
<li>&#39;Django로 웹 개발하기&#39; 강좌 수강 완료</li>
<li>자료구조(C) 개념 복습 완료, 개념 심화 진행 중(1/3)</li>
<li>Github 사용법 공부 중</li>
</ul>
<p>한동엽</p>
<ul>
<li>Udemy OpenGL 강좌 수강 Lighting까지 완료 (4/5)</li>
<li>C++ 복습, STL 복습 진행 중</li>
<li>VC Lab 인턴 시작(하계방학 세미나 참석, 개인 연구주제 선정)</li>
</ul>
<h3 id="팀원별-향후-계획">팀원별 향후 계획</h3>
<p>공종혁</p>
<ul>
<li>카카오, 네이버 기출 코딩테스트 문제 풀이</li>
</ul>
<p>강전찬</p>
<ul>
<li>코딩테스트 문제풀이(JAVA), JAVA 문법 추가공부</li>
<li>React 강의 수강</li>
</ul>
<p>남현원</p>
<ul>
<li>C++ 입문, 추가적인 코딩테스트 공부</li>
<li>Django(백엔드) 개발 공부</li>
</ul>
<p>한동엽</p>
<ul>
<li>23-2 컴퓨터그래픽스/컴퓨터비젼 수강</li>
<li>OpenGL 심화, 응용 예제(Shadertoy) 분석하기</li>
<li>VC Lab 개인 연구 활동하기</li>
<li>언리얼엔진 블루프린트, 인터랙션 익히기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[2023 하계 모각소] 미팅 #4 (08/17)]]></title>
            <link>https://velog.io/@n01r1r_/2023-%ED%95%98%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-%EB%AF%B8%ED%8C%85-4-0817</link>
            <guid>https://velog.io/@n01r1r_/2023-%ED%95%98%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-%EB%AF%B8%ED%8C%85-4-0817</guid>
            <pubDate>Fri, 18 Aug 2023 01:10:29 GMT</pubDate>
            <description><![CDATA[<p>2023/08/17 14:00-17:00</p>
<h4 id="summary">Summary</h4>
<p><a href="https://school.programmers.co.kr/learn/courses/30/parts/12081">https://school.programmers.co.kr/learn/courses/30/parts/12081</a>
이번 미팅에서는 스택/큐를 활용하는 문제들을 풀이했다. 각자 일정과 휴가 등이 겹치는 바람에 조금 미뤄져서, 지난 미팅하고 텀이 길어졌기 때문에 천천히 처음부터 다같이 풀이하고 공유하는 시간을 가졌다.
이후에는 장고를 공부하고 있는 종혁과 현원이 각자 진행사항을 보여주며 현재 겪고 있는 문제를 알려주었다.</p>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/b340ca14-6bd3-4768-a5f9-76ba9dd1ac65/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/dec8cf56-1ad8-4855-ae41-4a36df9a191c/image.png" alt=""></p>
<p>짚고 넘어갈 문제 몇 개만 공유하면,</p>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/12909">https://school.programmers.co.kr/learn/courses/30/lessons/12909</a> (올바른 괄호)
자료구조 수업 시간에 스택을 배우면서 예제로 한 번씩은 접했을 전형적인 문제였다.</p>
<pre><code class="language-c++">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;stack&gt;
#include &lt;vector&gt;

using namespace std;

bool solution(string s)
{
    bool answer = true;
    stack&lt;char&gt; STK;

    for(int i = 0; i &lt; s.size(); i++)
    {
        if(s[i] == &#39;(&#39;)
            STK.push(&#39;(&#39;);
        else
        {
            if(!STK.empty() &amp;&amp; STK.top() == &#39;(&#39;)
                STK.pop();
            else
                STK.push(&#39;)&#39;);  
        }
    }
    if(STK.empty()) return true;
    else return false;
}</code></pre>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/42587">https://school.programmers.co.kr/learn/courses/30/lessons/42587</a> (프로세스)
큐를 활용하는 문제로, 우선순위가 있는 데이터이지만 우선순위 큐로 동작하지는 않는다는 점을 감안해서 작성한다. C++의 경우 queue 컨테이너를 도입하는 풀이도 있고, vector만 사용하는 풀이도 있었다.</p>
<pre><code class="language-c++">#include &lt;algorithm&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

using namespace std;

int solution(vector&lt;int&gt; priorities, int location){
    int answer = 0;
    int max = *max_element(priorities.begin(), priorities.end());
    while(true){
        for(int i=0; i&lt;priorities.size(); i++){
            if(prioirties[i]==max){
                answer++;
                if(i==location) return answer;
                priorities[i]=0;
                *max_element(priorities.begin(), priorities.end());
            }
        }
    }
}</code></pre>
<p>위 풀이가 인상깊었던 것은, algorithm의 max_element를 사용해서 정렬하거나 별도 처리 없이 바로 우선순위가 제일 높은 값을 도출할 수 있다는 것이었다. 이와 같이 언어마다 지원하는 함수들이 무엇이 있는지 알면, 도움이 될 것 같기 때문에 공부해 봐도 좋을 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[2023 하계 모각소] 미팅 #3 (08/05)]]></title>
            <link>https://velog.io/@n01r1r_/2023-%ED%95%98%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-%EB%AF%B8%ED%8C%85-3-0805</link>
            <guid>https://velog.io/@n01r1r_/2023-%ED%95%98%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-%EB%AF%B8%ED%8C%85-3-0805</guid>
            <pubDate>Mon, 07 Aug 2023 04:48:03 GMT</pubDate>
            <description><![CDATA[<p>2023/08/05 14:00 ~ 17:00
-** Summary**
    생각보다 해시 문제임에도 불구하고 구현해야 하는 풀이가 복잡하지 않아서 해시 대신 정렬로 주로 풀었으며, 파이썬과 C++의 풀이를 대조하면서 파이썬의 함수와 C++에서 동일한 기능을 하는 STL들이 무엇이 있는지 비교해 보았다.</p>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/b9a00f96-01a7-4a9a-aef6-d564d2d831e0/image.png" alt=""></p>
<p>오늘은 사전에 준비한 해시/해시맵을 활용하여 풀 수 있는 문제들을 같이 풀어보았다.
<a href="https://school.programmers.co.kr/learn/courses/30/parts/12077">https://school.programmers.co.kr/learn/courses/30/parts/12077</a></p>
<ol>
<li>폰켓몬 문제 (<a href="https://school.programmers.co.kr/learn/courses/30/lessons/1845">https://school.programmers.co.kr/learn/courses/30/lessons/1845</a>)</li>
</ol>
<p>C++을 연습하기 시작한 동엽의 풀이와 파이썬으로 푸는 종혁의 풀이를 주로 대조하면서 풀었다.</p>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/cce494ba-7e4e-4c84-b362-cb14ec9d4cb7/image.png" alt="">
<img src="https://velog.velcdn.com/images/n01r1r_/post/6784b785-c300-45ec-bb45-aa6da1f972ed/image.png" alt="">
사고의 과정은 동일하게, 주어진 input의 절반과, 총 종류의 개수 중 작은 쪽이 답이 되므로 둘 중에 작게 나오는 값을 return하면 되는 문제이다.
Python에서 set()으로 사용하는 것과 동일하게 C++에서도 set 컨테이너를 사용하여 구현한 것을 볼 수 있었다.</p>
<ol start="2">
<li>완주하지 못한 선수 (<a href="https://school.programmers.co.kr/learn/courses/30/lessons/42576">https://school.programmers.co.kr/learn/courses/30/lessons/42576</a>)
<img src="https://velog.velcdn.com/images/n01r1r_/post/d936334d-49c3-433b-9cde-5b46adc1d16b/image.png" alt="">
문제를 풀면서 느낀 것은, HashMap을 적용할 수 있는 문제라는 것을 이해하지만 굳이 해쉬맵을 구현하지 않고 sorting만으로도 결과를 도출할 수 있었다는 것이다. 이 이후에 나오는 문제들도 대부분 sorting을 적절히(루프를 최대한 줄이는 등등) 사용하여 풀 수 있는 문제였다.
<img src="https://velog.velcdn.com/images/n01r1r_/post/33cd7ba0-4059-4ba2-8e2d-ce9342d9093c/image.png" alt="">
Python과 C++ 모두, participant와 completion을 비교해서 없는 부분(빈 부분, 즉 완주하지 못한 선수)을 찾아 return하는 문제였다.</li>
</ol>
<p>3번 이후의 문제는 제대로 풀이한 팀원들이 없어서, 우선 모범 답안과 종혁이 풀이했던 과정으로 설명을 듣고 다시 복습해 본 후, 다음 미팅 이전까지 각자 코드(구현이 안되면 알고리즘 정도까지)를 공유해서 비교해보는 것으로 하였다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[2023 하계 모각소] 미팅 #2 (07//29)]]></title>
            <link>https://velog.io/@n01r1r_/2023-%ED%95%98%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-%EB%AF%B8%ED%8C%85-2-0729</link>
            <guid>https://velog.io/@n01r1r_/2023-%ED%95%98%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-%EB%AF%B8%ED%8C%85-2-0729</guid>
            <pubDate>Sat, 29 Jul 2023 13:25:38 GMT</pubDate>
            <description><![CDATA[<h4 id="20230729-2000--2300">2023/07/29 20:00 ~ 23:00</h4>
<h4 id="meeting-summary">Meeting Summary</h4>
<p>사전에 선별한 프로그래머스 Lv.1 ~ Lv.2 문제들 총 5문제를 선별하고 미리 풀어왔다.
#1. <a href="https://school.programmers.co.kr/learn/courses/30/lessons/17687">https://school.programmers.co.kr/learn/courses/30/lessons/17687</a>
#2. <a href="https://school.programmers.co.kr/learn/courses/30/lessons/12973">https://school.programmers.co.kr/learn/courses/30/lessons/12973</a>
#3. <a href="https://school.programmers.co.kr/learn/courses/30/lessons/42888">https://school.programmers.co.kr/learn/courses/30/lessons/42888</a>
#4. <a href="https://school.programmers.co.kr/learn/courses/30/lessons/17684">https://school.programmers.co.kr/learn/courses/30/lessons/17684</a>
#5. <a href="https://school.programmers.co.kr/learn/courses/30/lessons/92342">https://school.programmers.co.kr/learn/courses/30/lessons/92342</a></p>
<p>특히 애먹은 문제들은 #4, #5로 모두 카카오 기출문제였다.
#4는 구현하는 과정에 비해 입출력 흐름을 파악하고 이해하는 데 오래 걸렸고,
#5는 문제를 이해하는 것은 다소 쉬웠으나, 예외 사항이나 조건이 붙은 것 때문에 구현하는 과정에 더 많은 시간을 할애하였다.</p>
<p>#3까지는 무난하게 풀이해왔고 서로의 풀이 방법 공유와 접근 방법의 차이에 대해서 비교해보았다. </p>
<p>이때 #2. 문제에서 동엽이는 특이 case를 우선적으로 처리한 이후에 일반적인 case를 처리하였는데, 종혁이는 예외처리를 굳이 해야 하는 경우가 아니면 하지 않는다고 했다. 그래서 예외처리를 제외하고 보니 둘 모두 구현한 코드는 같아서, 서로의 runtime이 유의미한 차이를 갖는지 궁금하여 비교하였으나 (일부 특이 케이스를 제외하고) 거의 유사한 실행 시간이 나왔다. 아마 for문이 하나만 있고 연산 횟수가 동일해서 그런 것으로 생각된다.
<img src="https://velog.velcdn.com/images/n01r1r_/post/19bada94-535d-44a7-95bf-f7659c67f348/image.png" alt="">
동엽이의 코드 경우 테스트 6번에서 실행시간이 높아진 것을 볼 수 있었는데 해당 테스트가 어떤 입력인지 알 수 없어서 더 자세한 분석은 불가했다. </p>
<h4 id="what-we-learned-today">What we learned today</h4>
<p>&quot;탐색&quot;을 요하는 문제들에 대해서 사용할 수 있는 DFS와 BFS의 구현에 대해서 정리해보았다.
DFS와 BFS를 구현할 때에, DFS는 스택이나 재귀함수를 사용하고, BFS는 큐를 사용한다.</p>
<ul>
<li>DFS의 stack 구현 과정<ul>
<li>1) 탐색 시작 노드를 stack에 삽입하고 visited로 처리
stack의 top에서,</li>
<li>2-1) not_visited인 인접 노드가 있는 경우 stack에 삽입하고 방문 처리, 없는 경우 최단 노드를 pop한다.</li>
<li>3) 2)가 불가능할 때까지 반복한다.</li>
</ul>
</li>
</ul>
<ul>
<li>BFS의 queue 구현 과정<ul>
<li>1) 탐색 시작 노드를 queue에 삽입하고 visited로 처리<ul>
<li>2) queue에서 노드를 pop한 후, 인접 노드 중 not_visited인 노드를 모두 집어넣고 visited로 변경한다.</li>
</ul>
</li>
<li>3) 2)가 불가능할 때까지 반복한다.</li>
</ul>
</li>
</ul>
<p>보통 기본적인 자료구조로는 위와 같이 표현을 하지만, 
구현이나 확장성(입출력 처리 등)을 고려해서 DFS를 재귀함수로 구현하는 경우가 많다.
<strong>재귀함수는 사용할 때 종료 조건을 명시해줘야 무한 루프에 빠지지 않고 사용 가능하다.</strong>
(스택과 재귀함수 모두 LIFO(Last-In-First-Out)이므로 구조적으로 동일하다)</p>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/a9598084-b381-4a4c-be01-4a49f018d1cd/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/77b24e34-fc43-487f-a2b4-907d67734249/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/1a940c2a-e6f5-4d4b-bc37-6ed1057528e2/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[2023 하계 모각소] 미팅 #1 (07/22)]]></title>
            <link>https://velog.io/@n01r1r_/2023-%ED%95%98%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-%EB%AF%B8%ED%8C%85-1-0722</link>
            <guid>https://velog.io/@n01r1r_/2023-%ED%95%98%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-%EB%AF%B8%ED%8C%85-1-0722</guid>
            <pubDate>Sat, 22 Jul 2023 14:41:03 GMT</pubDate>
            <description><![CDATA[<h4 id="20230722-2000--2300-온라인-미팅google-meets-진행">2023/07/22 20:00 ~ 23:00, 온라인 미팅(Google Meets) 진행</h4>
<h5 id="미팅에서-이야기한-것들의-요약-앞으로의-모각소-진행-방향">미팅에서 이야기한 것들의 요약, 앞으로의 모각소 진행 방향</h5>
<ul>
<li><p>오늘은 첫 미팅이라 앞으로 미팅 때 무엇을 해야할 지 의논하였다.
평소 공부하는 분야가 서로 다르고, 사용하는 주 언어가 달라 각자 공부하는 내용은 짧게 공유하는 것으로 하였다. 코딩테스트 문제풀이는 앞서 말한 이유 때문에 다같이 공부하고 푸는 방식은 맞지 않다고 판단하였다. 그러나 모두 코테 문제풀이의 필요성은 공감하고 있었고, 종혁, 현원이 형이 평소에 코테 공부를 하고 있었기 때문에 미팅 때 미리 풀어서 선별한 문제들을 같이 풀고 해설해주는 시간을 갖는 것으로 정하였다.</p>
</li>
<li><p>이외에 전찬이는 프론트엔드를 계속 공부 중이었고, 나 또한 OpenGL 공부를 계속 했기 떄문에 격주/격회로 설명하는 시간을 갖고, 평소 노션에 공부하는 내용을 정리해 두는 것으로 하였다. </p>
</li>
<li><p>초기에는 다같이 웹 공부 +개인 공부를 해서, 프론트 2 + 백 2로 정해 웹앱 결과물을 구현하는 것을 목표로 삼았으나, 실제로 공부해보니 조금 방향을 수정할 필요성을 느꼈다. 이후 미팅을 주에 2회로 진행하면서 이대로 공부하는 것이 괜찮다고 생각이 들면 지속적으로 유지하고 팀 단위로 웹앱 결과물을 내는 것을 보류/취소하려고 한다.</p>
</li>
<li><p>이후 종혁/현원 2명이서 번갈아 가면서 코테 공부한 내용들 중 쉬운 문제와 어려운 문제를 적절히 섞어서 풀이와 해설 시간을 갖고, 서로 언어가 다르기 때문에 접근 방법, 풀이 과정만 설명하면서 피드백을 하는 것으로 정했다. </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/n01r1r_/post/fc258d5a-bfce-4e91-8f73-18034a1a113b/image.png" alt="">
<img src="https://velog.velcdn.com/images/n01r1r_/post/8157e72e-e777-40fa-bbc6-e11c8f45deea/image.png" alt="">
<img src="https://velog.velcdn.com/images/n01r1r_/post/93eedd99-4654-4ae2-abde-3a28779625c8/image.png" alt="">
<img src="https://velog.velcdn.com/images/n01r1r_/post/f1deebcf-55c6-4647-b746-10ec9241395b/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[2023 하계 모각소] 팀 소개, 간략한 활동 계획]]></title>
            <link>https://velog.io/@n01r1r_/2023-%ED%95%98%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-%ED%8C%80-%EC%86%8C%EA%B0%9C-%EB%B0%8F-%EA%B0%84%EB%9E%B5%ED%95%9C-%ED%99%9C%EB%8F%99%EA%B3%84%ED%9A%8D</link>
            <guid>https://velog.io/@n01r1r_/2023-%ED%95%98%EA%B3%84-%EB%AA%A8%EA%B0%81%EC%86%8C-%ED%8C%80-%EC%86%8C%EA%B0%9C-%EB%B0%8F-%EA%B0%84%EB%9E%B5%ED%95%9C-%ED%99%9C%EB%8F%99%EA%B3%84%ED%9A%8D</guid>
            <pubDate>Sat, 22 Jul 2023 10:36:42 GMT</pubDate>
            <description><![CDATA[<h3 id="team-시작은-미약하지만-끝은-창대하리라">TEAM 시작은 미약하지만 끝은 창대하리라</h3>
<ul>
<li><p><strong>소프트웨어학과 20 공종혁</strong> </p>
<ul>
<li><a href="https://github.com/gongjong/programmers_Algorithm_level2/tree/main">https://github.com/gongjong/programmers_Algorithm_level2/tree/main</a></li>
<li>백엔드(Django) / 코딩테스트 준비(Python)   </li>
</ul>
</li>
<li><p>*<em>소프트웨어학과 20 강전찬 *</em></p>
<ul>
<li><a href="https://n01r1r.notion.site/f6951fb97f924802832cc49e2ef3be6c">https://n01r1r.notion.site/f6951fb97f924802832cc49e2ef3be6c</a></li>
<li>웹 개발 기초, 프론트엔드</li>
</ul>
</li>
<li><p>*<em>소프트웨어학과 20 남현원 *</em></p>
<ul>
<li><a href="https://n01r1r.notion.site/c02022297c1f4f17a042670d14566106">https://n01r1r.notion.site/c02022297c1f4f17a042670d14566106</a></li>
<li><em>웹*</em>: Django 공부를 위한 python 공부 / Django 웹 개발</li>
</ul>
</li>
<li><ul>
<li>코테 준비<strong>: 백준알고리즘 / 자료구조 복습 / c언어 기반 알고리즘 공부(삼성 소프트웨어 아카데미)
**전공 공부</strong>: 운영체제 공룡책 (인프런 무료강의) / 리눅스</li>
</ul>
</li>
<li><p>*<em>소프트웨어학과 20 한동엽 *</em></p>
<ul>
<li><a href="https://n01r1r.notion.site/6c7996717b4b41b3a050c835086bb9d5">https://n01r1r.notion.site/6c7996717b4b41b3a050c835086bb9d5</a></li>
<li>그래픽스 공부(OpenGL) <ul>
<li>랩실  인턴, 세미나 리뷰 -&gt; 모르는 개념/분야 위주 정리</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="팀-미팅-계획">팀 미팅 계획</h3>
<ul>
<li>1차: 2023/07/22 (완료)</li>
<li>2차: 2023/07/29 (완료)</li>
<li>3차: 2023/08/05 (완료)</li>
<li>4차: 2023/08/17</li>
<li>5차: 2023/08/26 </li>
</ul>
]]></description>
        </item>
    </channel>
</rss>