Peony의 기록 창고 🌼
article thumbnail
반응형

첫주차 문제는 알고리즘 문제의 형태의 과제가 나왔다. 이번 5기부터 코딩테스트가 없어졌는데, 이를 프리코스의 형태로 대신하는 것이라 생각되었다.

진행 방식에서 유독 눈에 띄었던 부분은 기능을 구현하기 전에 기능 목록을 만들라는 문구 였다.

나는 지금까지 알고리즘 공부를 일단 주어진시간에 빠르고 효율적인 알고리즘을 사용하는 것이 중요해 이런 방식으로는 문제를 풀어본 적이 없어서 살짝 막막했던 것 같다.

항상 혼자 코딩을 할 때, 의식적으로 가독성 좋고 이쁜 코드를 짜야지!라는 생각을 가지고 시작해도 항상 촉박하게 기능적으로만 작동하는 코드 작성을 했었는데, 이제부터라도 연습을 통해 코드의 기능 뿐만 아니라, 가독성과 재사용성에 대해 고민해보며 코드를 짜야겠다라는 생각이 들었다.

 

🚀 문제 1

포비와 크롱이 페이지 번호가 1부터 시작되는 400 페이지의 책을 주웠다. 책을 살펴보니 왼쪽 페이지는 홀수, 오른쪽 페이지는 짝수 번호이고 모든 페이지에는 번호가 적혀있었다. 책이 마음에 든 포비와 크롱은 페이지 번호 게임을 통해 게임에서 이긴 사람이 책을 갖기로 한다. 페이지 번호 게임의 규칙은 아래와 같다.

  1. 책을 임의로 펼친다.
  2. 왼쪽 페이지 번호의 각 자리 숫자를 모두 더하거나, 모두 곱해 가장 큰 수를 구한다.
  3. 오른쪽 페이지 번호의 각 자리 숫자를 모두 더하거나, 모두 곱해 가장 큰 수를 구한다.
  4. 2~3 과정에서 가장 큰 수를 본인의 점수로 한다.
  5. 점수를 비교해 가장 높은 사람이 게임의 승자가 된다.
  6. 시작 면이나 마지막 면이 나오도록 책을 펼치지 않는다.

포비와 크롱이 펼친 페이지가 들어있는 리스트/배열 pobi와 crong이 주어질 때, 포비가 이긴다면 1, 크롱이 이긴다면 2, 무승부는 0, 예외사항은 -1로 return 하도록 solution 메서드를 완성하라.

제한사항

  • pobi와 crong의 길이는 2이다.
  • pobi와 crong에는 [왼쪽 페이지 번호, 오른쪽 페이지 번호]가 순서대로 들어있다.

실행 결과 예시

pobi crong result
[97, 98] [197, 198] 0
[131, 132] [211, 212] 1
[99, 102] [211, 212] -1

 

📝 기능 목록

  1. 예외 처리 기능
  2. 숫자의 합을 구하는 기능
  3. 숫자의 곱을 구하는 기능
  4. 점수를 비교하는 기능
  5. 결과를 구하는 기능

 

🚀 문제 2

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

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

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

제한사항

  • cryptogram은 길이가 1 이상 1000 이하인 문자열이다.
  • cryptogram은 알파벳 소문자로만 이루어져 있다.

실행 결과 예시

cryptogram result
"browoanoommnaon" "brown"
"zyelleyz" ""

 

📝 기능 목록

  1. 문자열을 char 배열로 변환하는 기능
  2. 스택을 활용한 암호 해독 기능
  3. 스택에 있는 내용을 문자열로 변환하는 기능

 

고찰

개인적으로 제일 힘들었던 문제이다. 처음엔 간단히 생각했었는데, 문제를 계속 풀다보니 처음 중복이 2글자 이상일땐 그부분을 다 지워줘야하고, 나중에는 2글자 이상 중복되는 문장이 있을 수가 없다. 다른사람의 PR을 보니, 정규식을 활용하면 나름 간단하게 풀 수 있었던 것 같아서 아쉬움이 남는다.

 

🚀 문제 3

배달이가 좋아하는 369게임을 하고자 한다. 놀이법은 1부터 숫자를 하나씩 대면서, 3, 6, 9가 들어가는 숫자는 숫자를 말하는 대신 3, 6, 9의 개수만큼 손뼉을 쳐야 한다.

숫자 number가 매개변수로 주어질 때, 1부터 number까지 손뼉을 몇 번 쳐야 하는지 횟수를 return 하도록 solution 메서드를 완성하라.

제한사항

  • number는 1 이상 10,000 이하인 자연수이다.

실행 결과 예시

number result
13 4
33 14

 

📝 기능 목록

  1. 박수 카운팅 기능 구현

 

🚀 문제 4

어느 연못에 엄마 말씀을 좀처럼 듣지 않는 청개구리가 살고 있었다. 청개구리는 엄마가 하는 말은 무엇이든 반대로 말하였다.

엄마 말씀 word가 매개변수로 주어질 때, 아래 청개구리 사전을 참고해 반대로 변환하여 return 하도록 solution 메서드를 완성하라.

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Z Y X W V U T S R Q P O N M L K J I H G F E D C B A

제한사항

  • word는 길이가 1 이상 1,000 이하인 문자열이다.
  • 알파벳 외의 문자는 변환하지 않는다.
  • 알파벳 대문자는 알파벳 대문자로, 알파벳 소문자는 알파벳 소문자로 변환한다.

실행 결과 예시

word result
"I love you" "R olev blf"

 

📝 기능 목록

  1. 청개구리 사전 만드는 기능
  2. 문자열 char 배열로 변환하는 기능
  3. 청개구리 사전을 활용한 문자 변환기능

 

🚀 문제 5

계좌에 들어있는 돈 일부를 은행에서 출금하고자 한다. 돈 담을 지갑이 최대한 가볍도록 큰 금액의 화폐 위주로 받는다.

돈의 액수 money가 매개변수로 주어질 때, 오만 원권, 만 원권, 오천 원권, 천 원권, 오백원 동전, 백원 동전, 오십원 동전, 십원 동전, 일원 동전 각 몇 개로 변환되는지 금액이 큰 순서대로 리스트/배열에 담아 return 하도록 solution 메서드를 완성하라.

제한사항

  • money는 1 이상 1,000,000 이하인 자연수이다.

실행 결과 예시

money result
50237 [1, 0, 0, 0, 0, 2, 0, 3, 7]
15000 [0, 1, 1, 0, 0, 0, 0, 0, 0]

 

📝 기능 목록

  1. 거스름돈을 계산하는 기능

 

🚀 문제 6

우아한테크코스에서는 교육생(이하 크루) 간 소통 시 닉네임을 사용한다. 간혹 비슷한 닉네임을 정하는 경우가 있는데, 이러할 경우 소통할 때 혼란을 불러일으킬 수 있다.

혼란을 막기 위해 크루들의 닉네임 중 같은 글자가 연속적으로 포함 될 경우 해당 닉네임 사용을 제한하려 한다. 이를 위해 같은 글자가 연속적으로 포함되는 닉네임을 신청한 크루들에게 알려주는 시스템을 만들려고 한다.

신청받은 닉네임 중 같은 글자가 연속적으로 포함 되는 닉네임을 작성한 지원자의 이메일 목록을 return 하도록 solution 메서드를 완성하라.

제한사항

  • 두 글자 이상의 문자가 연속적으로 순서에 맞추어 포함되어 있는 경우 중복으로 간주한다.
  • 크루는 1명 이상 10,000명 이하이다.
  • 이메일은 이메일 형식에 부합하며, 전체 길이는 11자 이상 20자 미만이다.
  • 신청할 수 있는 이메일은 email.com 도메인으로만 제한한다.
  • 닉네임은 한글만 가능하고 전체 길이는 1자 이상 20자 미만이다.
  • result는 이메일에 해당하는 부분의 문자열을 오름차순으로 정렬하고 중복은 제거한다.

실행 결과 예시

forms result
[ ["jm@email.com", "제이엠"], ["jason@email.com", "제이슨"], ["woniee@email.com", "워니"], ["mj@email.com", "엠제이"], ["nowm@email.com", "이제엠"] ] ["jason@email.com", "jm@email.com", "mj@email.com"]

 

📝 기능 목록

  1. 이름을 두 글자씩 잘라서 map에 넣는 기능
  2. 정답 리스트에 넣는 기능

 

🚀 문제 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 이하인 리스트/배열이다.
  • 사용자 아이디는 알파벳 소문자로만 이루어져 있다.
  • 동일한 친구 관계가 중복해서 주어지지 않는다.
  • 추천할 친구가 없는 경우는 주어지지 않는다.

실행 결과 예시

user friends visitors result
"mrko" [ ["donut", "andole"], ["donut", "jun"], ["donut", "mrko"], ["shakevan", "andole"], ["shakevan", "jun"], ["shakevan", "mrko"] ] ["bedi", "bedi", "donut", "bedi", "shakevan"] ["andole", "jun", "bedi"]

 

📝 기능 목록

  1. 사용자 친구 목록 기능
  2. 친구 추천 리스트 기능
  3. 방문자 점수 계산 기능
  4. 최종 결과값 도출 기능

 

더 자세한 코드는 깃허브에 있다.

https://github.com/myeongju00/java-onboarding/tree/myeongju00

 

GitHub - myeongju00/java-onboarding: 온보딩 미션을 진행하는 저장소

온보딩 미션을 진행하는 저장소. Contribute to myeongju00/java-onboarding development by creating an account on GitHub.

github.com

 

마치며,,

일주일동안 스스로 작성한 코드를 개선해 나가는 것이 쉬운 일은 아닌 것 같다. 일주일동안 시간복잡도, 테스트 케이스, 선언형 프로그래밍, 변수명 등 다양한 고민을 했던 온보딩이었다. 더불어 리뷰어가 보기 편한 컨벤션, 기능 단위 커밋, 함께 공부하는 커뮤니티의 중요성 등을 더불어 생각해볼 수 있던 시간이었다.

다른 사람들 코드를 보며 아쉬움이 많이 남지만, 후회는 없다. 할 수 있는 최선을 다했고 이번에 배웠던 점, 부족했던 점 모두 차근차근 개선해 나가면서 성장해 나가면 되는 것이라 생각한다. 무엇보다 이렇게 최선을 다하는 경험이 정말 값지다고 생각한다.

반응형
profile

Peony의 기록 창고 🌼

@myeongju