[Reminder] 알고리즘에 진심인 사람들의 인터뷰
안녕하세요 SSAFYCial 박철순 기자입니다 : )
벌써 SSAFY 입과 한 지 3개월 되어 가네요.
최근 "SW 역량 테스트"와 "기업 코딩테스트" 를 준비하며
많은 싸피생분들이 알고리즘 역량 향상에 대해 관심을 가지고 있는데요.
이번 포스팅이 알고리즘 관련 동기부여와 인사이트를 얻어 갈 수 있을 거라 생각합니다!!
이번에는 서울 16반의 "백준 플래티넘 등급"과 "삼성 역량테스트 B형 취득자" 5명을 대상으로 인터뷰를 진행했습니다.
Q. 주 사용 언어를 정한 계기가 있다면 무엇인가요?
[홍** 님] SSAFY에 입과하며 Java를 자연스럽게 사용하게 되었습니다.
[이*승 님] 파이썬을 고른 계기는 기존에 사용하던 언어(Java, C++)보다 짧고 간결하게 코드를 작성할 수 있어서 고르게 되었고 Java는 B형 취득과 SSAFY에서 사용해서 고르게 되었습니다.
[조** 님] Java를 더 잘 하고 싶어서 알고리즘을 풀 때도 Java로 하고 있습니다.
[이*재 님] 학교에서 자료구조 수업을 들었을 때 C++로 실습했었습니다. 그게 익숙해서 알고리즘을 공부할 때 C++로 시작했습니다.
[노** 님] 대학교에서 C와 C++ 위주로 계속 강의를 듣거나 공부를 해서 알고리즘 문제도 익숙한 C++로 풀고 있습니다.
모두들 처음 익숙해진 언어를 자연스럽게 사용하고 있는 것 같습니다. 실제 인터뷰 결과는 다들 대부분 C++, Java 두 가지 모두 잘 사용하며 자료구조나 라이브러리 등 사용 방법이 비슷해서 크게 다른 점이 없다고 합니다.
저는 기존에 주로 파이썬을 사용했는데, 최근 삼성 SDS Pro 등급이나 B형 취득에 관심이 생겨서 Java를 주언어로 사용하기 위해 노력하고 있습니다.
Q. 사용하시는 언어의 장점은 무엇인가요?
[홍** 님] Java는 명확한 객체 관리가 가능하다는 점이 장점이라고 생각합니다.
[이*승 님] Python은 짧고 간결한 코드 작성과 다양한 내장 함수가 장점입니다.
[조** 님] Java는 가독성, 유지보수성, 확장성 등에 유리합니다. (다만, 알고리즘 문제를 풀 때는 무의미한 것 같습니다.)
[이*재 님] C++은 우선 실행 속도에서 이점이 있습니다. 다른 언어에 비해서 매우 빠른 실행 속도를 보여줍니다.
[노** 님] C++은 실행 시간이 빠르고 가독성이 좋은 것이 장점입니다
문제 풀이에 있어서 가독성과 객체 관리가 디버깅 등에 이점이 있어 이러한 장점을 강조하는 것 같습니다. 또한 C++의 실행 속도의 이점은 복잡한 문제, 테스트 케이스 전체 5초 등 최적화 문제 관련해서 장점이 있습니다.
Q. 문제는 총 몇 문제 정도 푸셨나요?
[홍** 님] 총 200 문제 정도 풀었습니다. SSAFY입과 이후 150 문제 정도 풀었습니다. SSAFY 실습 문제 위주로 풀었던 것 같아요.
[이*승 님] 총 460 문제 풀었습니다. SSAFY입과 이후 100 문제 정도 풀었습니다.
[조** 님] 백준 기준 총 597 문제 풀었습니다. SSAFY입과 이후 200 문제 풀었습니다.
[이*재 님] 총 950 문제 정도 풀었습니다. SSAFY입과 이후 320 문제 정도 풀었습니다.
[노** 님] 총 616 문제 풀었습니다. SSAFY입과 이후 260~270문제 정도 풀었습니다.
다들 평균적으로 500 문제 정도 푸신 것 같습니다. 현재 SSAFY 입과 90일이 지난 지금 100 문제 넘게 푸셨다는 것은 "1일 1알고리즘"을 넘어 "1일 3알고리즘"까지 하는 분도 있습니다.
처음에 "1일 1알고리즘"을 목표로 도전하는 분들이 많습니다. 그 처음 의지를 가지고 꾸준히 해나간다면 모두 플래티넘 등급, B형 취득을 넘어 코딩테스트 합격을 할 수 있을 것 같습니다!
Q. SSAFY교육이 끝나면 6시 인데, 이 후 문제는 언제 푸시나요?(푼다면 몇 문제 정도 푸시나요)
[홍** 님] 그날 오후 11시에 앉아서 한 문제 정도는 풀어보려고 노력하는 편입니다.
[이*승 님] 일주일에 5문제 풀기를 목표로 하고 있습니다.
[조** 님] 21:00 ~ 23:00 에 주로 문제를 풀고 있습니다.
[이*재 님] 같은 반 분들과 함께하는 알고리즘 스터디에서 8시 반 정도에 1~2 문제 정도 같이 풉니다.
[노** 님] 집에 도착해서 저녁 먹고 밤 8시 이후에 풉니다. 잘 풀릴 때에는 하루 8~9 문제, 평균 4~5 문제 풀어요. 싸피에서 Front-End 과정 시작한 이후로는 많이 못 풀었습니다.
인터뷰 대상자 중 두 분은 실제로 저와 함께 알고리즘 스터디를 하는 멤버입니다. 저는 일주일에 5 문제도 못 푸는 경우가 꽤 있었는데, 두 분은 항상 모의 코테 문제까지 모두 풀어옵니다. 그러한 노력이 있었기에 알고리즘을 다들 잘하시는 것 같습니다. 저도 이번 주부터는 반드시 모든 문제를 풀어야겠어요.
Q. 알고리즘 유형에 대한 자신만의 코드 템플릿이 있나요?
[홍** 님] 저는 보통 (브루트포스 문제 / 아닌 문제), (시뮬레이션 문제 / 아닌 문제)로 나누어서 생각하는 편인 것 같아요.
[조** 님] 입출력, 다익스트라 등 익숙하게 짜는 유형이 일부 있습니다.
[이*재 님] 저는 템플릿을 잘 만들지 않습니다. 제 목적 자체가 대회라기보다 코딩테스트의 통과이기 때문에 템플릿 없이 처음부터 구현하는 것을 선호합니다.
[노** 님] 유니온 파인드나 다익스트라, 위상정렬 등 그래프 문제에는 익숙한 패턴이 있는데 그 외에는 딱히 없습니다.
알고리즘 문제 특성상 유형이 비슷할 수 있지만 문제마다 요구하는 자료구조, 아이디어가 너무 다양해서 템플릿에는 크게 관심이 없는 것 같습니다.
Q. 한 알고리즘 유형에 익숙해지는데 얼마나 걸리셨나요?(문제 수, 기간)
[이*재 님] 그래프 같은 경우 유형이 생각보다 적기 때문에 20문제 정도에 감을 잡았지만 DP나 그리디와 같은 유형은 100문제 가까이 풀었는데도 아직도 익숙하지 않습니다. 하지만 한 유형에 대해 100문제 정도 푼다면 어느 정도 익숙해진다고 볼 수 있는 것 같습니다.
[노** 님] 기간은 잘 모르겠지만 5 문제 이상 풀면 익숙해지는 것 같습니다.
Q. 문제에 접근하는, 풀이를 떠올리는 자신만의 순서나 방법이 있나요?
[홍** 님] "일단 구현하고 최적화 하기!"
문제를 보고 브루트 포스로 구현하고 이후 최적화 방법을 생각하는 방법을 선호합니다. 최대한 선형 연산을 피하고 log나 상수 연산으로 줄이려고 노력합니다.
[이*승 님] "일단 시도하기!"
[조** 님] "순차적 접근, 구체적 설계하기!"
문제 이해 -> 문제 접근 방법(아이디어) 모색 -> 적용 알고리즘 떠올리기
[이*재 님] "주어진 범위를 보고 시간복잡도, 공간복잡도에 따라 풀이 범위 줄이기!"
저는 항상 문제에서 주어진 숫자에 집중합니다. 예를 들어 N이 10만인 범위인 경우 O(N^2)로 풀지 못한다는 뜻이겠죠. 그렇게 되면 생각할 수 있는 풀이의 범위가 줄어 들게 됩니다. 이런식으로 [공간 복잡도]와 [시간 복잡도]에 따라 풀이를 소거하면 접근할 수 있는 풀이가 줄어듭니다. 그 후 생각나는 풀이를 지워가거나 보완하고 구현을 시작합니다.
[노** 님] "경험을 바탕으로 접근, 테스트케이스에서 규칙 찾기"
아직 풀이를 빠르고 완전하게 증명할 능력은 되지 않아 이전에 풀었던 다른 문제들의 경험을 바탕으로 추측하면서 접근합니다. 예제로 주어진 테스트 케이스를 잘 읽고 어떤 규칙으로 결과가 저렇게 나왔을까 고민하는 것도 좋은 방법인 것 같은데 테케가 하나밖에 없으면 큰 성과는 없어서 아쉽습니다. 저는 45분 안에 안 풀리면 백준의 경우 알고리즘 유형을 볼 수 있기 때문에 그걸 열어서 힌트를 얻습니다. 그래도 한 시간 넘게 계속 안 풀리면 구글링 해서 다른 사람의 풀이를 참고합니다.
구현+최적화, 일단 시도하기, 이전 문제랑 비슷한게 없는지 생각하기, 시간복잡도 고려하며 자료구조 및 알고리즘 떠올리기 등 자신만의 방법으로 접근하는 것을 볼 수 있습니다. 문제 접근이 어려운 분들은 다음과 같은 방법을 적용해보는 것도 좋은 것 같습니다.
Q. 풀이 중간에 잘못되었음을 깨달았을 때 디버깅, 수정은 어떻게 하시나요?
[홍** 님] 접근 방법이 잘못 되었다고 생각될 때는 다 지우고 다시 생각하는 편입니다. 에러가 나면 그 부분을 따라가면서 수정하는 편입니다.
[이*승 님] 이전 풀이를 떨쳐내기 위해서 전체를 지우고 다시 합니다.
[조** 님] 인텔리제이의 디버깅 기능을 활용합니다.
[이*재 님] 문제에 따라 다른 것 같습니다. 너무 오랫동안 헤맨 문제라면 문제에서 요구하는 방법과 아예 다른 접근을 하고 있을 가능성이 높습니다. 따라서 처음부터 생각하는 것도 방법인 것 같습니다.
[노** 님] 변수의 값이 바뀌는 부분에 주요 변수들을 출력해서 값을 확인하며 실행해 봅니다.
공통점으로는 다 지우고 다시 시작하는 방법을 많이 하는 것 같습니다. 저는 이전에 작성한 코드 일부만 바꾸면 될 거라는 착각에 오랫동안 붙잡고 있는 경우가 많았는데 앞으로 문제 풀 때 삭제를 두려워하지 않도록 해야겠네요.
Q. 한 주제(알고리즘 유형)을 공부할 때 어떤 방식으로 공부하시나요?
[조** 님] 관련 알고리즘 원리를 기술 블로그 또는 유튜브를 참고해 이해하고 이 후 여러 개의 문제를 풀이합니다.
[이*재 님] 저는 한 주제를 공부하는 것보다 같은 백준 티어나 한 대회의 문제같이 "여러 유형"이 들어있는 문제들을 푸는 것을 선호합니다. 저는 해당 유형을 잘 구현하는 능력보다 "유형을 모른 상태로 그 풀이로 접근할 수 있는 능력"이 중요하다고 생각합니다.
[노** 님] 처음 접하는 알고리즘의 경우 책이나 구글링 등을 이용해서 우선 이해를 한 뒤 풀이를 보고 한-두 문제를 해결해 본 후 비슷한 유형의 문제를 풀이를 보지 않고 직접 풀어봅니다.
Q. 문제를 풀면서 자신만의 변수명, 메서드명, 메서드 순서를 정하는 규칙이 있으신가요?
[이*승 님] 주로 언어 컨벤션에 따르고, 출력하는 답은 answer로, 개수는 count로, 격자는 board로 많이 쓰고 있습니다.
[조** 님] 문제에서의 의미와 기능에 맞게 네이밍(카멜케이스)하려고 노력합니다.
[이*재 님] a b c d e f g h i j k l m n o p 간단하게 하려고 합니다.
[노** 님] 규칙은 딱히 없지만 메소드 이름은 동사로 짓고 변수명은 명사로 짓는 것이 좋다고 생각합니다.
자신의 네이밍 규칙이 생긴다면 코드를 작성하는, 문제를 풀이하는 방법이 빨라진다고 생각합니다. 실제 시험에서는 문제 풀이에 있어서 네이밍 고민에 너무 많은 시간을 투자하지 않는 것이 좋다고 느끼고, 실제로 그렇게 하고 있습니다.
Q. 최근 관심 있는 알고리즘 유형이 있다면 무엇인가요? 관심을 갖게 된 이유는 무엇인가요?
[홍** 님]
알고리즘: 다양한 자료구조 구현을 직접 해보려고 노력하고 있습니다.
이유 : 자료구조를 직접 구현해보면서 상황에 따른 시간 복잡도를 생각해보고 최적화 할 수 있는 부분은 없는지 생각해보는 과정이 도움이 많이 된다고 느낍니다.
[이*승 님]
알고리즘 : 세그먼트 트리
이유 : 이름은 익숙하지만 내용 자체는 모르겠어서
[조** 님]
알고리즘 : 다이나믹 프로그래밍(DP)
이유: 다이나믹 프로그래밍 역량 부족
[이*재 님]
알고리즘 : 다이나믹 프로그래밍(DP) 잘하고 싶습니다.
이유 : 워낙 문제 유형이 다양해서 창의적인 풀이도 많아서 풀 때마다 새로운 것 같습니다.
[노** 님]
알고리즘: 정수론
이유 : 대학교 때 암호학 강의를 수강 했었는데 그 때 이후로 관심이 생겼고 요즘 복습을 하고 있습니다
실제 어려운 문제는 세그먼트 트리, 유니온 파인드, DP 에서 많이 출제 된다고 합니다. 그래서 다들 이러한 유형에 관심이 많은 것 같습니다.
Q. 현재 알고리즘 역량 향상 관련해서 고민이 있다면 무엇인가요?
[홍** 님] 모두가 그렇듯이 실력 향상이 더딘 것 같아 고민입니다. 문제를 많이 풀어서 익숙해지는 방법 밖에는 없는 것 같네요.
[이*승 님] B형을 취득하지 못하는 우물 안 개구리가 된 내 자신..
[조** 님] 실력 증가가 눈에 띄게 보이지 않는 것이 고민입니다.
[이*재 님] B형 따고 싶습니다. 혹시 B형을 따고 싶으신 분들은 홍**님에게 문의하세요.
[노** 님] DP와 그리디를 잘 풀고 싶어요!! 어려워요. 특히 트리 DP...
SSAFY에서는 SW 역량테스트 모의 A형, A+형을 대상으로 B형 시험에 대한 기회를 주고 있는데, 알고리즘에 관심 있는 싸피생이라면 모두 B형 취득을 하고 싶어 하는 것 같습니다.
Q. 현재 SSAFY많은 교육생분들에게 알고리즘 역량 향상을 위해 해주고 싶은 말이 있다면?
[홍** 님] 다들 열심히 노력해서 원하는 기업 원하는 직무로 일할 수 있기를 바랍니다. 파이팅.
[이*승 님] 화이팅!
[조** 님] 하나의 문제를 풀더라도 해당 문제를 깊이 있게 이해하고 분석하는 것
[이*재 님] 싸피분들 B형 취득을 위해 같이 힘내요
[노** 님] 유형 별로 접근을 하는게 가장 실력 상승에 도움이 되는 것 같고 그런 점에서 백준 사이트의 "단계 별로 풀어보기"나 "문제집"들을 풀어보는 것을 추천합니다.
마치며
이상으로 인터뷰 내용을 모두 공유하였습니다. 다들 시간 내서 많은 질문에 답변 해주시느라 고생하셨습니다!!
제가 다음 주에 꼭 커피 한 잔 사겠습니다!
백준 티어나 B형 취득이 알고리즘 실력의 지표는 아니지만 인터뷰 대상자들을 지켜본 결과 알고리즘 문제 풀이에 있어서 누구보다 많이 고민하고, 실력 향상을 위해 노력하고 있습니다. 또한 많은 문제를 풀지만 대충 풀지 않고 한 문제 한 문제 더 나은 풀이를 고민하고 있습니다.
저도 이러한 분들과 함께 스터디도 하고, 조언도 구하며 알고리즘 문제 풀이에 대한 즐거움을 느끼며 역량 향상을 위해 노력하고 있습니다.
여러분들도 주변에 숨은 고수들을 찾아 함께 알고리즘 문제 풀이를 더욱 즐겁게 해보세요!!
코딩 테스트가 취업의 벽이 되지 않도록 다같이 화이팅 해보아요 : )