안드로이드 연구소

프로그래머스 Lv1을 풀기 위한 과정 본문

스타트업을 위한 작은 코딩테스트

프로그래머스 Lv1을 풀기 위한 과정

안드로이드 연구원 2023. 7. 28. 01:10

안녕하세요. 안드로이드 연구원입니다.

지난 잔소리 포스팅을 올리고 지인들에게 좋은 얘기들을 많이 들어서

정말 기분 좋은 하루였습니다.

 

그리고 몇 분들은 어떻게 코딩 테스트를 준비했냐고

바로 물어보시더라구요.

 

그래서 이번 포스팅에 저번에 얘기했듯이 한달간 코딩테스트를 준비한 과정을 

한번 적어보려고 합니다.

 

1. 초보가 왕초보에게 하는 레슨

저는 코딩 테스트에 관한 글을 올리고 있지만

아직도 코딩 테스트 잘하는 편은 절대 절대 아닙니다.

 

제 수준은 객관적으로 아래와 같습니다.

-프로그래머스 1단계는 20분내로 풀 수 있는 수준

-백준 실버3 이하까지는 무난하게 풀고 실버1,2부터는 힘겹게 풀 수 있는 수준인 것 같습니다.

 

그럼에도 왜 이 글을 쓰고 있냐?

<역행자>저자인 CEO'자청'과 <아웃풋의 법칙>저자인 부동산 유튜버 램군은

초보가 왕초보를 가르칠 수 있다. 고수가 왕초보를 가르칠 때보다 더 큰 효과를 낼 수 도 있다고 했습니다.

 

 

2. 온라인 유료 강의를 들은 솔직한 후기

저도 딱 한달전 프로그래머스 1단계부터 무작정 풀어보려했는데

솔직히 잘 되지가 않았습니다.

그래서 벽을 느끼고 정말 하기 싫어졌습니다.

 

그리고는 효율적으로 공부할 수 있는 방법을 찾다가

패스트 캠퍼스의 온라인 유료 강의를 들었습니다.

 

 

 

핵심 유형 20개로 한 번에 끝내는 알고리즘 코딩테스트 with Java 초격차 패키지 Online이란 강의였는데

해당 강의 이분 강의 챕터를 듣게 된다면

이론 강의 1개를 듣고 해당 유형의 5-6개 문제를 푸는 수업이었습니다.

 

물론 수업을 들을 때는 이해가 되고 강의를 듣고

알고리즘(구간합, 이분탐색, 투포인터)을 이해하고 구현할 수 있게되고

강사님이 내어준 몇 몇 문제들을 풀 수 있게 되었습니다.

 

하지만...

 

3. 다시 프로그래머스 Lv1 도전

강사님의 챕터1 강의 프로세스가 끝나고

어느정도 기본기는 다졌다 생각하고 

프로그래머스 Lv1 문제를 다시 풀어보았습니다. 

 

근데 이게 왠걸 Lv1 문제들의 몇 몇 문제들이 여전히 풀리지가 않았습니다.

구간합, 이분탐색, 투포인터 같은 알고리즘을 잔뜩 들고가서

문제를 풀 생각이었는데 해당 유형의 문제들이 전혀 아니었습니다. 

 

또 한번 낙담을 느끼고 있었다가 코딩 테스트는 나랑 정말 맞지 않구나하고 포기하려했습니다.

그러다가 이 이해도 잘되고 어떻게 해야할지 대충 감도 오는 이 문제들이 왜 풀리지 않을까 생각하며

Lv1에 있는 문제들은 어떤 유형인지 찾아보았습니다.

 

Lv1들의 유형들은 바로 문자열 해쉬(Map & Set)가 대부분 이었습니다.

제가 Lv1에서 맞출 수 있는 문제는 "문자열"이었고,

이해는 되지만 풀 수 가 없었던 문제 대부분은 "해쉬"였습니다.

 

 

4. 첫번째 유투브로 Hash를 이해하기

해시(Hash)라고하면 삽입, 삭제, 찾기가 무지 빠른 자료구조 정도로만 

수업 시간에 배운 기억만 남아 있고 어떤 것인 제대로 알지 못했습니다.

 

그래서 가장 먼저 유투브"Hash 자료 구조 설명", "Hash란" 같은 검색한 다음

노마드코드, 동빈나, 기타 많은 유투버들 강의 중 5-10분짜리 영상 하나를 보았습니다.

 

그런 강의를 듣고 아래와 같이 가볍게 이해하였습니다.

"Hash는 Array의 읽기, 쓰기를 할 때 시간 복잡도가 많이 소요되는 문제를 해결할 수 있는 자료구조구나!"

 

5. 두번째 블로그에서 Hash 사용법을 찾기

그 다음 블로그에서 실제 자신이 코딩 테스트를 치룰 언어로 어떻게 구현할 수 있는지 찾아보았습니다.

"코틀린 Hash 설명"과 같이 검색하여 아무 포스트를 들어가서 보았습니다.

 

거기서 Hash는 중복된 요소를 없앨 때 Set이라는 자료구조를 사용하고

key값을 통한 Value를 찾아야할 때 Map이라는 자료구조를 사용하는걸 알게되었습니다.

 

그리고 Set을 구현할 때 mutableSetOf()로 변수를 선언하고

add나 remove메서드를 사용해서 값을 넣구나 정도를 확인했습니다.

val animals = mutableSetOf("Lion","Dog","Cat","Python","Hippo")
println(animals)    //  [Lion, Dog, Cat, Python, Hippo]

animals.add("Bird")
println(animals)    //  [Lion, Dog, Cat, Python, Hippo, Bird]

animals.add("Bird") //  중복으로 넣어도 하나만 들어감
println(animals)    //  [Lion, Dog, Cat, Python, Hippo, Bird]

animals.remove("Python")
println(animals)    //  [Lion, Dog, Cat, Hippo, Bird]

 

마찬가지로 map 또한 이렇게 사용하구나라는걸 알게되었습니다.

    val langMap: Map<Int,String> = mapOf(1 to "Java", 2 to "Kotlin", 3 to "C++")
    for((key, value) in langMap){
        println("key=$key, value=$value")
    }
    
    println("langMap[22] = ${langMap[22]}") 		//  langMap[22] = Kotlin
    println("langMap.get(22) = ${langMap.get(22)}") 	//  langMap.get(22) = Kotlin
    println("langMap.keys = ${langMap.keys}")   	//  langMap.keys = [1, 2, 3]

 

 

6. 코딩테스트 고득점 Kit(여기가 뽀인트!!!)

이렇게 유튜브로 개념을, 블로그로 구현방법을 간단히 익히고 문제를 다시 풀어보려 떠났습니다.

프로그래머스의 Hash만 있는 문제를 풀기 위해 유형별로 모은 프로세스를 찾았습니다.

 

그러던 중 아래와 같이 "프로그래머스 코딩테스트 코득점 Kit"라는 곳을 찾게 되었는데요.

https://school.programmers.co.kr/learn/challenges?tab=algorithm_practice_kit 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

이는 프로그래머스가 실제 기업들에서 치르는 코딩테스트 유형들을 파악해

가장 많이 나오는 부분을 추려놓은 문제들이었습니다.

 

 

7.  고득점 Kit에서 풀어야 할 유형

Lv1에서 나오는 대부분의 문제는 알고리즘을 요구하는 문제는 거의 없었고

지금 제가 라이언으로 표시해놓은 3가지 "해시", "정렬", "완전 탐색"
정도 였습니다.

 

우선 저 세가지 유형을 아까와 같이 유투브와 블로그를 보고 개념을 익히고

해시 5문제, 정렬3문제, 완전탐색3문제를 풀어보는 것을 추천합니다. 

티스토리는 왜 색연필같은걸 칠할 수 없는걸까? 나만 못하는거면 바보라 놀리고 가르켜주세요.

 

8. 프로그래머스 Lv1 Re Re Try

피 터지는 훈련(?)이 끝나고

또 또 다시 Lv1의 문제를 풀러가보았습니다.

 

전에 안 풀렸던 문제들을 다시보니 아래와 같은 눈이 생겼습니다.

"아 이 문제는 Array를 쓰는게 아니라 Map을 사용해야하구나"

"이때는 중복 요소를 제거해야하니 Set을 사용해야하네?"

"이건 object class 데이터를 생성해서 Comparator로 정렬해야하지"

"이건 그냥 이중 반복문으로 모든 요소들을 확인해도 시간복잡도에 문제가 없겠어"

 

문제를 풀면 풀수록 

아 이 문제는 Map을 써야해, 이 문제는 완전 탐색, 이 문제는 단순 문자열로 풀어야하네

같은 견해가 생기면서 문제를 푸는 것은 물론이고

정말 빠르게 문제가 풀려가기 시작했습니다(빠른 것들은 5분 ~ 느리면 20분정도)

고작 레벨1을 풀고 바라본 나의 모습(레벨 5까지 있음^^;)

 

9. 더욱이 단련하기 위해서는

이렇게 알고 문제를 풀다보면 재미를 느껴서

해당 유형의 문제들이 조금 더 풀어지고 싶어질 수 도 있습니다.(아님 말고)

 

하지만 프로그래머스의 유형별로 정리된 것은 위의 고득점 Kit밖에 없어서

더 풀기가 어렵습니다.

 

그럴 때 를 위해서 꿀팁!

백준사이트를 들어가게 되면 아래 링크처럼 엄청 세분화 해놓은 유형 모음이 있습니다.

https://www.acmicpc.net/problem/tags

 

알고리즘 분류

 

www.acmicpc.net

 

여기를 순서대로 풀지말고

저처럼 Ctrl + F 찾기를 통해 "정렬"과 "브루트포스(완전탐색)" 같은 키워드를 타고 들어가면

티어별 문제들을 만나실 수 있습니다.

낮은 티어의 문제들부터 높은 문제들의 티어들을 점점 높여가면서 풀어가보시기 바랍니다.


여기까지가 제가 한달동안 공부했던 후기입니다.

프로그래머스에서는 약 50문제 정도 풀었고

백준도 이와 비슷한 정도라고 생각합니다.

 

근데 이 글에서 보면 제가 프로그래머스 문제에 쫌 집착한다고 생각하실 수 있습니다.

집착하는게 맞고 그 이유는

스타트업들에서 코딩테스트는 전부 프로그래머스 통해서 치르기 때문입니다.

 

저는 코딩테스트를 공부하기 이전에

서류에 합격해 두번정도 경험삼아 코딩테스트를 쳐본적이 있는데요.

 

이때 난이도는 기업마다 너무 다르지만

제가 느꼈을 때 Lv1 두문제, Lv2 한문제 정도 되지 않을까 생각합니다.

(대기업은 Lv3정도라고 합니다.)

 

앞으로는 더 오래걸리고 어려운 기본 내용들을 습득해야하겠지만

Lv2도 "고득점 Kit 유형별 찾기" -> "유투브와 블로그의 개념 학습" -> "프로그래머스와 백준으로 해당 유형 연습"

과정을 밟아간다면 충분히 해낼 수 있다고 생각합니다.

 

그럼 이제 Lv2를 향한 여정을 한번 떠나보도록 하겠습니다.

준비되는대로 글을 포스팅하겠습니다.

읽어주셔서 감사합니다.

Comments