일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 프로그래머스
- TEST
- Compose
- architecture
- MiTweet
- Codeforces
- 암호학
- Kotlin
- 백준
- 쿠링
- Hilt
- Rxjava
- Coroutines
- Gradle
- textfield
- android
- MyVoca
- ProGuard
- boj
- AWS
- relay
- 코루틴
- 코드포스
- pandas
- androidStudio
- activity
- GitHub
- Python
- Coroutine
- livedata
- Today
- Total
이동식 저장소
2023 카카오 블라인드 테스트 코딩테스트 1차 후기 본문
솔직히 오늘 공부 하나도 안 했다 ㅋㅋ 해봤자 의미없는 것을 알기에.. 하지만 나름 잘 봤다는 점..
저작권 이슈가 있어 문제를 언급할 수는 없고, 개인적인 체감 난이도와 아주 간단한 풀이만 적어보려 한다.
1번 (브론즈)
문자열에서 값 추출하는 간단한 문제......였으나 푸는 데 30분이나 걸렸다. 이게 다 cpp 때문이다. ``substr`` 인덱스 잘못 써서 10분 날린듯;; 진작에 Kotlin 쓸걸 그랬다.
2번 (실버 2)
뭔가 어려운 척 하는 문제. 그냥 맨 뒷집부터 배달/수거하면 된다. 보통 코딩테스트 앞 문제들은 그리디하게 생각하면 쉽게 풀리는 경우가 많다.
3번 (실버 3)
조건대로 계산하는 문제. 이모티콘이 최대 7개밖에 주어지지 않기 때문에 모든 경우를 다 따져봐도 된다.
주어지는 값이 전부 100의 배수이기 때문에, 할인된 가격을 구할 때 100으로 나누고 60을 곱하는 식으로 부동소수점 오차를 완전히 회피할 수 있다.
문제에서는 특정 가격을 넘으면 이모티콘 플러스를 구독한다고 하길래 ``>`` 부등호를 사용했는데, 테스트 케이스를 보니 ``>=`` 연산자를 사용해야 했다. 표현이 아쉬웠던 문제.
4번 (골드 2)
체감상 (못 푼 7번을 제외하고) 가장 어려웠던 문제.
문제에서 왼쪽 어쩌구 얘기했는데, 그냥 중위 탐색을 하겠다는 뜻이다. 완전 이진 트리를 만들 수 있다고 가정하여 이진 문자열을 만든 뒤, 실제로 이진 문자열을 트리로 바꿀 수 있는지 확인하면 된다.
여기서 거의 1시간 헤맨 듯. 중위 탐색인 건 알겠는데 문자열 길이를 몇으로 해야 하나 고민하다가 51자리까지 만들고;; 다른 분들은 쉽게 푼 것 같던데 나만 어렵게 풀었나..
5번 (골드 3)
코딩테스트마다 꼭 하나씩 있는 개-빡-구현 문제. 직감적으로 쉽지 않음을 느끼고 6번을 먼저 풀기로 결정했다.
6번 (골드 2)
출구로 나갈 수 있는 경로 중 사전 순으로 가장 앞선 경로를 찾아야 한다.
그런데 문제를 잘 읽어보니, 수직 좌표를 가리키는 변수 이름으로 ``x``와 ``r``을 둘 다 쓰더라. 수평 좌표도 ``y``와 ``c``를 쓰고. 설마 카카오 출제진이 이런 걸 모르진 않을 테고, 의도적으로 헷갈리게 낸 건가? 이런 거 질색인데..
아무튼, 출발점에서 도착점으로 가는 벡터를 $(d_{x}, d_{y})$라고 하자. 경로의 길이가 정확히 $K$가 되어야 하므로 서로 상쇄되는 좌우 or 상하 움직임을 추가해야 한다. 추가되는 움직임은 반드시 좌우, 상하 이렇게 2개가 한 쌍으로 추가되어야 한다. 좌우 쌍을 $v_{x}$, 상하 쌍을 $v_{y}$개 추가한다고 하면 경로의 총 길이는 $(|d_{x}| +2v_{x}) + (|d_{y}| + 2v_{y}) $이고, 이 값이 $K$와 같아야 한다.
정리하면 $2(v_{x} + v_{y}) = K - |d_{x}| + |d_{y}|$이다. 이때 우변이 음수 또는 홀수라면 ``impossible``이다. 음수인 경우를 못 찾아서 약간 헤매긴 했는데..
위 식을 풀면 추가해야 하는 움직임 쌍의 합을 구할 수 있다. 이제 가능한 모든 $(v_{x}, v_{y})$ 순서쌍에 대해 실제로 경로를 구해 보자.
$(d_{x}, d_{y})$와 $(v_{x}, v_{y})$ 순서쌍이 주어졌으니 상, 하, 좌, 우 알파벳을 각각 몇 개씩 넣어야 하는지 알 수 있다. 사전 순으로 가장 작은 경로를 찾고 있으므로, ``d``, ``l``, ``r``, ``u`` 순서대로 넣어 보자.
출발점에서 시작하여 한 칸씩 내려가면서 ``d``를 최대한 넣어 보자. 맨 아래 행에 있다면 ``d``를 넣을 수 없을 것이다. 그렇다면 같은 방법으로 ``l``을 넣어보고, ``l``도 넣을 수 없다면 ``r``을, ``r``도 넣을 수 없다면 ``u``를 넣는다. 넣어야 할 알파벳이 남아 있는데 어떠한 방향으로도 움직일 수 없다면 ``impossible``이다. (그런 경우는 없을 것 같지만)
뭔가 어려운 척 하고 있지만, 그리디로도 충분히 풀 수 있는 문제이다.
다시 5번으로 돌아와서
5번까지 풀고 나니, 체감상 작년보다 문제가 쉽다는 생각이 들었다. 5솔브로는 영 불안해서 5번까지 풀기로 결정.
위에서 말했듯이 5번은 개-빡-구현 문제이다. 또 문자열 파싱이 나오길래 이번에는 아예 Kotlin으로 풀었다. 어 좋다
명목상 주어지는 좌표와 병합을 고려한 실제 좌표를 구분해야 한다. 한번에 구현 못하면 디버깅 절대 못 할 것 같아서 이 악물고 구현했다. 솔직히 한 번쯤은 틀릴 줄 알았는데, 컴파일 에러 고치고 나니 한 번에 통과. 휴~
백준에 있었으면 절대 안 풀었을 문제. 귀찮아..
7번
6솔브면 통과할 수 있지 않을까? 라는 안일한 생각을 하기 시작했다. 5번 풀고 나니 6시였는데, 원래 6시에 저녁을 먹어서 배고프기도 했고..
뭔가 트리로 장난치는 문제인데, 잘 모르겠어서 자체 종료했다. 수고하셨습니다~
6솔브 후기
아무리 봐도 작년보다 쉬운데? 보통 시험이 쉽게 느껴진다면 1) 공부를 열심히 했거나 2) 문제가 쉽거나 둘 중 하나인데, 말했다시피 1번은 아닌 것 같고 ㅋㅋ
물론 코테 초보라면 충분히 어려웠을 것이다. 사실 문제가 어렵다기보단 생소한 환경에서 치르는 실전이기 때문에 많이 긴장하게 된다. 시험이 떨린다면 나처럼 공부를 안 해 보면 어떨까? 미쳤습니까 휴먼?
문제는 2차인데.. 작년같은 삽질만 안 했으면 좋겠다.
'Primary' 카테고리의 다른 글
파이썬은 신인가? (0) | 2022.10.02 |
---|---|
Play Console에서 앱 콘텐츠 작성하기 (0) | 2022.07.28 |
Android Studio에서 무선으로 adb 사용하기 (0) | 2021.02.12 |
IntelliJ 계열 IDE에서 파일 탐색기가 작동하지 않는 오류 (2) | 2021.01.30 |
프로그래머스 월간 코드 챌린지 시즌1 11월 후기 (0) | 2020.11.07 |