온보딩
- 총 7가지 기능 요구 사항(문제)를 모두 해결해서 제출해야 한다.
1. 페이지 번호 대결하기
1. main 메서드: 입력받은 페이지 숫자를 리스트(pobi/crong)에 저장한다.
2. solution 메서드: - exception_check()를 호출하여 예외를 확인한다.
- -1일 경우 그대로 -1을 return하고, 0일 경우 아래 코드를 실행하여 answer을 return한다.
- 왼쪽 페이지 수의 각 자리 숫자를 모두 더한 값과 곱한 값을 리스트(pobi_page)에 추가한다.
- 오른쪽 페이지 수의 각 자리 숫자를 모두 더한 값과 곱한 값을 리스트(crong_page)에 추가한다.
- 리스트 본인이름_page에서 가장 큰 값끼리 비교한다.
- 크롱의 점수가 더 크면 2, 같으면 0, 포비의 점수가 더 높으면 1을 answer로 정한다.
3. exception_check 메서드:
- 1)입력 받은 페이지 숫자가 왼쪽이 홀수, 오른쪽이 짝수가 아니거나
- 2)페이지 숫자가 연속하지 않거나
- 3)시작 면이나 마지막 면이 나오면 - 1을 return한다.
- 그렇지 않으면 0을 return한다.
- 예외사항을 고려하는 것에서 고민을 했던 문제. 그동안 코딩할 때는 메서드를 나누어서 사용하기보다는 main 메서드에 작성하곤 했다. 메서드를 나누어서 구현하는 것을 거의 처음 도전해보았다.
- 리스트의 기능을 익혔다.
2. 문자열에서 중복 문자 제거하기
1. main 메서드: 문자열을 입력받고 solution 메서드를 호출한다.
2. solution 메서드:
- 반복문을 사용하여 중복 문자를 삭제한다. - 더이상 삭제할 중복 문자가 없으면 반복문을 빠져나와 최종 결과를 return한다.
- 문자열 메서드는 이미 알고 있는 것들이 있어서 조금이나마 수월했다.
3. 369게임에서 박수치는 횟수 구하기
1. main 메서드: number를 입력받고 solution 메서드를 호출한다.
2. solution 메서드:
- 배열 num을 생성하고 1부터 number까지의 수로 배열을 초기화한다.
- 배열 num 안의 수들 중에서 3, 6, 9의 개수를 세어 return한다.
- number에 해당하는 숫자에서 박수를 몇 번 치는지가 아니라, 1번부터 number까지 총 박수를 몇 번 쳐야 하는지 구해야 한다는 처음에 놓치고 들어갔다.
- 몫을 구할 때는 나눗셈하고 (int)로 형변환 시켜주면 자연수 부분만 남게 된다.
4. 청개구리처럼 문자를 반대로 변환하기
1. main 메서드: 문자열을 입력 받고 solution 메서드를 호출한다.
2. solution 메서드:
- 입력받은 문자열에서 for문과 charAt()을 이용하여 문자 하나하나를 변환한다.
- 변환할 때는 아스키코드를 활용한다.
- 대문자의 경우 (155-해당 문자의 아스키 코드)에 해당하는 문자로 변환한다.
- 소문자의 경우 (219-해당 문자의 아스키 코드)에 해당하는 문자로 변환한다.
- 아스키코드를 활용하는 게 핵심이었을 것 같다. 코딩테스트 연습하면서 아스키 코드를 많이 사용해서 빠르게 해결 할 수 있었다.
5. 현금 단위 구하기
1. main 메서드: 돈의 액수 money를 입력 받고 solution 메서드를 호출한다.
2. solution 메서드:
- 오만 원권, 만 원권, 오천 원권, 천 원권, 오백원 동전, 백원 동전, 오십원 동전, 십원 동전, 일원 동전 각 값을 담을 리스트 answer을 생성한다.
- 돈의 액수를 5만으로 나눈 몫을 answer의 [0]번째에 저장하고, 돈의 액수를 (돈의 액수-5만으로 나눈 몫*5만)으로 변경한다.
- 돈의 액수를 1만으로 나눈 몫을 answer의 [1]번째에 저장하고, 돈의 액수를 (돈의 액수-1만으로 나눈 몫*1만)으로 변경한다.
- 돈의 액수를 5천으로 나눈 몫을 answer의 [2]번째에 저장하고, 돈의 액수를 (돈의 액수-5천으로 나눈 몫*5천)으로 변경한다.
- 돈의 액수를 1천으로 나눈 몫을 answer의 [3]번째에 저장하고, 돈의 액수를 (돈의 액수-1천으로 나눈 몫*1천)으로 변경한다.
- 돈의 액수를 500으로 나눈 몫을 answer의 [4]번째에 저장하고, 돈의 액수를 (돈의 액수-500으로 나눈 몫*500)으로 변경한다.
- 돈의 액수를 100으로 나눈 몫을 answer의 [5]번째에 저장하고, 돈의 액수를 (돈의 액수-100으로 나눈 몫*100)으로 변경한다.
- 돈의 액수를 50으로 나눈 몫을 answer의 [6]번째에 저장하고, 돈의 액수를 (돈의 액수-50으로 나눈 몫*50)으로 변경한다.
- 돈의 액수를 10으로 나눈 몫을 answer의 [7]번째에 저장하고, 돈의 액수를 (돈의 액수-10으로 나눈 몫*10)으로 변경한다.
- 일원 단위 돈을 그대로 answer의 [8]번째에 저장한다. - 반복문 빠져나오기
- 3번과 비슷한 방식으로 해결했다.
- 코드가 너무 길게 늘어지는 것 같아서 어떻게 간단하게 줄일 수 있을지 고민이다.
6. 중복되는 닉네임을 사용하는 지원자의 이메일 반환하기
1. main 메서드:
- 이메일과 닉네임을 입력 받고 2차원 배열 arr에 저장한다.
- convertToList 메서드를 호출한다.
- solution 메서드를 호출한다.
2. convertToList 메서드:
- 2차원 배열을 2차원 List로 변환하여 return한다.
3. solution 메서드:
- 닉네임을 따로 nickname 리스트에 저장해둔다.
- compare 메서드를 호출하여 중복되는 닉네임이 있는지 확인한다.
- 중복되는 닉네임이 있다면 그 닉네임이 사용하는 이메일을 email 리스트에 저장한다.
- email을 리스트에서 set으로 변환하여 중복을 제거한다.
- set을 다시 answer 리스트로 변환한다.
- answer 리스트를 오름차순으로 정렬한 후 리스트를 반환한다.
4. compare 메서드:
- indexOf를 활용하여 문자열인 닉네임에서 연속된 2자리를 추출하여 다른 닉네임에 포함되는지 확인하여 결과값을 check에 더한다.
- 2차원 배열과 2차원 리스트를 접하면서 머리를 부여잡게 만들어준 문제이다.
- 이메일과 닉네임이 type이 같아 다행히 2차원 배열로 먼저 저장한 후 2차원 리스트로 변환하였다.
- 중복을 제거하기 위해 HashSet을 사용했다.
7. 친구 추천 알고리즘 구현하기
1. main 메서드: - 사용자 아이디 user을 입력받는다.
- 친구 관계 정보를 입력 받고 2차원 배열 arr에 저장한다.
- convertToList 메서드를 호출한다.
- 사용자 타임 라인 방문 기록 visitors를 입력 받아 리스트에 저장한다.
- solution 메서드를 호출한다.
2. convertToList 메서드:
- 2차원 배열을 2차원 List로 변환하여 return한다.
3. solution 메서드:
- user와 친구인 아이디를 리스트에 저장한다.
- set형식으로 user의 친구의 친구인 아이디를 저장하여 중복을 제거한 후 다시 리스트로 변환한다.
- 아이디와 점수를 입력 받을 HashMap형식의idScore을 생성한다.
- acquitancescore 메서드를 호출한다.
- visitscore 메서드를 호츨한다.
- hashmap idScore의 value를 기준으로 정렬하기 위해 comparator 인터페이스를 implements한 후에 compare 메서드를 오버라이딩 한다.
- hashmap의 <Key, Value> 쌍을 유지하면서 리스트 형식으로 정렬하기 위해 Map.Entry를 이용한다.
- 순서 유지를 위해 LinkedHashMap을 이용하여 hashMap으로 다시 변환한다.
- 정렬된 hashMap에서 key값(아이디)만 뽑아서 리스트에 저장한다.
- 유저와 친구인 아이디가 결과에 포함되지 않도록 제거한다.
- 5명 이상일 경우 5명까지만 저장하여 answer을 반환한다.
4. acquitancescore 메서드: 함께 아는 친구의 점수를 계산한다.
- 전체 친구 관계 목록에서 친구를 찾고, 그 옆에 있는 아이디가 친구의 친구인 아이디 목록에 있을 경우 10점을 추가한다.
5. visitscore 메서드: 방문 횟수 점수를 계산한다.
- 방문 횟수에 따라 1점을 추가한다.
- 아이디와 점수를 함께 저장하기 위해 HashMap을 사용했다.
- value 기준 내림차순 정렬, value가 같으면 key 기준 오름차순 정렬 (가장 어려웠던 부분이다.)
- 중복 제거, 다중 조건 정렬 등 고려해야 할 점이 많아서 어려웠다.
git을 많이 들어보았으나, 사용하는 건 처음이었다.
fork, clone, commit, push ... 낯선 용어 투성이라 시작이 너무 어려웠다.
그렇지만 반복해서 사용하다 보니 이제는 보지 않고 외워서 입력할 수 있다!
push해서 github에서 보였을 때 엄청 짜릿했다.
7개의 문제 중 6-7번이 가장 어려웠다.
중첩 리스트(2차원 리스트)와 hashMap이 낯설어서 많이 헤맸다.
파이썬을 배웠다 보니 뭐가 필요하고, 어떻게 해야 할지 머리에서는 이미 다 그려지는데 자바가 익숙하지 않아서 구현이 불가능했다..
아! 이건 2차원 리스트로 가야겠다.
-> 인덱스 사용해서 값을 넣어줄 수 없음.
그러면 인덱스 사용하게 2차원 배열을 사용해볼까?
-> test 하려면 무조건 2차원 리스트 형식이어야 함.
결국 2차원 배열로 만든 후 2차원 리스트로 변환해서 해결할 수 있었다.
이거 완전 딕셔너리 쓰면 좋겠는데? 자바의 hashMap? 써봐야겠다!
-> key와 value 값을 바로 불러올 수 없음.
비슷한 듯 보이지만 전혀 다른 딕셔너리와 hashMap..
파이썬이 왜 쉽다고 했는지 덕분에 확실히 알았다..^^
Map.entry() 사용해 겨우 해결
value 기준 내림차순, value가 같으면 key 기준 오름차순?
-> 처음 접해보는 문제..
다중 조건을 충족해야 하는데, 처음 해결해보는 유형이라서 가장 많은 에너지를 쏟았다.
리스트로 바꿔서 리스트에서 정렬해보다가 계속 실패했다.
정말 포기해야지.. 하고 잠들었다가 다음날 다시 도전해서 새로운 해결 방법을 생각해냈다.
hashMap 상태로 정렬하는 것..! 왜 이 방법을 진작 못 찾았는지..
앞에서 헤맨 시간이 꽤나 길었지만.. 그 덕분에 Comparator 개념을 알게 되고 hashMap 상태로 정렬하는 방법까지 찾을 수 있었다.
역시 의미 없는 것은 없다!! 이러한 과정 속에서 배움이 일어나는 것.
문제가 너무 어렵다고 느껴지고 안 풀릴 때는 힘들었지만, 계속 고민하다보면 어느 순간 해결 방법이 떠오르는 때가 있다.
그때의 짜릿함이 아직도 생생하다.
이맛에 머리를 싸매고도 계속 프로그래밍을 하나보다..ㅎㅎ
제출한 내 미션 속 코드들이 너무나 지저분해서 부끄럽지만 ㅠ.ㅠ
일주일 사이에도 너무 많이 배웠기 때문에 ㅎㅎ 포기하지 않고 모두 해결해서 제출한 것만으로도 만족한다.
앞으로도 이 마음 잊지 않고 느리더라고 꾸준히 진행하자.
https://github.com/sorrel012/java-onboarding/tree/sorrel012
GitHub - sorrel012/java-onboarding: 온보딩 미션을 진행하는 저장소
온보딩 미션을 진행하는 저장소. Contribute to sorrel012/java-onboarding development by creating an account on GitHub.
github.com
'IT 인사이트' 카테고리의 다른 글
[우아한테크코스 5기] 프리코스 4주차 미션 회고(마지막 미션) (0) | 2022.11.23 |
---|---|
[우아한테크코스 5기] 프리코스 3주차 미션 회고 (0) | 2022.11.16 |
[우아한테크코스 5기] 프리코스 2주차 미션 회고 (0) | 2022.11.09 |
KMF & KME 2022(K-Metaverse Festival & K-Metaverse Expo) 메타버스 박람회 방문기 (1) | 2022.10.17 |
2022 메타버스 코리아 박람회 방문기(KES 2022) (1) | 2022.10.08 |