백준 4344: 평균은 넘겠지
배열을 활용한 문제였다. 입력값을 매직넘버로 바꿔서 오류가 계속 났다.
문제를 다 푼 후에 다른 사람들은 어떻게 풀었는지 인터넷에서 확인했다. 내 코드보다 간결하고 구조도 잡혀 있었다. 문제와 별로 관련 없는 부분들은 별도의 변수를 사용하지 않은 대신에 주석으로 의미를 설명했다. 같은 기능의 코드라도 길이가 더 짧으니 읽는 데에도 부담이 덜어졌다. 코드가 구조화되어 있으니 각각의 코드블럭이 어떤 의미를 가지는지도 파악하기가 쉬웠다.
좋은 코드가 뭔지는 내 수준으로 명확하게 정의하기에는 주제를 넘는 것 같다. 그래도 이번 문제를 통해 확인한 것이 있다면 ① 돌아가는 코드 ② 동일 기능에서 짧은 코드 ③ 구조화 되어 있는 코드 인 것 같다.
자료구조와 알고리즘: union find 알고리즘
크루스칼 알고리즘을 이해하기 위해서는 최소신장트리와 서로소 찾기 알고리즘에 대한 이해가 필요하다. 그래서 서로소 찾기 알고리즘에 대해 정리하였다. 서로소 알고리즘은 그래프의 노드가 서로소 집합 자료구조인지 여부를 판단한다. 쉽게 말하면 그래프의 노드가 끊겨 있는지 여부를 판단한다. 공유하는 노드가 있다면 두 그래프는 부모테이블에서 하나의 노드를 가리킨다.
코드를 공부하면서 느꼈던 점: 직관과 프로그래밍
union find 알고리즘을 공부하면서 처음에 예제 코드를 이해하는 게 어려웠다. 되돌아보면 사전지식 없이 처음부터 코드를 적용하려고 했기 때문이다. 코드는 인간의 아이디어를 컴퓨터가 이해할 수 있도록 변환한 결과물이다. 컴퓨터에게 일일이 프로그래밍 언어로 사람의 말을 해석해서 전달하는 이유는 사람과 컴퓨터가 현상을 이해하는 방식이 다르기 때문이다.
사람은 현실을 시각(직관)적으로 판단한다. 복잡한 데이터와 관계를 패턴을 바로 인식해서 추상화할 수 있다. 하지만 컴퓨터는 눈이 없다. 컴퓨터는 0과1 만으로 현실을 파악한다. 따라서 사람이 이해한 객체를 컴퓨터에게 이해시키기 위해서는 컴퓨터의 개념으로 변환해야한다.
현실의 객체들을 프로그래밍 상의 객체로 모델리하는 기법을 객체지향적 프로그래밍이라고 한다. 현실의 물건과 같은 물리적 개념, 사람간의 관계와 같은 추상적 개념이 프로그래밍 세계에서 프로그래밍 세상의 객체로 포섭될 수 있다. 참고로 객체란 프로그래밍 세계에서는 함수와 데이터의 모음이다.
현실에서는 객체는 속성을 가지고 속성을 바꿀 수 있다. 때로는 하나의 객체가 다른 객체에게 영향을 주기도 한다. 예를 들어, 사람은 키, 몸무게를 가지고 있다. 사람은 다른 사람에게 영향을 미칠 수 있다. 사람 간의 관계 또한 객체가 된다. 어떤 사람이 다른 사람과 친구관계를 맺으면 사람간의 친구관계라는 객체를 포섭할 수 있고 친구관계의 변동이 객체에 가해진 변화다.
현실세계의 객체를 프로그래밍 세계로 옮기려면 현실 객체들을 프로그래밍 객체로 변환하는 작업이 필요하다. 이는 곧, 문제를 정의하는 것이다. 문제를 정의한다는 것은 현실의 객체를 프로그래밍 세계에서의 객체로 변환하는 과정이다. 문제를 해결한다는 것은 단계적 절차 즉, 알고리즘을 통해 원하는 결과 즉, 출력값을 표현하는 것이다.
결국 프로그래머가 하는 일 증에 하나는 현실의 문제를 컴퓨팅 세계의 언어로 해석해서 컴퓨터가 문제를 해결할 수 있게끔 알고리즘을 구성하는 일이다.