*주관적인 내용이 많습니다. 여러 글을 보면서 신중하게 결정하시길 바랍니다. 여러분이 노력해서 들어간 대학교 생활을 적성에 안맞아서 힘들어 하지 않았으면 좋겠어요.

 

1. 배경

 요즘 it계열의 과가 인기가 많습니다. 요즘 취업이 어려워지면서 그나마 취업이 잘되는 공대쪽 인기가 높아지고 있는데요. 제가 고등학생 때에도 "문과는 답이없다. 이과가 미래다" 라는 말을 자주 들었는데 요즘도 많이 듣는지 모르겠습니다. 실제로 대학에서도 전과를 선택하는 사람들이 많기도 합니다. 제가 소프트웨어학부이다보니 주변 친구 동생들, 어머니의 지인 자녀들도 이쪽으로 생각하는 분들이 많더라고요. 흔히 물어보시는게 당연히 "미래는 어떻냐?", "힘들진 않냐", "어디 학교가 그래도 좋냐" 등등의 질문이 들어옵니다. 제 블로그가 고등학생분들이 많이 들어올 블로그는 아니지만 혹시나 전과나 이쪽으로 생각이 있으신 분들, 자녀분들 때문에 검색해서 들어오시는 분들이 있을까해서 제가 그냥 4년동안 소프트웨어학부(컴퓨터 공학과)에서 보고 느낀 장단점, 학교 생활을 공유하고자 합니다.

 

2. 과를 선택하는데 있어 개인적으로 중요하게 생각하는 것

 저는 개인적으로 적성을 가장 중요하게 생각해요. 저 같은 경우는 어릴 때부터 컴퓨터쪽에 가고싶어했고 적성도 우연히 잘 맞았습니다. 그래서 초등학생 5학년때 부터 장래희망에 컴퓨터 프로그래머가 되고 싶다고 적었습니다. 초중고등학교에서 흔히 진로시간에 직업적성검사? 같은 것도 해보았을 때 컴퓨터쪽이 자주 나오기도 했고요.

 하지만 현실은 자신이 하고싶은 것만으로는 할 수 없긴합니다. 그게 슬프다는 것은 알지만 현실이기도 하고, 제 주변에서도 성적만으로, 대학 가치가 높아서 들어간 친구들이 있습니다. 자신의 적성이나 하고싶은 것을 전혀 고려하지 않은 채로 말이죠. 예를 들면 연세대학교에 러시어학과 입학했지만 러시아어를 하나도 못하거나 관심이 없는 친구(연세대학교에 이런 과가 있는지 확실하지 않으며 그냥 예를 든 것입니다.) 문과쪽에 적성이 더 맞지만 취업을 고려해서 억지로 공대를 선택한 친구 등등 이렇게 선택한 친구들이 몇몇 있어요. 하지만 이런 친구들은 당연히 과에 대한 만족도도 낮으며, 중간에 전과를 하거나 졸업을 하고나서도 다른 길을 찾아보는 친구들이 많습니다. 제가 이 이야기를 왜하는지는 밑에 계속 읽어보시면 이해하실 겁니다.

 

3. 고등학교 성적

 고등학생분들은 아무래도 성적을 가장 중요하게 생각하겠죠? 최대한 자신의 성적으로 높은 곳에 가고 싶다고 생각하실겁니다. 컴퓨터공학부는 공대치고는 성적이 그렇게 높은 편은 아닙니다. 어떤 대학의 공대에 입학 컷이 2.3이라면 컴공은 2.5~2.7정도? 더 후하게 잡으면 3.0까지도 차이났던거 같습니다.(2017년도 기준) 저희 학교를 보니 제가 입학하고 나서 수시 교과 기준 컷이 엄청 높아졌긴 합니다만..(고3 담임선생님, 그 시기에 노력한 나한테 정말 감사합니다..) 그래도 대학들을 찾아보시면 대부분 대학들이 컴퓨터과가 있고, 컷도 공대기준에서는 음.. 그냥 적당하네? 라는 생각이 들었어요.

 

4. 적성? 어떤 사람들이 잘 적응할까요?

 수학을 좋아하시는 분이거나 어떤 문제에 대해서 계속해서 고민하는 것을 좋아하시는 분이 컴퓨터공학에 잘 맞는거 같습니다. 또한 하나의 풀이법보다 다양한 풀이법에 도전하거나 생각을 하시는 분들도 나름 잘 맞다고 할 수 있겠네요. 이건 저의 개인적인 생각일뿐 사람마다 얼마나 잘 적응하고 행동하는지가 다르기 때문에 그냥 참고용으로만 봐주세요.

 

5. 대학교 생활

 아무래도 과제가 많습니다. 진짜 많아요.. 저는 주변에 다른 과친구들의 일상을 본적이 별로 없어서 저희 과가 과제가 많은건지 잘 몰랐습니다. 그냥 교수님이 내주시면 완성해서 제출하고, 짜증도 내고, 밤도 새고 했는데요. 3학년때 기숙사 생활을 하면서 저는 거의 매일 밤을 새는데 제 룸메이트들은 시험기간에만 공부를 조금하고 나머지 시간에는 편하게 보내는 것을 보고 차이를 많이 느꼈습니다. 그리고 대학생들 커뮤니티인 에브리타임에서도 보면 저희 과가 과제가 적은 편이 아니더군요;;

 저는 장학금에도 욕심이 많이 있었고 대학원까지 생각이 있어 성적 관리에도 조금 신경을 많이 썼지만 그렇다고 하루종일 공부만해야 버틸 수 있는 과는 아닙니다. 저도 운동 동아리도 가입해서 활동을 했고, 그 동아리 회장도 해봤고.. 친구들과 술도 마시면서 평범한 대학생활을 했습니다.

 성비는 공대가 여성 비율이 적기로 유명하잖아요? 저희과는 신입생 때 기준으로 8:2~7:3정도? 였던거 같습니다. 많은 편은 아니지만 그렇다고 남성들만 득실거리는 정도는 아니였어요.

 

6. 전과

 대학생활을 하다보면 전과하는 사람들을 생각보다 많이 보는거 같습니다. 전과가 아니더라도 부전공으로는 자신의 전공과 다른 전공을 선택하는 사람이 많습니다. 저희 과는 새로 들어오는 사람들도 많지만 빠져나가는 사람들도 많습니다. 빠져나가는 사람들은 4.에서 말씀드린 사람들이 대부분입니다. 아무리 해보려고해도 적성이랑 안맞아서 도저히 못버티는 사람들이 많았습니다. 다시 수능을 보겠다고 나간 동기들도 많고요. 그래서 4.에서 성적이나 대학 네임을 보기보단 적성을 보고 고르라는 겁니다. 당연히 어떤 일을하더라도 쉬운 일이나 자신이 원하는 대로 실행되는 것은 별로 없습니다. 노력이 필요하고 인내가 필요합니다. 하지만 적성은 자신이 좋아하고 싫어하는게 정해져있는데 그걸 단순히 힘든거라고 생각하고 억지로 버티면 대학생활 4년동안 많이 힘들겁니다.

 

7. 건강

 아무래도 장시간 한 자세를 유지하면서 앉아 있다보니 디스크 위험이 큽니다. 시력도 많이 떨어지기도 하고요. 저는 운동도하고 몸관리를 어느정도 한다고 생각했는데 작년에 좀 무리를하다보니 허리가 많이 안좋아지더라고요.. 작년에는 한시간 앉아있는 것도 힘들어서 한시간 앉아있고 한시간 쉬는시간 가지고 했을 정도였습니다. 저는 허리만 그렇지만 손목도 안좋아지는 사람도 많은거 같긴해요. 시력은 뭐 당연해지는 옵션이고.. 저는 밤낮을 많이 새면서 자주 밤낮이 바뀌고 하다보니 몸이 안좋아진 것도있는데 이건 사람들마다 관리하는 습관에서 다를거 같아요.

 

8. 마무리

뭔가 컴퓨터 공학과에 대한 설명을 적을려는 글이었는데 어쩌다보니 대학 입시부터 시작해서 이야기가 조금 벗어난게 아닌가 싶습니다. 혹시 글에는 안담겨있지만 궁금하신점 있으시면 댓글에 남겨주세요. 이번 글도 읽어주셔서 감사합니다.

'대학 & 일상 일기' 카테고리의 다른 글

드디어 취준 끝.  (2) 2024.03.28
래블업 인턴 후기  (1) 2024.03.02
오랜만에 들립니다.  (0) 2021.02.09
마지막 학기 종강  (0) 2020.12.08
왜 블로그를 시작하게 되었는가  (0) 2020.11.20

 저번주 토요일에 시험을 끝으로 마지막 학기도 끝났습니다. 원래는 이번주부터 시험기간이지만 온라인 수업이기도하고 교수님도 빨리 시험보고 다른 과목 공부하는게 좋지 않겠냐면서 일찍 보시더군요.(저는 다른 과목 공부할게 없지만요 ㅎㅎ) take home exam 형식으로 봤는데 꽤 힘들었습니다. 문제를 완전 어렵게 내시는 교수님은 아니시지만 시간이 조금 딱 맞아떨어지거나 부족하게 내시는 교수님이신 것을 알고있었지만, 이번 수업에서 그렇게 어렵다고 느낀 부분도 없었고, 암기가 아닌 실습으로 진행하는 시험이라서 금방 끝내지 않을까 했는데... 역시나 교수님은 생각이 있으시더군요 ㅎㅎ..

 아침 9시에 문제가 나오고 24시까지만 제출하면 되는 형식이었습니다. 절반 정도는 쉽게 진행해서 '오.. 빨리 끝내겠군' 생각하는 순간 나머지 문제들이 까다롭더라고요. 이게 바로 응급실에서 "오늘은 한적하네" 나 애니에서 "해치웠나" 하는 것처럼 플레그를 세운건가 싶더라고요... 그래도 최대한 해서 제출을 하긴했는데 중간중간 실수를 통해서 다시 작업하는게 너무 화가.. 한번 동작하는데 1시간 걸리는걸 터미널에서 ctrl+c눌러버려서.. 핳

 결국 15시간 꽉 채워서 겨우 제출했습니다. 밥도 15시쯤 배가 너무 고파서 10분만에 밥 먹고 다시 컴퓨터 잡은거 말고는 쉬는 시간도 안가지고 했더라고요. 12시간이 지났을 때부터는 허리에 통증이.. (다들 허리하고 손목 조심하세요..) 제출하고 늦은 저녁을 먹었답니다. 그날 끝나고 뭔가 개운하거나 고생했다 느낌이 들줄 알았는데 15시간동안 앉아만 있었더니 멍.. 하더라고요. 피곤해서 일찍 자려고해도 허리가 너무 아파서 4시까지 못잤어요 ㅠㅠ

 주말에 글을 쓰려고했는데 어제까지 아무것도 안해서 이제야 글을 쓰네요. 사람이라는게 한번 게으른 맛을 보면 다시 일어나기가 힘든거 같습니다;;ㅎㅎ 정신 좀 차리고 마지막 학기가 끝났다고 생각하니 뭔가 '이제 끝났구나' 라는 생각도 들고 지난 학교 생활들이 생각 나더라고요. 이런저런 생각하다가 의미없는 성적표도 다시 한번 보고.. ㅋㅋㅋ 이제 2달 뒤에 3500만원짜리 졸업장만 받으면 진짜 끝이라니. 하나의 과정을 끝날 때마다 드는 이 기분은 적응이 안되는거 같습니다. 다음 과정인 군대도 끝날 때 비슷한 기분이겠죠..? ㅋㅋㅋ

 훈련까지 12일 정도 남았는데 크게 생각안하고 조금은 즉흥적으로 살아볼까 합니다. 코딩하고 싶을 땐 코딩하고, 드라마보고 싶으면 드라마보고, 졸리면 낮잠도 자면서.. 얼마 안남은 시간을 즐기면서 보내려고요. 다른 분들은 이제야 시험이 시작했을텐데 다들 올해 마무리 잘하시고 A+받아가시면 좋겠습니다.

*해당 글은 국민대학교 2020년 빅데이터 플랫폼 수업에서 배운 내용을 제가 이해한 내용을 바탕으로 작성했으며 pdf 내용을 그대로 사용하지 않았습니다.

 

1. 배경

 이전 글에서는 Hadoop과 MapReduce가 왜 연관이 되어 있는지에 대한 내용을 작성했습니다. 이번에는 Map과 Reduce의 기능을 살펴보고 MapReduce의 Map과 Reduce가 어떻게 동작하는지 알아보겠습니다.

 

2. Map

 MapReduce의 첫번째 단계인 Map입니다. Map은 input 데이터들에 대해서 공통의 작업을 실행해서 원하는 형태로 만들어 줍니다. 예를 들자면 어떤 하나의 리스트에 담긴 정수들을 절대값 형태로 바꾸고 싶다고 가정을 합시다. 그렇다면 이때 리스트 안에 있는 원소들에 대해서는 원소를 절대값으로 바꾸는 공통의 작업을 실행합니다. 이렇게 원소들에게 어떤 작업을 통해서 공통된 형태를 만들어 줄 때 Map을 사용합니다. 스칼라 코드로 예를 들면 List(-10, 3, -4, 1).map(x=> Math.abs(x))라는 코드를 작성하면 예를 든 리스트의 원소를 절대값 형태로 바꿔주는 Map 함수를 작성한 것입니다. 일반적으로 MapReduce에서의 Map은 input 데이터를 (key, value)형식으로 만들어주는 역할을 합니다. 즉 다시 스칼라 코드로 예를 들면 List(-10, 3, -4, 1).map(x=> (x,1)) 이런식으로 작성하며 이때 map함수를 거친 리스트의 결과 값은 List((-10,1), (3,1), (-4,1) (1,1))의 형태가 나타날 것입니다.

 

3. Reduce

 Reduce는 입력으로 주어진 리스트 또는 집합 원소에 주어진 함수를 실행해서 하나의 값으로 모으는 작업을 진행합니다. 스칼라 코드를 예를 들면 List(-10, 3, -4, 1).reduce((x,y)=> x+y)를 실행하면 리스트의 전체 원소의 합인 -10이 나옵니다. Reduce에서는 주의할 점이 있습니다. 윗줄의 scala코드에서 (x,y)를 입력으로 받는 것을 볼 수 있습니다. 처음보는 사람들은 x와 y에는 순서대로 값이 들어 갈 것이라고 예상하는데 그렇지 않습니다. 즉 List(-10, 3, -4, 1).reduce((x,y)=> x+y) 코드에서 -10+3+(-4)+1 순서로 계산이 될지 3+(-10)+1+(-4) 순서로 계산이 될지는 아무도 모릅니다. 즉 계산 순서의 변경으로 결과가 달라지는 함수를 정의해서는 안됩니다. 예를 들면 뺄셈, 나눗셈 등등이 있겠네요. MapReduce의 Reduce는 위에서 설명한 Map을 통해서 나온 (key, value)로 이루어진 리스트를 같은 키 값끼리 묶어서 계산하는 역할을 합니다. 이것이 이해가 안간다면 다음 문단에서 예시로 확인해도 되겠습니다.

 

4. MapReduce 활용

 MapReduce의 예제로는 WordCount를 이용해서 예를 듭니다. 다른 예로는 페이지 랭크 알고리즘이나 문서(또는 책)에서의 특정 키워드가 몇페이지에 나타나는지 알려주는데에도 사용이 됩니다. 여기에서도 WordCount를 예로들어서 설명을 하겠으며 WordCount에서 이해한 내용을 바탕으로 다른 예제를 어떤식으로 구현하면 될지 생각해보시는 것도 좋을거 같습니다.

 입력데이터는 "This is a peach and that is a apple"을 사용하겠으며 여기 문장에서 쓰인 단어들이 각각 몇개가 사용되었는지 알아보는 WordCount를 진행해보겠습니다. 언어는 scala를 통해서 진행하겠습니다.

 우선 입력 데이터가 우리가 원하는 단어 형태로 split이 되어 있는 것이 아니라 문장으로 들어왔습니다. 그렇다면 Map을 실행하기 전에 단어로 split해주는 작업이 필요할거 같습니다. .split(" ")을 사용하면 띄어쓰기로 split이 되므로 각 단어들을 원소로하는 리스트가 반환이 될거 같습니다. 그렇다면 결과 형태는 List("This", "is", "a", "peach", "and", "that", "is", "a", "apple") 입니다.

 이 상태에서 Map 과정을 실행할 것입니다. 각 단어를 key로, 사용된 횟수를 value로 사용하기 위해서는 리스트의 원소들을 (key, value) 형태의 튜플로 만들어줘야겠네요. .map(x=> (x,1))을 사용한다면 결과는 List(("This", 1), ("is", 1), ("a", 1), ("peach", 1), ("and", 1), ("that", 1), ("is", 1), ("a", 1), ("apple", 1)) 형태로 바뀔 것입니다. 각 단어들에게 value 1을 부여했습니다.

 다음으로는 Reduce 과정을 실행해서 같은 key값들의 value를 다 더해준다면? (각 단어, 나온 총 횟수) 형태로 바뀔 것입니다. .reduceByKey((x,y)=> x._2 + y._2)를 작성하면 value를 더한 형태가 반환 될 것입니다. 이렇게된다면 최종결과는 List(("This", 1), ("is", 2), ("a", 2), ("peach", 1), ("and", 1), ("that", 1), ("apple", 1))이 됩니다.

 

5. 글을 마치며

 이번 글에서는 Map과 Reduce가 어떤 기능을하며 MapReduce에서는 각각 어떤식으로 주로 사용되는지 알아보았습니다. Map과 Reduce 함수에 대해서는 코딩을 조금 해보신 분들은 다른 언어에서도 사용을 해보셔서 비슷하다고 느끼거나 별 내용이 없다고 느끼셨을거 같습니다. 맞습니다.. 아마도 처음보신 분들도 '별 내용없네' 라고 생각하셨을거 같지만..ㅎ 부족하지만 읽어주셔서 감사합니다.

'CS > 빅데이터' 카테고리의 다른 글

MapReduce? Hadoop? 둘이 다른거야?  (0) 2020.12.03

1. 글의 배경

 2016년 알파고와 이세돌의 대국이후에 인공지능에 대한 관심을 많이 받기 시작했습니다. 물론 전공자들은 이전부터 계속 개발을 하고있었지만, 대중들은 SF영화 속에서만 보던 인공지능의 성능을 직접 보고 느끼게 한 것은 알파고가 엄청난 역할을 한거 같습니다. 인공지능에 대해서 잘 모르셔도 인공지능에 대한 가벼운 지식을 가지고 있으신 분들은 인공지능이 알파고처럼 뛰어난 성능을 나타나게 하기위해서는 많은 데이터를 가지고 학습을 해야한다는 점을 아실 것입니다.

 인공지능이 떠오르면서 당연히 데이터에 대한 가치가 엄청나게 커졌고 빅데이터를 원하는 작업을 위해 변형하고 수정하는 것도 중요해졌습니다. 하지만 빅데이터를 가지고 작업을 한다는 것은 쉬운 일이 아닙니다. 혹시 100MB크기나 그 이상이 되는 txt파일을 열어본 적이 있으신가요? 좋은 성능의 컴퓨터를 가지신 분은 크게 불편한 점을 못느끼셨을 수도 있지만 저는 그렇게 좋은 성능의 컴퓨터를 가지고있지 않아서;; 저런 큰 용량의 파일을 열었을 때 컴퓨터가 버벅거리거나 멈춰버린 경험이 있었습니다. 그 파일가지고 변형하는 작업이 아니라 그저 파일을 연 작업만 했을 뿐인데 벌써부터 작업에 어려움이 발생했죠. 빅데이터를 가지고있기 위해서 많은 디스크 용량이 필요하고, 빅데이터를 가지고 작업하기 위해서는 메모리와 CPU의 성능도 중요합니다. 기업에서는 사업을 하기위해서 좋은 성능을 가진 컴퓨터나 장비를 마련할 수 있지만, 학생이나 일반 사용자들은 그런 장비들을 마련하기는 쉬운 일이 아닙니다. 또한 장비가 있더라도 이러한 작업을 가능하게해주는 소프트웨어도 필요하겠죠.

 빅데이터에 대한 중요성이 커지면서, 빅데이터를 가지고 작업할 수 있는 기술도 중요해졌다는 것은 알겠는데, 개인적으로 Hadoop과 MapReduce에 대해서 처음 들었을 때, 이 둘이 뭐가 다른건지 많이 헷갈려했습니다. 여러 블로그를 찾아보아도 이 둘의 설명을 혼동해서 적으신 분들도 많았고요. 이번 글에서는 빅데이터를 쉽게 다룰 수 있게 만들어준 MapReduce와 Hadoop에 대해서 개인적으로 이해한 내용을 토대로 작성해보겠습니다.

 

2. MapReduce와 Hadoop이 등장하기 전

 MapReduce와 Hadoop이 등장하기 전에 배경에 대해서 조금 알아볼 필요가 있습니다. 위에서 말했다시피 빅데이터를 다루는 것은 마냥 쉬운 일이 아닙니다. 과제가 밀렸을 때 한번 쯤은 몸이 여러개 였으면 좋겠다고 생각해보시지 않으셨나요? 그런 것처럼 큰 용량의 데이터를 변형하고 처리하기 위해서는 일을 분산하고 병렬로 작업하는 과정이 필요합니다. 그리고 큰 데이터를 처리하다보면 처리 시간도 오래걸리고 컴퓨터 성능에 따라서 컴퓨터가 멈춰버리거나 작업이 실패하는 경우도 종종 발생합니다. 실패하는 경우에는 어떻게 처리해줘야할까요? 그냥 소프트웨어가 꺼지거나 작업한 데이터가 날아가버리면 아무도 그 소프트웨어를 사용하지 않겠죠? 이렇게 실패(failure)에 대한 처리도 필요합니다. MapReduce와 Hadoop이 등장하기 전에는 분산 병렬 작업, 실패처리를 관리해주는 소프트웨어가 없었습니다. 그렇기 때문에 빅데이터를 가지고 작업하는 것은 너무 어려운 일이었죠. 그래서 MapReduce와 Hadoop이 등장했습니다. Hadoop은 위에서 말한 분산 병렬처리 와 실패에 대한 처리 문제들 해결할 수 있도록 해주었습니다. 또한 MapReduce는 분산 병렬처리된 작업들을 받아서 데이터를 작업해주는 역할을 합니다.(2006년의 하드웨어 가지고 이러한 소프트웨어를 만들어냈다니.. 이래서 성공한 기업이 아닌가 싶습니다.)

 

3. MapReduce? Hadoop?

 MapReduce와 Hadoop을 각각 검색해도 둘은 빠지지 않는 관계인거 같습니다. 그래서 이 둘이 같은 것인지 헷갈리는 사람들도 있고 이해를 잘못하는 경우도 있습니다. 조금 차이가 있긴 하지만 로고도 둘다 노란색 코끼리.. 머리가 아픕니다. 그렇다면 이 둘은 뭐가 다른 것일까요? 왜 이렇게 MapReduce를 설명하면 Hadoop이 따라오고 Hadoop을 설명하면 MapReduce가 따라오는 걸까요?

 먼저 MapReduce는 2004년 구글에서 대용량 데이터 처리를 분산 병렬 컴퓨팅에서 처리하기 위한 목적으로 제작한 소프트웨어 프레임워크입니다. MapReduce는 이름에서 나와있듯이 Map작업과 Reduce 작업으로 나눌 수 있습니다.

 Hadoop의 본명은 Apache Hadoop으로 대량의 자료를 처리할 수 있는 큰 컴퓨터 클러스터에서 동작하는 분산 응용 프로그램을 지원하는 자바 소프트웨어 프레임워크로서 2006년에 나왔습니다. 

 둘다 대량의 자료를 처리할 수 있게 만들어진거면 둘이 같은거냐? 아닙니다. 쉽게 이해하자면 Hadoop안에 MapReduce가 있다고 생각하시는게 이해하시기 편한거 같습니다. 빅데이터를 처리하기 위해서는 큰 용량과 분산, 병렬처리환경이 필요하다고 했습니다. 이렇게 빅데이터를 저장할 수 있는 큰 용량과 분산, 병렬처리 환경을 제공해주는 것이 Hadoop이고 그 안에서 분산된 데이터를 작업해주는 것이 MapReduce라고 생각하시면 될거 같습니다. Hadoop과 MapReduce의 안에서 각각 동작은 추후에 따로 작성하겠습니다.

 

4. 결론

 빅데이터에 대한 중요성이 커지면서 이러한 빅데이터를 변형하고 다루는 작업도 같이 중요해졌습니다. 하지만 이러한 빅데이터를 가지고 작업한다는 것은 쉬운 일이 아니었습니다. 큰 용량의 데이터를 처리함으로써 발생하는 문제점들이 많았거든요. 이렇게 개발자들이 어려움을 겪을 때 이 어려움들을 잘 처리해준 것이 Hadoop과 MapReduce입니다. 이상으로 이번 글도 마치겠습니다. 읽어주셔서 감사합니다.

'CS > 빅데이터' 카테고리의 다른 글

MapReduce 동작  (0) 2020.12.08

1. 배경

 블로그 글을 쓴지 3일정도가 되었고 Algorithm 카테고리에는 이제 2개의 글이 올라갔다. Algorithm이라고 거창하게 카테고리를 만들었지만 실제로는 그냥 내가 문제를 푼 해석을 풀이해논 페이지이다. 다양한 언어를 능숙하게 사용한다면 좋겠지만 이전 글을 쓰면서 '내가 다른 언어를 사용할 일이 있을까?'라는 생각이 들었다. 그 생각 결과 음.. 굳이? 라는 생각이 들었다. 그래서 나는 어쩌다가 Python을 선택하게 되었을까를 생각하다가 이렇게 글을 써본다.

 

2. Python이란?

 Python은 1991년 프로그래머인 귀도 반 로섬이 발표한 고급 프로그래밍 언어이다. Python의 특징이라고 하면 인터프리터, 객체지향적 언어라는 것이다. 객체지향적이라는 것은 다른 언어에서도 많이 들었을테니 대충 알 것이고 인터프리터 언어라는 것은 특별한 컴파일이 없어도 바로 idle에서 실행할 수 있는 것을 말한다. Java를 사용해본 유저라면 코드를 작성하고 컴파일을 거친다음 작성한 코드가 실행된다. 하지만 Python에서는 해당 코드를 작성하고 실행을 누르면 바로 실행 시킬 수 있다. 또한 terminal에서도 python3(또는 python2)를 입력하면 바로 실행되어 코드를 작성해도 바로바로 결과를 얻을 수 있다.

 Python은 처음 코딩을 시작하는 사람들에게 가장 많이 추천되는 언어이다. 그 이유는 다른 언어에 비해서 엄청 쉽다. 처음 코딩을 시작해서 Python을 만져보는 사람들은 "이것도 어려워 죽겠는데 도데체 뭐가 쉽다는거지?" 라는 생각이 들 수도 있지만 C++과 Java 등을 만지다가 Python을 만져본 사람들은 엄청난 신세계의 경험을 했을 것이다.

 이러한 이유로 Python의 인기는 계속해서 증가하고 있으며 2016년 알파고와 이세돌의 대국을 통해서 엄청난 관심을 받게된 인공지능을 개발하는 라이브러리인  Pytorch와 TensorFlow도 Python을 기반해서 나왔다.

 

3. 나는 어쩌다가 Python을?

 그렇다면 나는 왜 Python을 선택했을까? 처음부터 나도 Python을 주언어로 선택한 것은 아니다. 대학생 1학년 2학기에 처음으로 자바를 다뤄봤다. 그 당시에는 무슨 생각이었는지 모르겠지만 자바를 만지면서 "와 재미있다.", "멋진 언어다." 라는 생각을 했었다. 지금 생각하면 왜 그랬는지 모르겠다. System.out.println()과 같이 긴 코드들이 멋져보인건지, 어디에 홀린건지..ㅋ 그러다가 방학을 보내고 다시 개강을 했을 때 자바를 보니 이게 무슨일? 하나도 안떠올라.. 간단한 코드를 작성하는데도 빨간 글씨 에러가 얼마나 많이 나오던지..ㅋㅋㅋ (이때부터라도 정신차리고 블로그에 기록을 했어야했네;;) 이전 학기에는 멋져보이던 언어가 너무 귀찮게 느껴졌다. class선언하는데 private, public 고려해야하고, '왜이리 코드들이 길어..' 라는 생각이 계속 들었다. 그래서 점점 java와 거리가 멀어졌고, 2학년 1학기에는 C++수업을 들었다. C++은 처음부터 나랑 안맞는다는 느낌이 들었다 ㅋㅋㅋㅋㅋ iterator도 복잡했고 뭐하나 쉬운게 없었다.. 그래도 소프트웨어과인데 내 주언어는 하나 있어야하지 않을까하다가 Python을 선택했다. 위에서 설명했던 쉽다는 장점이 크게 느껴졌고, 코드를 작성하기 편했다. 그래서 '그래 이게 나한테 맞는거 같아.' 라고 생각이 들었고 그때부터 주 언어로 선택한걸로 기억한다.

 

4. Python을 사용하면서 불편한 점은?

 Python의 큰 장점이 쉽고 편리한 내장함수와 라이브러리가 많다는 장점이 너무 커서 크게 불편했던 적은 없다. 하지만 몇가지 떠오르긴한다.

 우선 다른 언어에 비해 속도가 느린편인 것입니다. 이게 평소에는 별로 차이를 못느끼지만 코딩테스트에서 똑같은 알고리즘은데 C++로는 통과하고 Python으로는 통과하지 못하는 경우가 종종 발생합니다. 이러한 차이가 있는 이유는 파이선이 동적 타입이기 때문에 변수 이름 앞에 string이나 int와 같은 타입 지정없이 알아서 해줍니다. 우리에겐 정말 편리한 기능이지만 그 과정이 파이썬에게는 많이 부담이 되는 과정입니다. 이와 반대로 C++과 Java와 같은 언어들은 변수 앞에 int, string 등등 타입을 지정해줍니다.

 두번째로는 코딩테스트에서 Python을 지원하지 않는 회사가 종종 있습니다. 요즘은 대세 언어이고 인공지능에도 많이 사용하다보니 거의 없지만 대표적인 대기업으로는 삼성이 있습니다. 삼성도 테스트나 때에 따라서 다른거 같지만 삼성 SW역량 테스트에서 Java, C++, C만 지원하는 경우가 있습니다. 정확한 테스트 이름은 기억이 안나지만 올해 삼성에서 열린 코딩테스트가 있었는데 한번 테스트삼아 지원을 하려고했지만 Python이 없는거 보고 좌절... OTL. 다른 회사들도 종종 Python을 테스트 자체에서 지원하지 않는 경우가 종종 있다고 들었습니다. 그 이유는 뭐 여러가지가 있겠지만 인기있는 언어를 이렇게 제외시킨다는 것은 주언어 사용자 입장에서는 많이 슬픕니다..

 

5. Python 관련 추천 책

 저는 Python에 대한 기본 지식은 google에서 검색하면서 공부했고 알고리즘 관련 공부는 아래 책을 사용했습니다.

파이썬 알고리즘 인터뷰

저도 대학 동기한테 추천받아서 읽어보았는데 내용이 튼튼하고 잘 설명되어있었습니다. 개인적으로 책 읽는 것을 별로 안좋아하는데도 나름 재미있게 읽으면서 공부했습니다. 초보자분들도 쉽게 이해할 수 있고 여러 알고리즘에 대해서 익힐 수 있는 책이었습니다.

 코딩테스트 연습은 저는 프로그래머스를 주로 사용하는 편입니다. 카카오 관련 문제나 여러 코딩테스트 문제들이 많이 올라오거든요. 다른 사람들은 백준 사이트도 많이 이용하시는 것 같습니다. 여러 사이트를 이용해보시고 자신에게 맞는 사이트에서 공부하시는게 조금이라도 더 즐겁고 편하겠죠?

 

6. 마치며

이번 글에서는 Python에 대해서 간단하게 소개하며 제가 왜 Python을 사용하게 되었는지 소개했습니다. 혹시 아직 주언어를 정하지 못하신 분들, 처음 코딩을 시도하시는 분들이라면 Python을 주언어로 해보시는 것을 추천드립니다. 정말 편리하거든요bb

읽어주셔서 감사합니다.

1. 문제 파악하기

- 0이상 100이하인 정수가 들어있는 numbers의 길이는 2이상 100이하이다.

→ 그렇게 길지 않은 데이터네요.

- 더할 수 모든 수를 리스트에 담아서 오름차순으로 return 해야한다.

 

2. 문제 접근하기

 이 문제를 읽고 서로 다른 인덱스에 있는 두 개의 수를 더하라는 말을 보고 바로 이중 for문이 떠오릅니다. 이중 for문을 사용하면 시간복잡도는 n^2이라 좋은 성능의 알고리즘은 아니지만 문제 조건에서 numbers의 길이가 2이상 100이하라고 주어진 것을 보니 시간제한이 걸릴만한 길이는 아닐거 같습니다.

 

3. 주의할 점

얼핏보면 간단한 알고리즘인거 같지만 정답을 맞추기 위해서 몇가지 주의를 놓치면 조금 헤맬수 있습니다.

 

- return할 리스트에 중복 값이 들어가면 안된다.

→ 입출력의 예를 보면 2+3, 1+4로 5가 여러번 나올 수 있습니다. 하지만 result에 보면 5가 한번밖에 나타나 있지 않죠. 중복 값이 나타난다면 제거를 해야한다는 뜻입니다.

 

- return하는 리스트는 오름차순으로 정렬해야한다.

→ 쉬운 조건이지만 놓칠 수 있는 조건입니다. 문제를 꼼꼼히 읽어야할 필요가 있습니다.

 

Python을 능숙하게 사용하신 분들이라면 해당 문제를 쉽고 빠르게 해결하셨을 문제입니다. 하지만 Python을 다룬지 얼마 안되신 분들이나, Python 내장함수를 잘 모르시는 분들이라면 코드가 길어질 수 있습니다. Python의 장점은 이전 글에도 설명을 드렸지만 다른 언어보다 내장함수가 잘 되어있어 Python 내장함수만 알아도 문제를 쉽고 짧은 코드로 해결할 수 있습니다.

 

4. 정답 코드 및 해석

따라서 정답 코드는 아래와 같다고 할 수 있습니다.

 

정답 코드
정확성 테스트 결과

 앞에서 설명했다 싶이 2중 for문을 사용했습니다. 앞에 for문은 numbers의 처음부터 시작해야하며 numbers의 끝까지 가면 됩니다. 두번째 for문은 i랑 다른 인덱스에서 시작해야하므로 i+1에서 시작하면 됩니다. 그래서 answer 리스트에 두 인덱스에 해당하는 값을 더합니다.

 이렇게 for문을 빠져나오면 answer에는 아까 주의할 점에서 언급한 것과 같이 중복 된 값이 들어있고 정렬되어 있지 않은 상태입니다. Python에는 아주 감사하게도 set()이라는 함수와 list()라는 함수가 있습니다. set()은 우리가 흔히아는 집합입니다. set이 list와 다른 점은 중복된 값을 저장할 수 없으며 순서를 보장하지않는다는 점입니다. 따라서 우리는 중복 값을 제거하기 위해서 set(answer)를 사용합니다. 하지만 이렇게만 하면 정렬할 때 조금 귀찮아집니다. 따라서 중복을 없앤 set(answer)에 list(set(answer))를 사용하여 다시 리스트로 만들어줍니다. 리스트에는 sort()함수를 사용하여 쉽게 오름차순으로 만들 수 있습니다.

 이렇게 해서 return을 하면 정답을 얻어 낼 수 있습니다.

 

5. 다른 풀이방법

 이렇게 2중 for문을 사용하지 않고 이 문제를 해결하는 방법은 없을까요? 있습니다. itertools.combinations를 사용해서 문제를 해결할 수 있습니다. itertools.combination은 특정 리스트 원소로 조합을 만들어 냅니다. itertools 라이브러리도 사용법을 안다면 많은 알고리즘 문제를 깔끔하게 해결할 수 있는 경우가 많습니다. 단점은 라이브 코딩도중 해당 라이브러리 이름이 떠오르지않는다면 난감하다는 점이겠죠..;;; 또 저같은 경우는 itertools를 거의 사용하지 않는 편인데요. 그 이유는 아래에서 다시 언급하겠습니다. itertools 라이브러리에는 combinations뿐만 아니라 다른 유용한 함수들도 많습니다. combinations와 다른 함수들을 사용하는 방법은 google에 직접 찾아보시길 바랍니다.

 itertools.combinations를 사용하면 아래와 같이 코드를 작성할 수 있으며 해당 코드 결과입니다.

combinations를 활용한 정답 코드
combinations를 활용한 정확성 테스트 결과

보시면 2중 for문을 사용하진 않았지만 테스트에 소요되는 시간은 더 오래 걸린 것을 확인할 수 있습니다. 왜 이런 현상이 발생하는지는 combinations 함수를 실행할 때 어떤 형식으로 조합을 만들어 내는지를 분석해야겠지만 제 예상으로는 애초에 조합을 생성할 때도 2중 for문을 사용하면서 조합을 만들어 내지않나 싶습니다. 따라서 뭔가 2중 for문을 사용하지 않아서 조금 편안해진 기분은 들지만 걸린 시간을 보니 찜찜한건 남아 있습니다... 저는 오히려 itertools를 사용할 때 이렇게 시간이 더 오래 걸리는 경우가 많아서 해당 라이브러리를 잘 사용하지 않습니다. 실제로 좀 더 난이도 있는 문제에서 사용하다간 시간초과에 걸리는 경우도 종종 있었습니다. 따라서 상황에 맞게 잘 사용하는 방법 밖에 없어보입니다.

 

6. 마치며

이번 문제는 크게 어려운 문제는 아니었습니다. 프로그래밍을 처음하시는 분들도 다른 문제들이랑 비교했을 때 비교적 쉽다고 생각하셨을 문제입니다. 하지만 Python의 내장함수에 대해서 지식이 없으셨다면 코드가 길어지거나 헷갈리셨을 수도 있었을거 같습니다. Python을 주언어로 사용하실 목적이라면 Python의 내장함수와 주요 라이브러리를 잘 숙지해두시는 것이 중요하겠습니다.

1. knex.js란?

knex.js는 Node.js SQL builder 및 query 기능을 제공하는 라이브러리다. PostgreSQL, MSSQL, MySQL, MariaDB, SQLite3, Oracle, Amazon Redshift 등을 지원해준다. knex.js의 공식 사이트는 knexjs.org/ 이다.

 

2. 장점

직접 사용했을 때 장점은 기존 SQL문을 사용할 줄 안다면 거의 비슷하게 사용할 수 있다. 우리가 흔히 SQL문에서 아는 select, where, from, join 등등 다양한 query들이 포함되어 있다. 또한 지원해주는 기능도 많아서 나름 편리하다. transaction, async/await, migration 등등 을 지원해주며 사용하기 편하다. 또한 JavaScript와 SQL 코딩을 같이하는 느낌? 뭔가 데이터 베이스를 만지는거 같으면서도 일반적인 코딩하는 기분이 든다. 즉, 기존 프로그래머들이 적응하는데 오래걸리지 않는다.

 

3. 단점

공식 홈페이지에서 함수에 대한 설명이 조금 빈약하다. 어떤 코드를 실행했을 때 어떤 형식으로 리턴이 되는지, 어떻게 사용되는지를 조금 더 자세하게 작성해주면 좋겠다는 생각을 많이 받았다. 예를 들면 knex("table_name").select(*) 코드를 작성했을 때 "table_name"이라는 테이블에서 모든 field를 받아오는 정도는 SQL를 다뤄본 사람이라면 모두 알고 있다. 하지만 이때 return되는 값이 어떤 형태로 오는지를 설명되어있지 않았다. 실제로 나 같은경우에는 return되는 형식을 몰라서 조금 시간을 잡은 적도 있다.

*knex("table_name").select(*) 의 return은 [{row1_field1: "row1의 field1의 값"}, {row2_field2: "row2의 값"}]이다.

 

4. 설치 방법

Node.js의 패키지이다보니 npm install 명령어를 통해서 설치할 수 있다.

$ npm install knex --save

이후 configuration을 해야하는데 이것은 knexjs.org/#Installation 에서 정확하게 확인하길 바란다.

 

5. 글쓴이는 왜 사용하게 되었나?

2020년 4학년 캡스톤 디자인에서 웹페이지를 개발할 때 PostgreSQL를 사용해서 데이터베이스를 구축했다. 이때 knex를 사용하게 되었는데 1학기에는 BackEnd를 만질 줄 아는 사람이 1명밖에 없었고 새로 배우기에는 시간이 너무 없어서 만질줄 아는 1명말고 나머지 4명은 FrontEnd기능만 맡아서 했다. 때문에, knex를 다뤄볼 일이 없었는데, 2학기에 캡스톤디자인2에서는 refactoring를 BackEnd 중심으로 진행하게 되었다. 다들 처음만질 때는 익숙하지 않다보니 막막했는데 계속 만지다보니 나름 재미도 느낀다. 하지만 BackEnd 설계 성격상 하나의 기능을 추가하거나 기존의 코드에서 바꾸려고하니 머리가 너무 아프다...

 

6. 결론

knex 카테고리에는 내가 knex를 다루면서 찾기 힘들었던 부분, 헤맸던 부분 등등 을 정리하기 위해서 만든 카테고리다. 그래도 해당 카테고리의 글을 작성하기전에 knex가 어떤 것인지는 설명하는 글이 있어야할거 같은 느낌이 들어서 작성해본다.

* 해당 문제풀이는 Python을 이용했습니다.

1. 문제 파악하기

- 마라톤에 참가한 선수들이 있는데 그 수는 1명 이상, 100,000명 이하이다.

- completion의 길이는 participant의 길이보다 1 작다. → 완주하지 못한 사람은 1명이다.

- 참가자 이름은 알파벳 소문자로 이루어져 있으며 동명 이인이 있을 수 있다.

 

2. 문제 접근하기

우선 참가자 이름들이 들어 있는 participant와 완주자 이름들이 들어있는 completion은 리스트로 들어 있다. 가장 쉽게 해결하는 방법은 participant와 completion을 먼저 정렬한 다음 for문을 돌면서 같은 index 에 같은 원소가 아닌 참가자 이름을 찾아내면 된다. 파이썬은 리스트에 대한 다양한 함수들이 있으며 이 함수들을 이용하면 다른 언어보다 쉽고 빠르게 코드를 작성할 수 있다는 장점이 있다. 파이썬을 사용한다면 이 장점을 잘 사용하는 것이 중요하다.

 

3. 주의할 점

- for문을 돌릴 때 participant를 기준으로 돌리면 어떻게 될까

→ 문제 파악하기의 2번째에서 확인 할 수 있듯이, completion의 길이가 participant의 길이보다 1 작기 때문에, participant를 기준으로 돌리게 된다면 participant의 마지막 원소까지 갔을 때, index에러가 발생할 수 있다. 따라서 for문은 completion을 기준으로 해야한다.

 

- completion의 원소를 다 찾았는데도 발견을 못한 경우는?

→ for문을 통해서 completion의 원소를 다 확인했는데도 정답을 찾지 못했다는 뜻은 무엇일까? 바로 participant의 마지막 원소가 정답이라는 뜻이다. 따라서 for문을 통과한 뒤에 answer가 빈 문자열인지 확인하는 if문이 필요하다.

 

4. 정답 코드

따라서 정답 코드는 아래와 같다고 할 수 있다.

participant와 completion을 정렬한 뒤, completion을 기준으로 for문을 돌린다. 이때 participant의 i번째와 completion의 i번째 가 다르다는 것은 i번째 participant가 completion에 없다는 뜻이므로 이 사람이 완주를 하지 못한 사람이다. 정답을 찾은 뒤에는 뒤에 원소를 굳이 볼 필요가 없으므로 break문을 통해서 빠져나온다. 이렇게 찾았다면 다행이지만 completion의 마지막 원소까지 보았을 때 answer를 찾지 못한 경우(paritipant의 마지막 원소가 정답일 때)가 있으므로 if문을 통해서 확인을 해준다.

정답 코드

 

5. 문제점

이 코드는 정답처리가 되긴한다. 정답처리가 되지만 과연 이 코드에 문제가 없다고 할 수 있을까? 이런 단순한 코드에는 여러 문제가 있을 수 있지만 가장 먼저 떠오르는 것은 호율성 문제이다. 이번 문제는 level 1이기 때문에 프로그래머스에서 호율성 테스트 통과 기준을 엄청 쉽게 해놨을 것이다. 만약 실제 코딩테스트에서 이런식으로 간단하게 코드를 작성했을 경우, 시간초과가 나타날 가능성이 높다.

실제 이번 문제에서 제출 버튼을 눌렀을 때 실행시간을 보면, 만족스럽지 못할 것이다.

정확성 테스트 결과
효율성 테스트 결과

 

코드가 간단해서 나쁠건 없다. 하지만 코드가 간단하면 실행시간이 오래걸리는 경우가 많고 너무 단순하게(1줄 코드)로 작성하면 처음 보는 사람은 '이 코드를 왜 이렇게 작성했을까?' 라는 생각이 들 수 도 있다. 이 trade off관계를 잘 조절하는 것이 중요할거 같다.

 

그렇다면 이 시간 문제를 어떻게하면 조금 더 줄일 수 있을까?

그 힌트는 문제 옆에있는 해시에 있다.

프로그래머스는 문제 옆에 어떤 알고리즘을 사용하면 좋은지 나와있다.

 

해시에 대해서 간단하게 설명하자면 키값마다 다른 값이 만들어진다. 파이썬에는 hash 함수가 기본으로 사용할 수 있는데 hash("a")와 hash("b")는 다른 값이 만들어진다.

따라서 hash 함수를 이용해서 코드를 작성하면 다음과 같이 적을 수 있다.

hash 함수를 이용한 정답

 

해당 코드로 제출 버튼을 누르면 다음과 같은 시간이 걸린다.

정확성 테스트 결과
효율설 테스트 결과

 

정확성 테스트에선 그렇게 큰 차이가 없지만 효율성 테스트에선 꽤 많은 차이가 나는 것을 확인할 수 있다.

 

6. 마치며

알고리즘 문제를 풀고나면 정답을 맞춘 것도 좋지만 다른 사람은 어떻게 생각을 했고 어떤 식으로 작성했는지 확인하는 것도 도움이 많이 된다. 가끔씩은 나도 모르던 함수를 이용해서 엄청 쉽게 푼 사람들도 있으며 어떤 사람은 문제 해결 시작을 나와 다른 방향으로 진행해서 해결한 사람들도 있다.

+ Recent posts