모눈종이에 사각사각

[프리코스] 1주차 회고 본문

활동기록

[프리코스] 1주차 회고

모눈종이씨 2022. 11. 3. 01:41

우아한테스코스의 4주간의 프리코스 기간이 시작됐다.

앞으로 4주동안 공부한 내용을 꾸준히 기록해보려고 한다.

🍁 진행 방식

  • 미션은 기능 요구 사항, 프로그래밍 요구 사항, 과제 진행 요구 사항 세 가지로 구성되어 있다.
  • 세 개의 요구 사항을 만족하기 위해 노력한다. 특히 기능을 구현하기 전에 기능 목록을 만들고, 기능 단위로 커밋 하는 방식으로 진행한다.
  • 기능 요구 사항에 기재되지 않은 내용은 스스로 판단하여 구현한다

문제는 총 7문제이다.

🍁 미션

문제1

## 🚩 구현할 기능 목록
- [x] 페이지 번호 각 자리 모두 더하기
- [x] 페이지 번호 각 자리 모두 곱하기
- [x] 나올 수 있는 4가지의 수 중 가장 큰 수 구하기
- [x] 시작면이나 마지막 면이 나오면 에러 처리하기
- [x] 왼쪽 페이지는 홀수, 오른쪽 페이지는 짝수가 아닐 경우 에러 처리하기
- [x] 오른쪽 페이지가 왼쪽 페이지보다 하나 큰 숫자가 아닐 경우 에러 처리하기 
- [x] pobi와 crong 중 페이지 범위에 맞지 않는 사람이 있다면 -1 반환하기
- [x] pobi와 crong 각각의 최댓값 구하기 
- [x] pobi와 crong의 승패 결과 반환하기

페이지를 펼쳤을 때 왼쪽과 오른쪽에 숫자가 나오고, 각 숫자를 더하거나 곱해서 나온 숫자 중 가장 큰 숫자가 자신의 숫자가 된다.

이런 방식으로 pobi와 crong이 겨루었을 때 누가 이기는가? 가 문제1번이었다.

 

엄청 간단한 문제였지만, 구현할 기능 목록을 나열하니 꽤 많아서 놀랐다.

 

문제2

## 🚩 구현할 기능 목록
- [x] 문자열 중복 확인하기
- [x] 문자열 중복 제거하기
- [x] 더이상 중복된 문자열이 없을 때까지 반복하기

암호문이 주어졌을 때 연속하는 중복 문자들을 삭제한 결과를 반환하는 문제였다.

이 문제에서 고민이 되었던 것은, 중복 확인을 어떻게 할 것인가 였다.

고민 끝에 boolean 배열을 만든 후, 두 개씩 확인한 뒤 겹친다면 true로 변경해주는 방법으로 구현했다.

 

그리고 중복제거 전과 후의 암호문이 같거나, 암호문이 빈 문자열이 되었다면, 종료할 때가 온 것이다.

 

문제3

## 🚩 구현할 기능 목록
- [x] 숫자에 들어있는 3, 6, 9의 개수 세기
- [x] 1부터 number까지 3, 6, 9가 총 몇 개가 들어있는지 세기
- [x] number의 범위 확인하기

우리가 아는 369게임을 할 때 1부터 number까지 박수를 몇 번 치는지 구하는 문제였다.

1부터 number까지 돌면서, 숫자에 3, 6, 9가 있는지 확인했다.

 

3, 6, 9가 들어있는지 확인할 때, if와 ||(or)을 사용해서 확인하는 것이 아니라,

3, 6, 9를 HashSet에 넣어 조금 더 효율적으로 구현하도록 노력했다.

 

문제4

## 🚩 구현할 기능 목록
- [x] 반대 알파벳 구하기
- [x] 한 글자씩 반대 알파벳 구하여 더하기

청개구리는 엄마의 말을 그대로 하는 것이 아니라 알파벳을 반대로 바꿔서 한단다.

알파벳 대문자가 들어오면 대문자로, 소문자가 들어오면 소문자로 반환해야 한다.

 

아스키 코드 값이 대문자A는 65, Z는 90이며, 소문자a는 97, z는 122이다.

 

출처 : 아스키코드 - 나무위키

 

이를 이용하여 문제를 풀었다.

 

65(A)\(\leftrightarrow\)90(Z)

66(B)\(\leftrightarrow\)89(Y)

...

이렇게 되기 위해서는 

155에서 빼면 된다.

 

155-65(A) = 90(Z)

155-90(Z) = 65(A)

 

이와 같은 원리로 소문자의 경우

97(a)\(\leftrightarrow\)122(z)

98(b)\(\leftrightarrow\)121(y)

...

 

이렇게 되기 위해서는

219에서 빼면 된다.

 

219-97(a) = 122(z)

219-122(z) = 97(a)

 

그래서 155와 219를 각각 UPPER_BASE와 LOWER_BASE로 상수처리를 하여 문제를 해결했다.

 

그리고 알파벳만 변화해줘야 했기 때문에 Character.isAlphabetic()로 알파벳인지 확인했고, 알파벳이 아닌 경우에는 그대로 출력하도록 했다.

 

문제5

## 🚩 구현할 기능 목록
- [x] 오만 원권, 만 원권, 오천 원권, 천 원권, 오백원 동전, 백원 동전, 오십원 동전, 십원 동전, 일원 동전의 리스트 만들기
- [x] 큰 금액의 화폐부터 각 화폐 단위로 변환되는 개수 구하기

 계좌에서 돈을 출금할 때 지갑이 가볍도록 큰 금액의 화폐 위주로 받는다.

 

그래서 각 돈을 내림차순으로 정렬한 배열을 돌면서 몫을 구해주었다.

 

 

문제6

## 🚩 구현할 기능 목록
- [x] 각 닉네임에서 나올 수 있는 두 글자의 모든 경우의 수 구하기
- [x] 중복된 부분 닉네임이 있는지 확인하기
- [x] 닉네임이 중복된 사람 이메일 추가하기
- [x] 이메일 리스트 정렬하여 반환하기

각 지원자의 닉네임에서 같은 글자가 연속적으로 포함되는 지원자의 이메일 목록을 만드는 문제이다.

 

각 닉네임을 두 글자씩 돌면서 count를 HashMap에 저장해주었다.

이렇게 twoNameCount 해시맵을 만들고, 

이중에서 count가 2이상인 twoName을 가지고 있는 지원자를 찾아 그 사람의 이메일을 HashSet에 저장했다.

제한사항 중에 이메일에 해당하는 부분의 문자열을 중복 제거해야 한다고 적혀있었기 때문이다.

 

또한, 이메일을 정렬할 때, 도메인 부분을 제외하고 정렬하기 위해 정렬 조건을 따로 추가해주었다.

 

아스키 코드 값으로 @는 64여서, 알파벳보다는 작지만, 숫자 보다는 큰 값을 가진다.

따라서 mj@email.com 과 mj1@email.com이 있다면,  [mj@email.com, mj1@email.com] 이 순서로 정렬되는 게 맞지만, 도메인까지 포함하여 정렬한다면 1보다 @의 아스키 코드 값이 더 작기 때문에  [mj1@email.com, mj@email.com] 이렇게 정렬될 것이다.

 

문제7

## 🚩 구현할 기능 목록
- [x] 전체 사용자 목록 만들기
- [x] 한 사람당 친구 목록 만들기
- [x] user와 친구 여부 확인하기
- [x] user와 친구가 아닌 사람의 친구 리스트 중에서 user의 친구와 겹치는 친구의 수를 세기
- [x] user와 친구가 아닌 사람의 user의 타임 라인 방문 횟수 구하기
- [x] 총점이 높은 순으로 친구 추천 리스트 만들기

이 문제를 구현하는데 꽤 시간이 많이 걸렸다.

이해하는데도 시간이 걸렸었다. 친구를 추천해 주는 것이기 때문에 이미 친구가 아닌 사람은 제외하고 생각해야 한다.

 

처음에는 HashMap<String, Integer>으로 이름을 key로 포인트 값을 value로 넣어 각 사람마다 점수를 구했고,

HashMap<String, List<String>>으로 이름을 key로, 친구 목록을 value로 넣어 각 사람의 친구를 구했다.

그런데 각 사람마다 포인트와 친구 목록을 따로 해야 할 이유가 있나?

라는 생각이 들어서 People 클래스를 만들어보았다.

 

People 클래스에는 이름과, 포인트, 그리고 친구 목록이 있다.

 

이렇게 구현한니 코드가 조금 깔끔해졌다.

 

그리고 친구 목록을 만들 때, A의 친구 목록에 B를 추가하고, B의 친구 목록에 A를 추가해야해서 뭔가 중복된 작업이 아닌가? 하여 이 과정을 메소드로 추출하여 해결했지만, 여전히 이게 최선의 방법인가에 대해 의문이 남아있다.

 

그리고 주어진 user의 친구 리스트와, user와 친구가 아닌 사람의 친구 리스트를 비교하여, 겹치는 친구의 수*10만큼 점수를 부여한다.

 

또한 사용자의 타임 라인에 방문한 횟수만큼 점수를 부여한다.

 

이렇게 점수를 구한 후, 점수가 가장 높은 순으로 최대 5명을 리턴하는데 점수가 0인 경우는 추천하지 않고, 점수가 같으면 이름 순으로 정렬을 해야 했다.

 

따라서 Person 클래스에 compareTo를 오버라이딩해 점수 높은순, 점수가 같다면 이름순으로 정렬할 수 있도록 했다.. 

 

제출 완료!

 

🍁 과제 진행 소감

1주차 미션 진행 방식에 "기능을 구현하기 전에 기능 목록을 만들고 기능 단위로 커밋 하는 방식으로 진행"한다고 되어 있어서 기능 목록을 만들고 기능 단위로 커밋 하기 위해 노력했다.

사실 평소에 하던 방법이 아니었기에 초반에는 조금 번거로웠다. 기능 하나 구현하고 하나 커밋 하는게 손이 많이 간다고 생각했다. 커밋 메시지도 기능을 잘 나타내기 위해서 신경 쓰며 적다 보니 메시지를 작성하는 데도 시간이 걸렸다. 그러나 계속 진행할수록 그렇게 번거로운 일도 아니었을 뿐더러, 지금은 혼자 작업을 하는 것이지만 나중에 다같이 작업을 한다고 했을 때 협업하는 사람들끼리 코드를 잘 이해하는 기반이 될 것임을 느꼈다.

특히 문제 7번 같은 경우는 문제를 이해하는 것만 해도 시간이 걸렸다. “사용자와 함께 아는 친구의 수”가 무엇일지 실행 결과 예시를 보며 그림을 그려가며 이해했다. 그리고 처음에는 친구 관계를 HashMap으로 작성했었는데, 나중에 People이라는 클래스를 만들어 추천 점수와 친구 리스트를 같이 저장할 수 있도록 구현하는 과정에서 고민을 많이 했다.

"더 나은"코드를 작성하는 사람이 되고 싶었는데 그 시작을 하고 있는 것 같아 굉장히 설레고 기쁘다.

Comments