<Week02 발제>
- 재귀에 대하여
: 고등 수학의 수열을 공부할 때, 점화식을 세우는 것과 비슷하다. Base case는 점화식의 초항과 연관하여 생각하면 좋다.
- 모든 문제에 대해서 브루트 포스로 풀이를 할 줄 알아야한다. 보다 효율적인 알고리즘으로 풀이할 방법이 떠오르지 않는다면, 브루트 포스로 풀 수 있어야 한다는 것이다.
- 2주차부터는 시간 복잡도가 훨씬 중요해질 것이다. 선형 시간이나, nlogn 정도의 시간만 걸리도록 짜야할 듯하다. (max)
- 소프트웨어 개발자로서 '무한루프'가 포함되는 코드를 짜는 것은 좋은 습관이 아니다. 최대한 지양하는 연습을 해야될 듯 하다. (어떠한 프로그램이든, 무한루프를 포함하지 않아도 프로그램을 짜낼 수 있다는 증명이 있다고 한다. <- 사실 3학년 때, C프로그래밍 수업이었나... 들어본 적 있는 것 같다.)
<알고리즘 2주차>
- 분할정복
- 이분탐색
- 스택
- 큐
- 우선순위 큐
3.9(목)
* 팀적 계획 세우기 O
* 밀린 W01 CSAPP 읽기 (~1.4) O
* 시험 틀린 문제 풀기 O => 직접 해결 못함...
* 자료구조 공부! (큐, 스택, 힙큐 등) / 분할정복, 이분 탐색 등 이번 주차 이론들 전반적으로 공부하고 정리해보기 => 이진탐색, 분할정복만 공부함 / 자료구조는 못함
* 시간되면 문제 풀이 시작하기! O
===>
- W01 세 문제 중, 두 문제 맞췄다. 첫 번째 문제는 그 자체로 간단한 편이어서 생각이 가는 대로 코드를 짰더니 정답 처리 되었다. 뒤에 시간 뺏길 것을 염려해 일단 대충 넘어갔다. 두 번째 문제는 백트래킹으로 푸는 방법도 떠올랐지만, itertools 라이브러리를 이용해 간단하게 풀이를 하여, 두 문제를 빠르게(10분?) 풀 수 있었다.
- 세 번째 문제는... 결국 못 풀었다. 사실 완전히 탐색하는 방법으로 생각보다 여러가지 방법이 이론적으로는 가능할 것 같다. 여러 방법을 생각해봤는데, 내 코드는 컴퓨터를 노가다 시키는 것이 아닌,, 내 손이... 코드를 노가다로 작성해야 하는 방법이었다.(가능한 지도 모르겠다.) 결국 포기했다. 다음엔 더 잘 풀어보자.
- 이진 탐색은 작년에 공부했을 때도 그렇고 비교적 입문 자체가 어렵게 느껴지진 않는다. 다른 알고리즘과 섞인 문제가 나온다면 말이 다르겠지만...
- 이진 탐색은 시간 복잡도 때문에 계속 발목 잡힐 것 같다. 시간 복잡도에 대한 더 분명한 이해를 해야할 듯 하다. -> 이 부분은 chatGPT를 잘 활용하면 경험적으로 익히기 좋지 않을까 한다.
- 분할 정복은 W01 Z 문제가 떠오르며 벽이 느껴진다. 색종이는 내일 만들어봐야겠다.
- 새 팀이 편성되었다. 한 분은 대화를 많이 해본 분이고, 한 분은 완전히 처음인 분이다.(사실 미니 플젝 발표를 잘 하셔서 인상 깊게 본 분이긴하다.) 지난 주 보다는 좀 더 미팅도 많이 가지고, 논의하면서 풀이를 하면 좋을 것 같다 생각했고, 나머지 분들도 같은 생각이셨다. 조금 더 세밀하게 계획하고, 개념과 문제에 접근해야겠다.
- 며칠 전부터 굉장히 마려웠던 덕복희를 먹었다. 존나 얼큰하다. 오랜만에 소주 마려웠다.(옆 테이블에서 먹더라...)
- chatGPT 처음 써봤다. 일단 진짜 신기하고, 개발자들 등의 AI 대체와 같은 위기감이 왜 생기는 지 직접 느껴지긴 했다. 코치님이 말씀하신 것처럼 '잘 이용하면' 좋은 도구가 될 수 있을 것이다. 여태 배제해왔는데, 사용을 잘 해보는 연습도 하면 요긴할 듯하다.
3.10(금)
* 아침에 전날 못 만들었던 색종이 만들기 O => 풀이 찾아봐버림!
* 오전 중에, 스택 / 큐 / 우선순위 큐 개념 공부하고, 정리할 수 있으면 하자 O
* 스택 / 큐 / 우선순위 큐 : '하' 문제 풀이 O
* 팀원 미팅 : W02 개념들 + '하' 문제들 논의, 정리 O => 스택의 '하'까지만 하기로 합의 보고, 미팅 가졌음
* 낮은 수준의 이진 탐색 / 분할 정복 문제들 더 찾고, 팀시트 올리고, 풀어보기 X
* 시간되면 csapp ~1.7 읽기 X
===>
- 괄호의 값을 찾지 못해 오후 시간대를 다 날려버렸다. 애매하게 알 것 같은 문제들에 대한 대처법은 특별한게 없을 것 같다. 그래도 2~3시간 이상을 넘기진 말자.
- BOJ 티어 골드5를 드디어 달성했다. 별 의미가 없긴 하다만,, 기분이 좋기는 하다. 하지만, 나는 물 골드다. 진짜배기 골드가 되어보자.
- chatGPT는 아무튼 갱장히 신기하다.
3.11(토)
* 아침 : 괄호 값 풀이 부터! O => 답 봤음
* 이분탐색 '중' 문제들 모두 풀기 / '상' 문제도 도전! O => '상' 문제는 다음 기회에...
* 팀원 미팅 : 큐 / 우선순위 큐 - '하' 문제들 & 이분 탐색 - '중', '상' 코드 리뷰 X => 모두 똑같이 어려움을 겪어서 코드 리뷰를 월요일로 미뤘다.
* (추가) 이분탐색 문제 더 찾고, 시트 올리고, 풀어보기 O (3문제 밖에 안풀긴 했다.)
* csapp ~1.7 읽기 X
===>
- 이분 탐색 할만 할 줄 알았는데, 그냥 혼구녕이 나버렸다. 하루 종일 이분 탐색 '중' 세 문제 로테이션 돌렸다. 다행히 한 문제는 비교적 빠른(?) 시간에 풀이가 되었다.
- 이분 탐색 문제의 첫 번째 생각할 것은 start와 end를 어떻게 설정할 지를 결정하는 것인 듯 하다. 물론 그 설정을 잘 해도 그것부터 시작이다. 존나 어렵다.
- 히오스 문제 일반적인 입력 예시들은 결과값이 잘 나오는데, 백준 OJ에서는 틀렸다고 나오는 이슈가 있었다. 현재 레벨에 같은 값이 들어가면 올바른 결과를 출력하지 못하는 반례가 존재한다는 것까지는 잘 찾았다. 하지만, 반례를 없애는 코드 수정에 대한 깊은 고민을 하지 못하고, GPT의 도움을 받았다. 지피티가 수정해준 코드는 읽지 않고, 설명만 읽어보았고, 결국 내 코드에서 한 줄만 삭제하여 정답 판정을 받았다. 조금 경계해서 쓸 필요가 있을 것 같다! (이건 내가 푼 게 아니야......)
- 늦잠 잤다. 1시간만 더 잔다는게 3시간을 더 잤다. 저번 주에 이렇게 늦잠을 잤을 때는 자괴감이 많이 들었는데, 오늘은 그렇지 않다. 역시 처음이 어렵다. 그러지 말자.
- 광세족발 야들야들한게 꼬소하이 개맛있다. 여기는 아마도 주말에 가는 것이 좋을 듯하다. 평일엔 웨이팅이 빡셀 듯?
3.12(일)
* 괄호의 값 다시보기 O => 자료구조를 일일이 그려가며 코드를 분석해봤다. 다음에 풀 땐, 스스로 풀어보자.
* 이분 탐색 '중' 삼총사 다시 풀기 O => 공유기 설치: 마무리를 짓지 못함 / 나머지 둘은 good(외운 느낌보다 이해한 느낌이 큰 듯?)
* 이분 탐색 추가 문제(실버 상위 문제들) 찾아서 시트 올리고, 풀기
* 색종이 다시 만들어보기 O => 스스로 못 풀어서, 전에 올려둔 내 코드를 분석하며 다시 풀어봄
* 분할 정복 '중' 문제들 풀이 △ => 행렬 제곱은 도저히 하기 싫었다. (미루기)
* 스택 '중' 문제들 풀이 X => 시도는 했지만, 첫 문제부터 3시간동안 풀리지 않는다. '출력 초과' 에러는 처음 받아본다. 반례 찾으려다보니, 애초에 잘못 구현된 것을 알게 되었다.
* csapp ~1.7 읽기 O
===>
- 2차원 배열, 쿼드 트리 형태의 응용 문제만 나오면 감을 아예 못 잡는 것 같다. 공간 지각 능력이 부족한 건가...? 학부 때도 2차원 배열에서 규칙성 있게 숫자 넣는 문제 같은 것 나오면 꽤 힘들어했었던 것 같다. 특훈이 필요하다.
- 부모님 오심. 수육전골 개맛있다. 내추럴 본 허약 체질인 내게 항상 약 같은 것을 먹이려 하신다. 임팩타민,,, 열심히 먹어봐야겠다.
- 일요일인 점, 부모님이긴 하지만 약속이 있었다는 점, 그냥 피로누적 등의 온갖 이유로 집중력도 안 좋고, 공부 자체가 잘 안되는 하루였던 듯 하다. 힘들 때는 30분 정도라도(1시간 이상이긴 했다.) 기숙사에서 누워있는 것도 좋을 듯하다.
3.13(월)
### 팀 코드리뷰 미팅 (괄호의 값 + 이분 탐색 '중' + 분할 정복 '중' + 스택 '중' == 1 + 3 + 2 + 2 == 8문제) O => 다음 날에 문제 하나씩 정해서(적당히 설명할 거리가 있고, 본인 제외가 고전했던 문제 위주로 선정) 본인의 접근법, 아이디어, 코드 등을 발표하는 시간을 가져보기로 함
* '크게 만들기'부터 풀고, '탑'으로 다시 돌아와서 풀이 O => 봐버렸다.
* '행렬 제곱' 풀이 O => 역시 봤다. 풀이에 대한 설명을 최소 5번 정도는 읽어본 것 같다. 그제서야 알 것도 같기도,,,
* 큐 '중' 풀이 X
* 우선순위 큐 '중' 풀이 O
===>
- 팀 스프레드 시트가 노란색 파티가 되어가고 있다.
- 분할 정복을 정복할 수가 없다. 분할 정복을 분할하여 정복하도록 해보자,,
- 알고리즘 풀이를 하면서 지난 약 10년 간 문과생으로 살아온 환경적 한계를 느낀다. (태생적 한계도 있을 순 있지만, 여전히 이 부분은 많지는 않다고 생각한다.) 문과라서 배울 수 없는 수학적 개념 같은 것이 등장해서 어려운 것이 아닌, 정글 모집 시에 강조하던 이공계적 마인드와 같은 것이 어떤 부분인 지 간접적으로 느껴지는 것이다. 말로 표현하기 어렵지만, 공학적 인간으로 살아온 다른 분들의 풀이나 문제 접근 방식 등을 보며 많은 것을 느낀다. 이과 갈 걸.
- 하루 종일 문제들이 명쾌하게 풀리는 것이 없어(일명 '거절의 알고리즘') 괴로워하다가, 마지막에 푼 골드4 문제가 처음 떠올린 아이디어로 명쾌하게 풀려 기분 좋게 기숙사로 향할 수 있었다. (무려 9시 출근 2시 30분 퇴근)
- 저녁 이후, 어떠한 계기로, 미친듯이 소주 생각이 나버렸다. 회식 때, 서로를 알아봐버렸던 형을 찾아가 고충을 털어놓았다.(회에 소주 한잔 마렵다!고 말했다.) 이 형을 마주칠 때마다 술 얘기를 하고 있다. 일단은 참아보자. 정글의 환경적 특성 상, 참는 것이 대단히 어렵지는 않다. 새벽 2시에 갑자기 방어 대꼴이 와서 노량진에 회 뜨러 갔던 기억이 떠올랐다.(존나 맛있었는데...)
3.14(화)
### 팀 미팅 문제 하나씩 발표 / 큐 '중' + 우선순위 큐 '중' + 이분 탐색 '상' + 분할 정복 '상' == 1 + 3 + 1 + 1 == 6문제 O => 남은 문제들이 본인이 해결할 수 없을 정도로 너무너무너무 어려워서 코드 리뷰는 간단하게 할 수 있는 수준으로 진행. 발표 시간은 좋았음
* 남은 '상' 문제 4개 / '중' 문제 2개 해결하기 O => 사냥꾼 문제 정도 제외하면, 사실 상 제출만.
* 이분 탐색 추가 문제 풀이, 시트 리스트업 O
===>
- 플레 문제는 확실히 다르다. 골드 상위 티어의 문제만 해도 접근부터 애를 먹는데, 플레 문제는 설명과 정답을 봐도 이해가 안되는 수준인 것 같다. 시간이 많다면 투자를 많이 하겠지만, 일단은 목요일에 있을 W02 시험을 잘 보는게 우선인 것 같다. 각 알고리즘 분류 별 기본적인 수준의 문제들을 더 풀어보고, 응용을 할 수 있는 기반을 다지기로 했다.
- 팀원끼리 문제 하나 씩 선정해서 코드 발표를 진행했다. 거의 유일(?)하게 팀원 분들이 조금 고전하고, 나는 상대적으로 수월하게 풀었던 두 용액을 선정했다. 즉흥적으로 풀었던 내 코드를 하나하나 뜯어서 보다보니, 그리고 당시 풀 때보다 조금이라도 이분 탐색에 대한 이해도가 높아졌다 보니 특이한 점이 보였다. 정석적인 이분 탐색 코드 같지가 않았다. 이분 탐색 풀이에서 흔히 볼 수 있는 while문 안에 추가 선형적인 탐색 코드가 없음에도 시간복잡도가 O(logN)이 아닐 것 같다는 생각이 들어, GPT에게 내 코드의 시간복잡도를 물어봤다. 역시나 O(NlogN)이라는 답이 돌아왔다. 탐색 범위를 갱신하는 과정에서 선형적인 탐색 과정이 있다는 점에 주목하고, 발표 준비를 마쳤다.
- 발표를 하다보니, while문 중에 범위를 줄이는 과정에서 투포인터 적인 활용을 했다는 사실을 알게 되었다. 이렇게 자기 코드에 대한 심도있는 분석을 하다 보니, 시간복잡도에 대한 이해나, 해당 알고리즘에 대한 깊이 있는 이해가 가능해진다는 점을 깨닫는 좋은 자리였다.
- 진작에 이런 문제 접근 및 코드 발표를 했으면 좋았을 것 같다. 과정이나 결과도 좋았고, 앞으로 정글에서도, 취업 시장에서도, 회사에서도 도움이 될 만한 일인 것 같다. 다른 팀원 분의 발표를 보면서 여러 질문 거리를 생각하고(자연스럽게 나오게 되더라) 이야기 나누는 일도 재미있었다. 다음 팀에서는 내가 제안해서 해보면 좋을 듯 하다.
- 늦잠 잤다. 전날 거의 15시간은 공부한 듯하니 그렇게 큰 자괴감은 들지 않았다. 규칙적으로 살자. 인간은 쉽게 변하지 않는다.
3.15(수)
### 스택 '상' 두 문제 => 끝 + 복습이나 추가 문제? X => 코드 리뷰를 할 상황이 아닌 것 같아 생략
* 이분 탐색 추가문제, 시트 리스트업 더 O
* 분할 정복 추가문제, 시트 리스트업 O
* 자료구조 (스택, 큐, 우선순위 큐) 개념 복습 및 파이썬에서 응용 방식 복습 O
* '상' 제외, 전체 문제들 복습 풀이 O
===>
- 이분 탐색 공부 진짜 열심히 했는데, 시트 '중' 문제들과 유사한 정도로 보이는 문제들을 몇개 풀어봤지만, 답이 제대로 안나온다. 문제에 대한 접근이나, 아이디어 떠올리기 등의 성과는 있는 듯 하나, 결국 마무리를 지어야 한다.
- 분할 정복은 사실 더 문제다. 재귀적인 접근 법이 나오면 일단 쫄고 보는 편인 것 같다. 쿼드 트리 같은 시각적 효과가 있는 자료구조에 대하여 재귀를 통해 문제를 해결하는 것이 다른 분들은 생각보다는 편하게 접근하는 것 같은데, 나는 아닌 것 같다. 더 많은 연습이 필요하다.
- 시험 전 마지막 날임에도 여러 사람들이 플레 문제들이나 모두가 어려워하는 골드 상위 문제 몇을 집요하게 파고드는 모습들이 보인다. 나는 대략 다섯 개(?)의 문제는 그냥 어디선가 코드 복붙해서 제출해버렸다. 당연히 풀이 이해는 하지 못했다.
- 몇 일을 고민해서 플레 한 문제를 푸는 것보다, 실버 및 골드 하위 정도의 문제를 큰 어려움 없이 푸는 것이 내 제1의 목표라고 생각한다. 여전히 방법론에 대한 고민이 된다. 나만 너무 쉽게 슈퍼 고난도 문제들을 내려놓은 것은 아닌지,, 하는 생각이 들기도 했다. 사실 그런 고민들을 하며 자신의 길, 자신만의 방법을 찾는 기간으로 여기고 남은 알고리즘 2주를 보낼 것 같다.
- W02 팀의 마지막 식사를 관평동 어느 스시 집에서 했다. 팀원 분의 차를 타고 갔다. 별 것 아니긴 해도 여기 정글에서는 꽤나 일탈적인 일이긴 하다. 스시는 뭐 가성비로 양이 많아서 먹을 만 했다. 스시붐 마렵다.
'SW정글 주간 회고' 카테고리의 다른 글
(WIL) WEEK09 : pintOS Project 02 (USER PROGRAM) (0) | 2023.05.08 |
---|---|
(WIL) WEEK08 : pintOS Project 01 - 미완 (0) | 2023.04.27 |
WEEK01 : 계획 및 일일 회고 (2) | 2023.03.09 |
WEEK01 : (회고는 아니고) 특별한 과제 (0) | 2023.03.04 |
WEEK00 : 회고 (0) | 2023.03.04 |