사실상 03/05부터 자료구조,알고리즘 주차로 넘어왔고,
현재 WIL을 작성하는 03/14일 기준으로 자료구조, 알고리즘과 만난지 10일째 되는 날이다.
아직 많이 어색하지만 하루 하루, 매 시간 마다 새롭게 배우는 즐거움으로 공부하고 있다.
자료구조, 알고리즘 1주차에 들어와서 초반에는 자료구조가 무엇인지, 알고리즘이 무엇인지, 왜 필요한지를 알아보기 보다 당장 주어지는 문제를 풀기 위해 파이썬 문법만 들여다 봤다.
자료구조와 알고리즘의 관계 + 파이썬 문법의 관계에 대해 생각해보고 공부해보지 않았더니
몇일 지나지 않아서 과부화가 걸렸다.
1주차에 주어진 문제들 중 초반에는 자료구조나 알고리즘을 공부하지 않아도 사칙 연산과 조금의 파이썬 문법으로 해결할 수 있는 문제들이 대부분이었다.
하지만 중반으로 지나가면서는 자료구조, 알고리즘을 먼저 생각해보고 공부하지 않으면 풀 수 없는 문제들이었고 자료구조와 알고리즘의 관계와 필요성에 대해서 생각해보게 되었다.
알고리즘
자료구조
자료구조와 알고리즘의 차이
자료구조를 도서관의 책장에 책을 꼽는 것으로 가정을 할 수 있다면 도서관에 존재하는 많은 책장은 모두 규칙적으로 책이 진열이 되어있습니다. 그 규칙은 도서관마다 다르며 다양한 방법이 존재합니다. 예를 들어 ABC 알파벳 순서, 연도 순서, 책을 세로로 또는 가로로 진열을 합니다. 이렇게 데이터가 저장되는 형태 즉 데이터 표현 및 저장 방식을 자료구조라고 의미할 수 있습니다.
반면에 알고리즘은 앞에 예시를 들었던 도서관에 책이 순서되로 모두 진열이 되었다면 그 책을 찾는 것에 비교할 수 있습니다. 자신이 원하는 책을 찾을 때 책장의 왼쪽, 오른쪽, 위쪽, 아래쪽으로 책을 찾을 수 있으며 큰 책, 작은 책으로도 검색이 가능하며 심지어 무작위로도 책을 찾을 수 있습니다. 이러한 것과 같이 저장된 데이터를 명령 처리 및 제어 방법을 알고리즘이라고 의미할 수 있습니다.
자료구조와 알고리즘의 차이 예시 출처: https://juyeop.tistory.com/9
자료구조와 알고리즘의 관계
자료구조를 구현하기 위해서 알고리즘이 필요하다. (상호보완적이다)
자료구조의 알고리즘 : 데이터를 저장하고 탐색하는 방법에 대한 고민들
자료구조를 이용한 알고리즘 : 자료구조를 활용하여 어떤 문제를 해결하는 것
따라서 각 자료구조들의 장단점을 숙지하면, 상황별로 적합한 자료구조를 선택할 수 있게 되어
1. 문제에 어떤 방향으로 접근하면 될지 생각하게 되고
2. 그에 필요한 해결 방법인 알고리즘을 통해 문제를 해결할 수 있게 된다
위의 내용들은 내 머릿속 + 책 + 강의의 짜집기로 틀릴 수 있다
결과적으로 큰 틀에서 어떤 자료구조의 형식을 가지고 있는지를 파악하고 접근해서 알고리즘을 통해 (+기본적인 파이썬 함수와 문법과) 문제를 풀어나간다는 점을 다시 머릿속에 저장해본다.
백준 알고리즘준 알고리즘 문제들을 난이도 하 ~ 중상 사이의 문제들을 접하면서 필요한 개념들을 익혔다.
백준 알고리즘 10250번 ACM호텔 문제를 예로 들어보면
1. 이 문제의 자료구조는 데이터들은 행과 열로 이루어진 2차원 배열의 모양을 하고 있다는 것을 확인하고
2. 테스트 케이스가 주어진 만큼 반복하면 되니까 반복문을 사용해서 문제를 해결하면 되겠다
3. 기본적인 수학개념으로 풀어야 하니까 파이썬의 기본 연산자 개념을 알아야겠다
이런 생각을 가지고 문제에 접근하고 풀이했다
t = int(input())
for i in range(t): #테스트 케이스로 입력받은 수만큼 for문 반복
h, w, n = map(int, input().split())
num = n//h + 1 #호수:n에서 건물층수를 나눈 정수 부분의 몫 +1
floor = n % h #층수:n에서 건물층수를 나눈 몫의 나머지
if n % h == 0: # h의 배수이면,
num = n//h #가장 꼭대기 층에 머물게된다
floor = h
print(f'{floor*100+num}') #floor가 ***호가 되려면 *100해야함
3번의 예시처럼 기본수학을 가지고 풀이할 수 있는 문제들은 쉽게 접근할 수 있었지만, 조금 높은 난이도의 수학을 요구하는 문제들은 꽤나 어려웠다. (해당 수학 공식을 이해하는데만 시간이 오래 걸렸다)
또 처음에는 알고리즘 문제에 대해서 자료구조, 알고리즘, 파이썬 함수 문법등을 배워가고 필요한 개념들을 익히는 수단으로 사용했었는데
뒤로 가면 갈 수록 문제를 푸는 것에'만' 집중하게 되고 고민을 짧게하고 바로 검색해서 정리된 다른 사람의 코드를 보려고 하는 나쁜 습관이 생겼다.
알고리즘 2주차에 접어든 지금 시점 생각해보면,
1주차에는 긴시간 혼자 풀어보고 저녁에 한 번 팀원과 문제를 풀었던 방식으로 생긴 나쁜 습관 같다. 나 혼자 해결이 되어야 했기 때문에 (다음 문제를 풀어야 하니까) 어느정도 되면 넘기고 했었는데,
이제는 다시 처음으로 돌아가 개념을 쌓는데 도움이 되는 수단으로 알고리즘 문제를 생각해야겠다. 필요한 개념들이 쌓이면 문제는 절대 풀 수 있다! 문제는 절대로 풀린다!
배우면 배울 수록 문제 푸는데 더 어려움을 느끼고, 그 이유가 개념들이 정확하게 머릿속에서 정리되지 않았고 그런 상황에서 문제 풀이에만 달려들었기 때문이라는 것을 알게된데는 함께 항해하는 크루원분의 블로그를 우연히 보게 된 이후였다. 그분의 기록이 나에게 큰 도움이 되어서 너무 감사했다. 다양한 사람들의 이야기를 들을 수 있는 것이 함께 모여 공부할 때 얻을 수 있는 최대 이점인 것 같다.
그날 이후로 문제에 대해 조급한 마음을 갖지 않고, 개념을 쌓으면 문제는 풀린다! 는 마음으로 임하게 되었다.
하나의 문제를 풀고 해당하는 자료구조, 알고리즘, 파이썬 개념들을 안다고 자만했던 나. 동일한 유형의 문제가 나왔는데도 못 알아봤다. 답답한 마음에 유튜브에 '코드를 한줄도 못쓰겠다'는 찡찡거림을 검색했는데(?) 많은 학생들이 겪고 있는 '개념-문제 괴리 현상'에 대해. [개념 공부법] 고3공부 영상이 나왔고 혼났다... "개념과 그 개념의 용도까지 알아야 개념을 안다고 할 수 있다." 문제를 이해하지 못하고, 개념을 이해하지 못했는데 어떻게 코드가 나올 수 있나!
개발일지를 적어보려고 이것저것 서핑하다가 outsider님의 블로그 글에서 Don't learn to code. Learn to think.라는 제목의 글을 읽게 되었다.
프로그래밍은 문제를 해결하는 일이고 이를 위해서 생각하는 방법을 배우는 것은 중요하다.
문제를 풀때 아직 코드를 한 줄 더 쓰지 못한다고 괴로워하지 말고, 생각을 한 줄 더 쓸 수 있어진 것에 더 초점을 두자!