본격적으로 알고리즘 공부를 시작할 무렵 처음 접했던 사이트는 백준이었기에,
프로그래머스를 본격적으로 사용해 본 경험은 지난 카카오 코딩 테스트...가 처음이었다.
(쓰디쓴 기억이었다....ㅜㅜ 난 최선을 다했어.....)
개발자 취업 관련 기사들을 찾아보았을 때에, 프로그래머스 스킬 레벨 위주로 언급하는 경우가 많은 것을 보고
간만에 프로그래머스를 찾았다.
실력 체크
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
레벨별 설명을 읽고 있자니 레벨 1까지는 그냥 가능할 것 같은데,
레벨 2부터는 어느 정도 난이도의 문제가 나올지 아직은 명확하게 느낌이 오지 않았다.
일단 집에서 여유를 가지고 도전하는 것이 좋으리라 생각하여 늦은 밤 잠자리 정비를 마친 뒤
본격적으로 레벨 1부터 공략을 시작하였다.
나의 경우 첫 번째 문제는 그냥 배열에 담긴 모든 int 원소의 평균을 구하는 것이었다.
몇 분 소요하지도 않고 풀이를 끝냈다.
두번째 문제는 배열의 Slicing만 사용할 줄 안다면 역시 금방 풀 수 있는 문제였다.
최근 Python을 복습하면서 주구장창 연습했던 것이 다양한 배열의 Slicing이었다.
아마 금방 풀리겠지? 하는 마음으로 Java API를 잠시 찾아 Arrays.copyOfRange를 사용하였다.
범위를 지정하기 위한 인덱스를 어떻게 지정할지를 고민하며 문제를 다시 읽어보니,
parameter로 주어진 인덱스 관련 값이 1 이상으로 정의되어 있었다.
따라서 배열의 각 원소에 실제 접근하는 과정에서는 모든 인덱스 parameter 값에서 1씩 빼는 과정을 추가하였다.
여차저차 코드 자체는 잘 쓰인 것 같은데, 자꾸만 틀린 값이 답으로 나온다.
무엇이 잘못된 것일까를 5분 정도 고민한 것 같다.
System.out.println()을 활용하여 중간중간 스텝별 결과값들을 확인하던 중,
그제야 지문에 적혀있는 정보를 하나 더 발견하고 말았다.
배열을 잘라낸 후 오름차순으로 '정렬'한 뒤 지정된 인덱스의 값을 꺼내야 했던 것이다!
Arrays.sort 함수를 한 줄 쓰고 나니 순식간에 맞았습니다! 가 튀어나오고 말았다.
다소 허탈하긴 했지만, 큰 어려움 없이 레벨 1은 총합 20분 정도 소요하여 풀이를 마무리하였다.
시계를 보니 열두시가 갓 넘은 시간으로, 이대로 자기에는 약간 이른(?) 시간이지 않나 싶었다.
레벨 2의 난이도가 선뜻 짐작이 가지 않아 고민이 되긴 했지만, 한시 전에만 끝내자는 마인드로 시작 버튼을 눌렀다.
레벨 2의 첫 문제는 길이가 동일한 두 1차원 배열에서 임의의 원소를 하나씩 뽑고, 이를 곱하여 더하는 과정을
모든 원소들에 대하여 진행한 뒤 나오는 최소값을 구하는 것이었다.
문제를 막 읽었을 무렵에는 음.. 브루트포스 알고리즘을 써서 최소값을 구하면 되는건가?
하고 생각하며 중첩 for문을 작성하고 있었다.
그러던 중 문득 드는 생각.
당연히 큰 수에는 작은 수를 곱해야 두 수의 곱이 작아지는 것 아닌가?
그 순간 느꼈다. 이 문제는 그리디 알고리즘이다.
두 개의 배열을 각각 오름차순-내림차순으로 정렬하거나,
둘 다 오름차순으로 정렬한 뒤 인덱스의 접근 방향을 반대로 해주어 서로 곱한 값들의 합이 이미
두 배열에서 구할 수 있는 최소값이다.
아이디어를 떠올린 뒤 풀이 과정은 순식간이었다. 깔끔하게 효율성 테스트까지 패스할 수 있었다.
두 번째 문제는, 백준에서 풀이한 기억이 생생한 소괄호 짝 맞추기였다.
Queue가 아무래도 손에 익었다 보니 망설임 없이 Queue를 사용하긴 했지만,
Stack을 사용하던 Deque를 사용하건, poll()을 시전했을 때 들어있던 원소가 하나씩 잘만 빠져나온다면 문제 없다.
제네릭의 경우도 String으로 하기보다는 Integer로 설정하는 것이 속도가 더 빠르지 않을까 하여,
parameter.charAt(i)에서 여는 괄호가 등장할 때마다 Queue에 Integer 1을 하나씩 넣어주었다.
만약 닫는 괄호가 나왔을 때 Queue가 텅 비어있다면
이미 이 괄호들은 잘못되었기 때문에 flag를 false로 처리한 뒤 break를 걸어주었고,
최종적으로 Queue의 사이즈를 측정하여 0보다 크다면 괄호들의 짝이 맞지 않는 것이므로 역시 false 처리하였다.
이미 접해본 문제이긴 했지만, 이럴 때 이런 알고리즘이나 자료구조를 사용해야 한다는 생각이 들도록
학습하는 것의 중요성을 새삼 느낄 수 있었다.
결국 레벨 2 테스트도 경과 시간 30분을 살짝 지나서 끝이 났고,
총합 한 시간 조금 덜 되는 시간동안 프로그래머스 레벨 1과 2를 달성하였다!
물론 아직 난이도가 대단한 레벨은 아니지만, 공부하는 과정에서 매 순간 필요하다 느꼈던 이정표가
이전보다 하나 더 늘어난 기분이다.
아침 지하철에서 후회하지 않기 위해, 더 늦기 전 잠을 청해본다.
오늘도 어제보다 더 많이 아는 사람이기를!
'Daily' 카테고리의 다른 글
프로그래머스 레벨3 Pass! (0) | 2022.01.04 |
---|---|
백준 Solved.ac 티어 Gold II (골드2) 달성 (0) | 2021.11.30 |
백준 Solved.ac 티어 Gold III (골드3) 달성 (0) | 2021.10.30 |