목차
- ✏️ 1주차 문제
- 🤔 스스로 고민하는 시간
✏️ 1주차 문제
기존 우테코 프리코스는 3주차 과정으로 이루어졌지만, 5기부터 1차 코딩테스트가 없어지면서 4주간의 프리코스로 변경되었습니다.
추측이기는 하지만, 아마도 1차 코딩테스트 문제가 1주차 과제로 주어진 것이 아닐까 싶습니다.
총 7개의 문제로 구성되었으며, 백준 기준으로 브론즈 ~ 실버 난이도의 문제였습니다.
또한, 각 문제들은 기능 요구 사항, 프로그래밍 요구 사항, 과제 진행 요구 사항 세 가지로 구성되어 있습니다.
위 미션 - 온보딩 링크를 들어가면 자세히 확인할 수 있습니다.
문제를 구현하기 전에, 각 문제별로 기능 목록을 만들고, 기능 단위로 커밋할 필요가 있었습니다.
따로 정리하라고 주어진 .md 파일 없었기에 개인적으로 문제별 .md 파일 하단에 기능 목록을 추가하였습니다.
각 문제를 해결한 후에, 주어진 Unit 테스트 파일의 Test Code가 모두 통과하는지 확인해야 합니다.
⭐ 문제 1
- 유형 - 구현
- 문제 1
포비와 크롱이 어떤 한 책의 임의의 페이지를 펼치고, 해당 페이지의 숫자를 변환해서 가장 큰 숫자를 얻은 사람의 번호를 반환하는 문제입니다.
숫자를 변환하는 방법은 2가지가 존재합니다.
- 각 자릿수를 모두 더한다.
- 각 자릿수를 모두 곱한다.
⭐ 문제 2
- 유형 - 문자열, 구현
- 문제 2
문제를 간략히 소개하자면, abbbbbc 라는 문제열이 있을 때 연속되는 문자를 제거해야합니다.
해당 예시에서는 b가 5번 연속하므로 정답은 ac가 됩니다.
해당 문제도 제한 사항만 보면 단순히 replace 메서드 또는 정규식을 반복해서 풀 수 있는 문제였습니다.
다만, 조금 더 효율적인 풀이를 위해 고민하다가 Stack 자료구조를 활용한 풀이가 떠올렸습니다.
따라서, 문자열 전체를 한 번에 다루지 않고, a를 push, b를 push하며 Stack의 Top과 이전에 다룬 문자를 비교하여 pop 또는 문자를 push하지 않았습니다.
스택 (Nothing : 아무것도 없거나, 하지 않음)
Nothing -> Nothing // 현재 스택 : -, 이전 문자 : '-'
a -> push // 현재 스택 : a, 이전 문자 : a
b -> push // 현재 스택 : ab, 이전 문자 : b
b -> pop // 현재 스택 : a, 이전 문자 : b (Top과 동일하므로 pop)
b -> Nothing // 현재 스택 : a, 이전 문자 : b (이전 문자와 동일하므로 아무것도 하지 않음)
.
.
.
c -> push // 현재 스택 : ac, 이전 문자 : c
Stack을 모두 구한 후에, 문자열로 변환하여 반환하였습니다.
개인적으로 효율성을 고려하며 구현하느라 시간이 필요했던 문제였습니다.
⭐ 문제 3
- 유형 - 문자열, 구현
- 문제 3
1부터 주어진 숫자까지 반복하면서, 해당 숫자에 3, 6, 9가 얼마나 포함되어 있는지 카운팅 하는 문제입니다.
만약 13이라는 숫자가 주어졌다면, 1부터 13까지의 숫자에서 3, 6, 9는 총 4개가 카운팅됩니다.
⭐ 문제 4
- 유형 - 해시맵, 문자열, 구현
- 문제 4
문자열의 각 문자를 주어진 반대 문자로 변환하는 문제입니다.
그렇기 때문에 각 알파벳(key) 별로 대응되는 문자(value)를 가지고 있는 Map을 구현해주었습니다.
알파벳만 변환할 수 있기에, 문자열 내의 문자를 하나씩 확인하면서 알파벳 여부를 확인하고 맵 자료구조를 통해 변환해주었습니다.
Map을 알고 있다면 어려운 문제는 아니었습니다.
⭐ 문제 5
- 유형 - 그리디
- 문제 5
백준에서 그리디를 처음 공부할 때 접했던 문제와 동일하였습니다.
주어진 금액을 가장 큰 화폐 단위로 나눠서 최소한의 화폐를 사용하는 문제입니다.
오만 원권, 만 원권, 오천 원권, 천 원권, 오백원 동전, 백원 동전, 오십원 동전, 십원 동전, 일원 동전
화폐의 종류는 위와 같으며 각 화폐별로 나누어 떨어지는 몫을 List에 담아 반환합니다.
⭐ 문제 6
- 유형 - 정렬, 문자열, 해시맵, 파싱
- 문제 6
우아한테크코스 교육생간에 닉네임을 정한 리스트가 주어집니다.
다만, 비슷한 닉네임을 방지하기 위해, 다른 크루와 2글자 이상이 연속으로 겹치는 크루들의 이메일을 리스트 형태로 반환해주어야 합니다.
또한, 해당 리스트를 그대로 반환하는 것이 아니라, 이메일 문자열을 기준으로 정렬하여 반환해주어야 합니다.
각 닉네임을 2글자부터 해당 닉네임의 길이만큼 분리해주었습니다.
예를 들어, 제이엠이라는 닉네임을 가진 크루가 있다면 '제이', '이엠', '제이엠'으로 각 맵의 Key를 구성해주었고, Value로는 해당 닉네임을 크루의 이메일을 Set 형태로 담아주었습니다.
(Set 자료구조를 사용한 이유는 이메일의 중복을 피하기 위해서입니다.)
각 닉네임별로 위 과정을 반복하고 집합(value)의 길이가 2이상인 경우, 해당 집합에 포함되어 있는 이메일들을 정답으로 반환할 리스트에 중복없이 담아 정렬하여 반환합니다.
우테코의 교육생이 되어 닉네임을 정하는 날이 오면 좋을 것 같습니다 😅
⭐ 문제 7
- 유형 - 정렬, 구현
- 문제 7
SNS의 친구 추천 기능 알고리즘이 주어지고, 그대로 구현해주면 되는 문제입니다.
친구 추천 알고리즘은 아래와 같습니다.
사용자와 함께 아는 친구의 수 = 10점
사용자의 타임 라인에 방문한 횟수 = 1점
따라서, 주어지는 친구관계 freinds 리스트를 이용하여, 각 사람별 친구 리스트를 값으로 가지고 있는 Map을 만들어줍니다.
[ ["donut", "andole"], ["donut", "jun"], ["donut", "mrko"], ["shakevan", "andole"]]
만약 위와 같은 친구관계를 담고 있는 리스트가 주어졌다면, 각 사람별 친구 맵은 아래와 같이 표현될 것입니다.
eachFriends : {
donut : [andole, jun, mrko]
shakevan : [andole]
}
여기서 친구를 추천할 대상인 user의 친구의 친구를 파악하여, 해당 친구의 친구의 점수가 포함되어 있을 때마다 10점씩 점수를 더해줍니다.
마지막으로, visitor에서 아직 친구가 아닌 사람 중에 방문한 사람의 점수를 1점씩 높여줍니다.
이렇게 구한 맵에서 우선순위를 1. 점수 2. 닉네임으로 정렬해주어 닉네임을 반환해주면 정답 판정을 받을 수 있습니다.
🤔 스스로 고민하는 시간
OT에서 멘토분들꼐서 말씀하시길...
우아한테크코스의 주 목적은 스스로 생각하고 고민하는 능력을 기르는 시간을 가지는 것입니다.
프리코스만으로도 여러분들의 실력을 기르실 수 있을 것입니다.
1주차 프리코스만으로도 이 말씀을 단 번에 이해할 수 있었습니다.
단순히 문제를 풀고 끝나는 것이 아니라, 여러가지 고민을 하는 시간을 가질 수 있었습니다.
- 조금 더 효율적으로 문제를 해결할 수 있을까?
- 더 가독성있게 코딩할 수 있을까?
- 어떻게 하면 한 가지 문제에서도 여러 기능으로 나누어 생각할 수 있을까?
- 재사용 가능한 코드는 무엇일까?
- 내가 작성한 코드가 Kotlin Coding Convention을 지키고 있기는 한 걸까?
- Kotlin의 특징을 잘 살릴 수 있는 코드는 무엇일까?
이 외에도 정말 많은 고민을 하느라 시간을 할애하였습니다.
다만, 이러한 시간은 절대 헛된 것이 아니었습니다.
지금껏 프로젝트가 아닌, 단순한 알고리즘 문제를 보면, 지문을 자세히 읽지도 않고, 더 생각해보기도 전에 키보드에 손을 올릴 때가 종종 있었습니다.
그리고 틀렸습니다 결과를 판정받고 나서야 다시 생각해보는 스스로의 모습이 떠올라 부끄럽기도 하였습니다.
하지만 문제를 자세히 읽고, 기능을 목록화하다보니 실수할 일도 줄어들고 코드를 더욱 깔끔하게 작성할 수 있었습니다.
또한, 코틀린의 특성을 잘 살리고, 클린 코드를 고려하다보니, 쉬운 문제임에도 스스로 생각하기에 난이도가 높아지는 느낌이 들었습니다.
이는 곧, 지금까지 그만큼 스스로 고민해보는 시간이 적었다는 것이었기에, 필자의 코딩 스타일을 되돌아보고 반성하는 값진 시간이었습니다.
1주가 정말 빠르게 지나갔다고 느낄만큼 재밌고 생각하는 시간이 많았던 한 주였습니다.
다음 2주차 미션에서는 어떤 문제가 주어질지, 또 그 문제에 열중하며 고민하는 스스로의 모습이 기대됩니다.
이렇게 좋은 기회를 주신 우테코 관계자분들께 감사할 따름입니다. 😄
github : https://github.com/tmdgh1592
'대외활동 > 우아한테크코스' 카테고리의 다른 글
[우아한테크코스] 2주차 - TDD(Test Driven Development) (1) | 2023.02.15 |
---|---|
[우아한테크코스 5기] 1주차 회고 - (양념 반 후라이드 반) 설렘 반 걱정 반 (6) | 2023.02.13 |
[우아한테크코스 5기] 프리코스 4주차 회고 - Kotlin 안드로이드 (2) | 2022.11.23 |
[우아한테크코스 5기] 프리코스 3주차 회고 - Kotlin 안드로이드 (1) | 2022.11.23 |
[우아한테크코스 5기] 프리코스 2주차 회고 - Kotlin 안드로이드 (2) | 2022.11.17 |