[우테코] 프리코스 1주차 회고록

Lucy_1215·2022년 12월 9일
post-thumbnail

서론

지난 10월 26일 부터 11월 23일까지 4주동안 우아한 형제들에서 주최한
"우테코(우아한 테크코스)의 프리코스"를 참여하게 되었다.

여태까지 우테코의 프리코스는 코딩테스트를 합격한 사람들만 참여할 수 있도록 하였는데
이번 5기의 경우는 우테코를 지원한 모든 지원자들이 참여할 수 있어서
나를 성장시킬 수 있는 좋은 기회라 생각되었고,
국비 교육을 듣는 도중에도 한치의 망설임 없이 지원하게 되었다.

4주동안의 프리코스 과제들에 대해 회고를 해보고자 한다.

1주차 - 온보딩

📕1주차 코드 보러가기

수요일 3시에 미션이 올라오자마자 설레는 마음으로 확인하였다.
1주차 미션은 온보딩이었다. 문제는 총 7문제였고 문제의 난이도를 확인해보니
1주차는 개발 환경 세팅과 익숙해지라고 난이도를 낮게 설정하신 것 같았다.

1주차에는 별다른 요구사항은 없었고, 기능을 해결하는 것에 초점을 둔 것 같았다.
문제를 하나하나씩 읽어가면서 어떻게 풀지 머릿속에서 정리를 하였고
어떤 함수가 필요할 지 아래의 사진과 같이 각 문제마다 주석으로 적어 정리해놓았다.

문제를 풀면서 고민을 많이했던 문제는 2번7번이었다.
두 문제에 대해서 자세하게 얘기해보겠다.

[Problem 2]

[Problem 2]

🚀 기능 요구 사항

암호문을 좋아하는 괴짜 개발자 브라운이 이번에는 중복 문자를 이용한 새로운 암호를 만들었다. 예를 들어 "browoanoommnaon"이라는 암호문은 다음과 같은 순서로 해독할 수 있다.

1. "browoanoommnaon"
2. "browoannaon"
3. "browoaaon"
4. "browoon"
5. "brown"

임의의 문자열 cryptogram이 매개변수로 주어질 때, 연속하는 중복 문자들을 삭제한 결과를 return 하도록 solution 메서드를 완성하라.

처음 이 문제를 보고 "스택을 쓰면 간단하게 풀리겠구나"라는 생각을 했다.

--1차 문제 해결 과정--
1. 문자를 처음부터 하나씩 꺼내서 스택이 비어있으면 문자를 스택에 넣고,
2. 스택의 맨 위 값을 꺼내서 문자와 같으면 스택에서 제거
3. 스택에 들어있는 값들을 출력

이 과정을 통해 문제를 해결하였다.
모두 해결한 줄 알았지만 Slack을 보다가 내 방식이 틀렸다는 것을 알게 되었다.

문제를 대충 읽은 나머지 가장 중요한 문구을 놓친 것이다.
바로 "연속하는 중복 문자들" 이었다.

내가 풀은 방식은 연속하는 2개의 중복 문자들만 확인하고 제거하는 방법이었는데,
만약 중복하는 문자가 3개 이상이라면 내 코드로 해결되지 않는다는 것을 깨닫고
다시 코드를 뜯어고치기 시작했다.

결국 처음에는 스택을 이용하여 코드를 작성했지만 고친 코드에서는 List를 이용하였다.

--최종 문제 해결 과정--
1. String 타입의 문자열을 하나씩 분리하여 List에 넣는다.
2. 이중 for문을 이용해 list의 앞문자와 뒤 문자들를 비교하여 같은 문자를 모두 제거한다.
3. 위의 과정을 반복한다.
4. 리스트의 문자들을 합쳐서 출력한다.

위의 문제 해결 과정으로 문제를 해결하였지만 지금와서 코드를 다시 보니
이중 for문 안에 이중 if문 안에 for문... 끔찍해보인다....
차차 시간날 때 코드를 수정해야겠다!!

[Problem 7]

[Problem 7]

🚀 기능 요구 사항

레벨 2의 팀 프로젝트 미션으로 SNS(Social Networking Service)를 만들고자 하는 팀이 있다. 팀에 속한 크루 중 평소 알고리즘에 관심이 많은 미스터코는 친구 추천 알고리즘을 구현하고자 아래와 같은 규칙을 세웠다.

  • 사용자와 함께 아는 친구의 수 = 10점
  • 사용자의 타임 라인에 방문한 횟수 = 1점

    사용자 아이디 user와 친구 관계 정보 friends, 사용자 타임 라인 방문 기록 visitors가 매개변수로 주어질 때, 미스터코의 친구 추천 규칙에 따라 점수가 가장 높은 순으로 정렬하여 최대 5명을 return 하도록 solution 메서드를 완성하라. 이때 추천 점수가 0점인 경우 추천하지 않으며, 추천 점수가 같은 경우는 이름순으로 정렬한다.

제한사항

  • user는 길이가 1 이상 30 이하인 문자열이다.
  • friends는 길이가 1 이상 10,000 이하인 리스트/배열이다.
  • friends의 각 원소는 길이가 2인 리스트/배열로 [아이디 A, 아이디 B] 순으로 들어있다.
    - A와 B는 친구라는 의미이다.
    - 아이디는 길이가 1 이상 30 이하인 문자열이다.
  • visitors는 길이가 0 이상 10,000 이하인 리스트/배열이다.
  • 사용자 아이디는 알파벳 소문자로만 이루어져 있다.
  • 동일한 친구 관계가 중복해서 주어지지 않는다.
  • 추천할 친구가 없는 경우는 주어지지 않는다.

실행 결과 예시

역시 마지막 문제인 만큼 문제를 이해하는데 오래 걸렸다...

이 문제에서 고려해야 할 점
1. friends 배열에서 user가 0번 index, 1번 index 모두 있을 수 있다는 것
2. 이미 친구인 사람은 제외 시켜야한다는 것
3. 방문자에서 한 사람이 여러번 방문할 수 있다는 것

위의 부분들을 고려하여 문제를 해결하였다.

--문제 해결 과정--
1. user의 친구 추출하여 List에 저장
2. user와 함께 아는 친구 추출하여 List에 저장
3. 방문자 추출하여 Map에 저장
4. 점수 List 내림차순 정렬
5. Map의 key값 추출하여 List에 저장
6. 이미 친구인 사람 추출
7. 5번 List에서 이미 친구인 사람 삭제하여 출력

하나의 메서드 안에서 코드가 길어지는 것이 싫어 쪼개고 쪼갰던 것 같다.
살짝 돌아가는 느낌이 있고, 2번과 마찬가지로 들여쓰기가 많다...
7번 문제도 마찬가지로 시간을 내서 수정을 해야할 것 같다.

그 중 고쳐야 할 첫번째는
이미 친구인 사람을 List에 담아두지 않고 바로 삭제할 수 있도록 하면 좋을 것 같다.


결론

1주차 프리코스 과제들을 모두 구현에 성공하여서 뿌듯하긴 하지만
주로 기능 중심으로 구현을 하다보니 클린하지 못한 코드가 나왔다.
그때의 나를 반성하며, 클린한 코드로 만들기 위해 코드를 수정하러 가야겠다...

다음 포스팅은 2주차 프리코스 회고록으로 돌아오겠다.
(1주차 피드백 내용은 2주차 서론에 적도록 하겠다.)

profile
성실한 개발자를 꿈꾸는 개발 일지

0개의 댓글