1. 숫자 문자열과 영단어
https://school.programmers.co.kr/learn/courses/30/lessons/81301
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
간단하게 숫자에 대응되는 배열을 만들고 변환해주면 되는 문제였다.
2. [1차] 비밀지도
https://school.programmers.co.kr/learn/courses/30/lessons/17681
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
정수가 주어졌을 때 binary값으로 변환한 뒤 or 계산을 통해서 맵을 변환시켜주면 되는 문제였다.
String s = Integer.toBinaryString(num);
toBinaryString()
toBinaryString() 메서드를 사용하면 간단하게 숫자를 String 형태로 변환시켜준다는 것을 기억하자.
ex) 9 -> 1001(2)
만약에 앞의 자리가 없는 경우 이번 문제에서만 임의로 0을 추가해줬다.
3. 실패율
https://school.programmers.co.kr/learn/courses/30/lessons/42889
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
이전에 풀었으나 또 틀려서 답을 참고했다.
문제에서 딱 기억해야 할 것은 두가지이다.
0으로 나눌 때의 엣지케이스를 주의하고, Double 형태의 배열을 어떻게 정렬할 것인지 여부다.
Double 정렬
Arrays.sort(res, (a,b) -> {
int cmp = Double.compare(b[1], a[1]);
if (cmp != 0) return cmp;
return Double.compare(a[0], b[0]);
});
문제에서, 실패율 순으로 내림차순을 해주되 실패율이 같은 경우 스테이지 순으로 오름차순을 해달라는 문구가 있었다. int형으로 정렬하는 것은 쉬웠지만 Double로 정렬을 해야하다보니 헷갈렸다.
- 해쉬맵에 [스테이지, 클리어하지 못한 사람을 저장]
- 해쉬맵을 순회하며 실패율을 계산하고, 2차원 Double 형태의 배열을 만들어 [스테이지, 실패율]을 저장 (이 때 실패율을 0으로 나누는 경우의 수를 체크해야 함)
- 배열을 정렬
- 배열을 순회하며 answer에 스테이지의 정보를 입력해준다.
4. [1차] 다트 게임
https://school.programmers.co.kr/learn/courses/30/lessons/17682
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
생각보다 엣지 케이스들을 고민할게 많아서 시간이 좀 오래걸렸다.
숫자 10에 대해서 엣지케이스를 생각해야하고, 나는 10에서 현재 인덱스가 0을 가르키고 있을 때 이전 값이 1인 경우에 10으로 값을 갱신했다.
또한, 숫자만의 인덱스를 따로 계산해줘서 매번 연산이 끝날 때마다 배열에 해당 연산의 결과값을 저장해줬고, 문제에서 주어진 `*` 스타상일 때는 숫자 인덱스를 보고 값을 계산해주었다.
5. 로또의 최고 순위와 최저 순위
https://school.programmers.co.kr/learn/courses/30/lessons/77484
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
어렵지 않게 풀었다.
프로그래머스 코테 문제에서 비슷한 유형이 나왔던 만큼 빠르게 푸는게 관건
6. 크레인 인형 뽑기 게임
https://school.programmers.co.kr/learn/courses/30/lessons/64061
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
빠르게 풀었다.
뽑고 난 board의 값을 0으로 초기화 해주는거랑, 인형을 터뜨렸을 때 1만 더해줘서 살짝 디버깅하는데 걸렸다.
7. 키패드 누르기
https://school.programmers.co.kr/learn/courses/30/lessons/67256
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 풀이전에 로직을 정리하고 들어가서 그런가?
이전에 풀때는 엣지 케이스를 놓치면서 시간이 좀 걸렸던 것 같은데 하나의 오차 없이 한큐에 풀었다.
8. 성격 유형 검사하기
https://school.programmers.co.kr/learn/courses/30/lessons/118666
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
해쉬맵에 [성적,점수] 형태로 저장 한 뒤 나중에 1 ~ 4번 검사 결과에 따라서 알파벳을 더해주었다.
점수가 같은 경우에 사전이 빠른 순서대로 더해준다고 했는데, 3항 연산자를 통해서
answer += (map.getOrDefault('R', 0) >= map.getOrDefault('T', 0)) ? 'R' : 'T';
이런식으로 'R'의 사전순이 'T'보다 빠르기 때문에, 같은 경우에도 'R'을 자연스럽게 더해주도록 쉽게 구현했다.
9. 신규 아이디 구현
https://school.programmers.co.kr/learn/courses/30/lessons/72410
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
차례대로 구현하면 쉽게 풀리는 문제인데 밤에 풀다가 잘 안풀려서 다음 날 코드 초기화 한 다음에 풀어보니 쉽게 풀렸다.
substring 메서드
substring(4)를 하면 index 0 ~ 4를 제외한 index 5부터의 값을 반환한다.
substring(4, 12)인 경우, index 4 ~ 11까지의 값을 반환한다. (12가 아닌 11!)
10. 개인정보 수집 유효기간
https://school.programmers.co.kr/learn/courses/30/lessons/150370
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
.을 split?
계속해서 s.split(".")을 하는데 indexOutofBounds 에러가 발생했다. 도저히 이해가 안되서 구글링해보니 "."는 모든 문자로 인식하기 때문에
String [] s = st.split("\\.");
이 형태로 써야 제대로 날짜가 잘렸다.
날짜 계산
나는 날짜를 계산할 때 년도 + 월 + 일을 더해서 비교하는 계산을 즐겨하는데,
12 * 28 * 년도 + 28 * 월 + 일을 결과값으로 비교해줘야한다.
년도 * 12 * 월 + 28 * 일이 아닌.
밑의 공식으로 계산해서 틀렸다.
앞으로 총합을 구할 때는 년도에 월 * 일을 더해주자.
11. 유연근무제
https://school.programmers.co.kr/learn/courses/30/lessons/388351
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
날짜의 계산은 100으로 나눴을 때 나머지가 60이 넘는 경우엔 시간 - 40을 해줬다. (10시 99분일 때는 10시 59분으로 변환해준다는 뜻)
문제풀이를 할 때 주말인 경우에 continue를 해줬는데, 이 때 day + 1 업데이트를 해주지 않았고
날짜 계산하는 로직에서 처음 출근 희망 날짜 계산을 잘못해줘서 시간이 조금 걸렸다. 이외에는 무난하게 풀었다.
12. 신고 결과 받기
https://school.programmers.co.kr/learn/courses/30/lessons/92334
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
- 처음에 Report 배열을 순회하며 Map<String, HashSet<String>> 형태에 신고자와 신고당한 사람의 정보를 저장한다. (이 때 HashSet 자료구조를 사용하는 것은 한번에 한명의 유저를 신고할 수 있기 때문)
- Map<String, Integer> 형태의 신고당한 횟수를 저장하는 맵을 선언하고 위에 선언한 맵을 순회하며 신고당한 사람들의 등장횟수를 저장한다.
- 다시 1번에서 선언했던 맵을 순회하며 Set에 존재하는 사람의 신고횟수가 >= k인 경우에 cnt를 1 더해준다.
- 문제에서 처음에 주어진 사람들이 신고 결과를 받는 맵을 저장해야 한다. Map<String, Integer> 형태의 맵을 선언하여 3번에서 구했던 cnt를 넣어준다.
- id_list를 순회하며 4번 맵의 value값들을 넣어주면 끝이다!
나는 2번에서 기존에 [신고당한 사람, 신고한 사람] 형태로 저장을 해줬는데, [신고한 사람, 신고 당한사람] 형태가 되어야 맞다. 그래야만 나중에 신고 결과값을 올바르게 받을 수 있기 때문이다. 순서가 잘못 나와서 멘붕이 오고 어디서부터 코드를 뜯어야 고민이 됐는데 2번 로직에서 순서만 바꿔서 간단히 해결했다.
예전엔 답지를 봐도 이해가 잘 되지 않았던 것 같은데 손쉽게 해결했다.
13. 택배 상자 꺼내기
https://school.programmers.co.kr/learn/courses/30/lessons/389478
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
멍청하게 삽질을 해서 한번 gpt의 도움을 받았다.
while (cur >= 0) {
right(board, cur,w);
cur -= 1;
if (cur < 0) break;
left(board, cur,w);
cur -= 1;
}
현재 cur이 board의 x좌표인데 왼쪽, 오른쪽 계산을 마칠때마다 위로 이동할 수 있도록 계산하며 로직을 구현했다.
하지만, 자꾸 -1 OOB 에러가 떠서 cur이 0보다 작아질 때 생기는 이슈인 것은 인지했지만 시간을 헤매며 gpt의 도움을 받았다.
답은 의외로 간단하게 left 연산을 하기 전에 cur가 0보다 작아지면 break를 통해 루프를 탈출하면 됐다..
더 꼼꼼하게 생각해보자.
14. 가장 많이 받은 선물
https://school.programmers.co.kr/learn/courses/30/lessons/258712
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
약 한시간 정도를 들여서 풀어냈다. 문제를 다른사람들과 달리 꽤나 특이하게 풀어냈다. (다시보니 좋아요 제일 많이 받은 사람도 2차원 배열로 풀었음)

Map<String, Set<String>> 형태로 [준 사람, 받은 사람들] 정보를 저장하려고 했는데 이렇게 했을 때 그 반대의 경우를 어떻게 저장해야하나 고민이 많았다. 그러다가 주어진 예제의 형태가 2차원 배열과 똑같다는 느낌이 들어 배열을 통해 풀어냈다.
로직은 다음과 같다.
- 2차원 배열을 선언하고, gifts를 순회하며 예를 들어 현재 값이 [muzi frodo]라면 배열의 [muzi, frodo] 인덱스에 해당하는 곳에 +1을 해주었다.
- 이제 2차원 배열이 완성됐으니, 선물 점수를 저장할 해쉬맵을 선언하여 가로는 준 점수니 +, 세로는 받은 점수니 -를 계산해서 해당 결과값을 [사람, 선물점수] 형태로 저장한다.
- 다시 2차원 배열을 순회하며 선물 지수를 비교해준다. 이 때 두가지 조건을 통해 비교를 해주었다.
- 주고받은 선물이 더 많을 때 `(arr[i][j] > arr[j][i])` 인 경우
- 주고받은 선물 갯수가 동일하거나 서로 주고받은 내역이 없는 경우 `(i != j && arr[i][j] == arr[j][i])` 이때 i != j 조건을 추가한 이유는 자신과 선물을 주고받을 수 없기 때문이다. 해당 경우에는 arr[i][j]에 해당하는 선물 지수가 더 큰 경우에만 계산해주었다.
- 이렇게 각 사람을 순회하며 3번의 결과값을 계산하는데, 이 때의 최댓값을 계산해서 구해주면 됐다.
이렇게 카카오 1단계 구현문제들을 전부 풀었는데, 로직들을 먼저 공책에 적고 구현을 하니 이전보다 확실히 정확하고 빠르게 풀었다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
| [카카오 인턴] 경주로 건설 (2) | 2025.06.01 |
|---|---|
| [프로그래머스] 지게차와 크레인 (0) | 2025.02.25 |
| 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 (1) | 2024.12.30 |
| 자동차 평균 대여 기간 구하기 (1) | 2024.12.29 |
| 즐겨찾기가 가장 많은 식당 정보 출력하기 (3) | 2024.12.26 |