주제에 대한 기사를 찾고 있습니까 “카카오 코딩 테스트“? 웹사이트에서 이 주제에 대한 전체 정보를 제공합니다 https://c1.castu.org 탐색에서: c1.castu.org/blog. 바로 아래에서 이 주제에 대한 자세한 답변을 찾을 수 있습니다. 찾고 있는 주제를 더 잘 이해하려면 끝까지 읽으십시오. 더 많은 관련 검색어: 카카오 코딩 테스트 카카오 코딩테스트 후기, 카카오 코딩테스트 부정행위, 카카오 코딩테스트 난이도, 카카오 코딩테스트 합격 기준, 카카오 코딩테스트 준비기간, 카카오 2023 코딩테스트, 카카오 코딩테스트 난이도 백준, 카카오 코딩테스트 커트라인
Table of Contents
카카오, 2023 신입 개발자 블라인드 채용 진행
카카오는 지원자들을 위해 카카오 기술불로그와 카카오 공식 유튜브 채널에 채용 관련 콘텐츠를 공개했다. 연차와 상관없이 누구나 열린 생각으로 의견을 나눌 수 있는 소통 문화, 전문 지식과 프로젝트 경험을 공유하는 ‘테크톡 (Tech Talk)’, 인프라/플랫폼 교육, 아이디어를 표출/실행해 볼 수 있는 사내 해커톤 (24K Reunion) 등 카카오만의 문화와 복지, 개발 환경, 지원 제도 등에 관한 내용을 담았다.
카카오(각자 대표 남궁훈, 홍은택)는 ‘2023 신입 개발자 공개 채용’을 진행한다고 밝혔다. 지원 기간은 9월 1일부터 9월 19일 오후 5시까지로, 카카오 영입 홈페이지에서 지원할 수 있다. 모집 분야는 ▲ 인프라 ▲ 프로그래밍 총 2개로 1개만 선택 가능하며, 신입부터 기술 경력 3년 미만 개발자가 대상이다.
카카오는 2017년부터 지원서에 학력, 전공, 나이, 성별 등의 정보를 받지 않는 블라인드 채용 방식을 이어오고 있다. 우수한 개발자를 선발하기 위해 채용 과정에서 지원자의 스펙이 아닌 능력을 검증하고 개발 역량과 업무 적합성을 집중적으로 고려한다는 취지다.
1 thg 9, 2022 — 카카오 인재영입 사이트에서 성명, 이메일, 휴대전화 번호 등을 입력한 후 본인 계정을 생성하면 누구나 1차 온라인 코딩테스트에 응시할 수 있다. 카카오 …
- Source: www.kakaocorp.com
- Views: 22449
- Publish date: 23 hours ago
- Downloads: 97206
- Likes: 9859
- Dislikes: 10
- Title Website: 카카오, 2023 신입 개발자 블라인드 채용 진행
- Description Website: 1 thg 9, 2022 — 카카오 인재영입 사이트에서 성명, 이메일, 휴대전화 번호 등을 입력한 후 본인 계정을 생성하면 누구나 1차 온라인 코딩테스트에 응시할 수 있다. 카카오 …
- Source: Youtube
- Views: 36698
- Date: 8 hours ago
- Download: 95241
- Likes: 2362
- Dislikes: 9
카카오, 2023 신입 개발자 블라인드 채용 진행
– 9월 1일부터 9월 19일까지 인재 영입 홈페이지에서 지원 접수
– 스펙 아닌 개발 역량/업무 적합성 고려하는 블라인드 채용 방식
– 코딩테스트-인터뷰 거쳐 두자릿수 규모 최종 선발
[2022–09-01] 카카오가 자기 주도적으로 일하고 함께 소통하며 성장할 신입 개발자를 찾는다.카카오(각자 대표 남궁훈, 홍은택)는 ‘2023 신입 개발자 공개 채용’을 진행한다고 밝혔다. 지원 기간은 9월 1일부터 9월 19일 오후 5시까지로, 카카오 영입 홈페이지에서 지원할 수 있다. 모집 분야는 ▲ 인프라 ▲ 프로그래밍 총 2개로 1개만 선택 가능하며, 신입부터 기술 경력 3년 미만 개발자가 대상이다.
카카오 인재영입 사이트에서 성명, 이메일, 휴대전화 번호 등을 입력한 후 본인 계정을 생성하면 누구나 1차 온라인 코딩테스트에 응시할 수 있다.
카카오는 2017년부터 지원서에 학력, 전공, 나이, 성별 등의 정보를 받지 않는 블라인드 채용 방식을 이어오고 있다. 우수한 개발자를 선발하기 위해 채용 과정에서 지원자의 스펙이 아닌 능력을 검증하고 개발 역량과 업무 적합성을 집중적으로 고려한다는 취지다.
채용 전형은 9월 24일 1차 온라인 코딩 테스트를 시작으로 2차 온라인 코딩 테스트, 1,2차 인터뷰 순으로 진행한다. 최종 합격자는 두자릿수 규모로 11월 중 선발 예정이다.
카카오는 지원자들을 위해 카카오 기술불로그와 카카오 공식 유튜브 채널에 채용 관련 콘텐츠를 공개했다. 연차와 상관없이 누구나 열린 생각으로 의견을 나눌 수 있는 소통 문화, 전문 지식과 프로젝트 경험을 공유하는 ‘테크톡 (Tech Talk)’, 인프라/플랫폼 교육, 아이디어를 표출/실행해 볼 수 있는 사내 해커톤 (24K Reunion) 등 카카오만의 문화와 복지, 개발 환경, 지원 제도 등에 관한 내용을 담았다.
카카오 서환 인재영입 팀장은 “개발자들이 좋은 문화, 좋은 동료, 좋은 환경 속에서 주도적으로 역량을 발휘할 수 있도록 적극 지원할 계획이다. 열정과 실력을 갖춘 인재들의 많은 관심과 지원을 기대한다”고 전했다.
한편, 카카오는 올 상반기 테크 분야 채용 연계형 인턴십을 진행하고 세자릿 수 합격자를 최종 선발한 바 있다. [끝] [참고]
카카오 영입 홈페이지: https://careers.kakao.com
카카오 기술 블로그: https://tech.kakao.com/blog/
카카오 공식 유튜브 채널: https://youtu.be/P_djCpA1Wd0
카카오 신입 공채 1차 코딩 테스트 문제 모음 – 달려라 승이
결과를 모니터링하며 점진적으로 개선해나가는 역량을 테스트할 수 있도록 2차 문제에 녹여내고자 하였습니다.
총 7문제가 출제됐고, 응시자는 5시간 이내에 순서와 상관없이 문제를 해결해야 했습니다.
요구사항을 꼼꼼하게 분석하고, 트레이드오프를 감안하여 디자인하여 구현하는 역량
8 thg 6, 2021 — 2018 | 1차 1차 합격 기준은 총 7 문제 중 4 문제 이상을 풀이한 분들. 각 문제는 배점이 동일하므로 어떤 문제를 풀었던지 간에 관계는 없습니다.
- Source: dkanxmstmdgml.tistory.com
- Views: 82536
- Publish date: 33 minute ago
- Downloads: 13872
- Likes: 9371
- Dislikes: 5
- Title Website: 카카오 신입 공채 1차 코딩 테스트 문제 모음 – 달려라 승이
- Description Website: 8 thg 6, 2021 — 2018 | 1차 1차 합격 기준은 총 7 문제 중 4 문제 이상을 풀이한 분들. 각 문제는 배점이 동일하므로 어떤 문제를 풀었던지 간에 관계는 없습니다.
카카오 코딩 테스트 – 합승 택시 요금 (Python 풀이)
- Source: Youtube
- Views: 84463
- Date: 2 minute ago
- Download: 104611
- Likes: 1935
- Dislikes: 1
카카오 신입 공채 1차 코딩 테스트 문제 모음
2018
| 1차
1차 합격 기준은 총 7 문제 중 4 문제 이상을 풀이한 분들.
각 문제는 배점이 동일하므로 어떤 문제를 풀었던지 간에 관계는 없습니다.
비밀지도 (난이도: 하) 정답률 81.78%
다트게임 (난이도: 하) 정답률 73.47%
캐시 (난이도: 하) 정답률 45.26%
셔틀버스 (난이도: 중) 정답률 26.79%
뉴스 클러스터링 (난이도: 중) 정답률 41.84%
프렌트4블록 (난이도: 상) 정답률 48.01%
추석 트래픽 (난이도: 상) 정답률 17.99%
| 2차
“구현” 위주의 문제들로 구성
탄탄한 기본기를 바탕으로 새로운 것을 빠르게 습득하는 역량
요구사항을 꼼꼼하게 분석하고, 트레이드오프를 감안하여 디자인하여 구현하는 역량
결과를 모니터링하며 점진적으로 개선해나가는 역량을 테스트할 수 있도록 2차 문제에 녹여내고자 하였습니다.
| 3차
* 코딩테스트
N진수 게임 :: 정답률 91.85%
압축 :: 정답률 95.80%
파일명 정렬 :: 정답률 66.95%
방금그곡 :: 정답률 47.50%
자동완성 :: 정답률 34.07%
* 필기문제
kakao-blind-recruitment.pdf 0.34MB
2019
5시간 동안
효율성 테스트가 있는 문제에서는 부분점수가 부여되도록
오픈채팅방 정답률: 59.91%
실패율 정답률: 55.57%
후보키 정답률: 16.09%
무지의 먹방 라이브 정확성 42.08% / 효율성 5.52%
길 찾기 게임 정답률: 7.40%
매칭 점수 정답률: 6.12%
블록게임 정답률: 5.85%
2019
오후 2시부터 6시까지 총 4시간
2020
– 신입 채용
총 7문제가 출제됐고, 응시자는 5시간 이내에 순서와 상관없이 문제를 해결해야 했습니다.
문제1 정답률: 25.9%
문제2 정답률: 23.1%
문제3 정답률: 7.4%
문제4 정확성: 34.4% 효율성: 0.8%
문제5 정답률: 1.9%
문제6 정답률: 0.6%
문제7 정답률: 1.4%
– 인턴 채용
2021
| 1차
5시간 동안 총 7개의 문제
아이디추천 정답률 : 57.50%
메뉴 리뉴얼 정답률 : 25.40%
순위 검색 정확성 44.07%, 효율성 4.49%
합승 택시 요금 정확성 9.60%, 효율성 7.45%
광고 삽입 정답률 : 1.23%
카드 짝 맞추기 정답률 : 0.95%
매출 하락 최소화 정답률 : 0.57%
2022 카카오 신입 공채 1차 온라인 코딩테스트 for Tech … – Kakao
의 길이 ≤ 1,000 records의 각 원소는 “시각 차량번호 내역” 형식의 문자열입니다. 시각 , 차량번호 , 내역 은 하나의 공백으로 구분되어 있습니다. 시각 은 차량이 입차되거나 출차된 시각을 나타내며, HH:MM 형식의 길이 5인 문자열입니다. HH:MM 은 00:00부터 23:59까지 주어집니다. 잘못된 시각(“25:22”, “09:65” 등)은 입력으로 주어지지 않습니다. 차량번호 는 자동차를 구분하기 위한, 0 ~ 9 로 구성된 길이 4인 문자열입니다. 내역 은 길이 2 또는 3인 문자열로, IN 또는 OUT 입니다. IN 은 입차를, OUT 은 출차를 의미합니다. records의 원소들은 시각을 기준으로 오름차순으로 정렬되어 주어집니다. records는 하루 동안의 입/출차된 기록만 담고 있으며, 입차된 차량이 다음날 출차되는 경우는 입력으로 주어지지 않습니다. 같은 시각에, 같은 차량번호의 내역이 2번 이상 입력으로 주어지지 않습니다. 마지막 시각(23:59)에 입차되는 경우는 입력으로 주어지지 않습니다. 아래의 예를 포함하여, 잘못된 입력은 주어지지 않습니다. 주차장에 없는 차량이 출차되는 경우 주차장에 이미 있는 차량(차량번호가 같은 차량)이 다시 입차되는 경우
플레이어 A가 초기 위치 (1, 0)에서 (1, 1)로 이동합니다. 플레이어 A가 (0, 0)이나 (2, 0)으로 이동할 경우 승리를 보장할 수 없습니다. 따라서 무조건 이길 방법이 있는 (1, 1)로 이동합니다. 플레이어 B는 (1, 1)로 이동할 경우, 바로 다음 차례에 A가 위 또는 아래 방향으로 이동하면 발판이 없어져 패배하게 됩니다. 질 수밖에 없는 플레이어는 최대한 오래 버티도록 플레이하기 때문에 (1, 1)로 이동하지 않습니다. (1, 2)에서 위쪽 칸인 (0, 2)로 이동합니다. A가 (1, 1)에서 (0, 1)로 이동합니다. B에게는 남은 선택지가 (0, 1)밖에 없습니다. 따라서 (0, 2)에서 (0, 1)로 이동합니다. A가 (0, 1)에서 (0, 0)으로 이동합니다. 이동을 완료함과 동시에 B가 서있던 (0, 1)의 발판이 사라집니다. B가 패배합니다. 만약 과정 2에서 B가 아래쪽 칸인 (2, 2)로 이동하더라도 A가 (2, 1)로 이동하면 됩니다. 이후 B가 (2, 1)로 이동, 다음 차례에 A가 (2, 0)으로 이동하면 B가 패배합니다.
예를 들어, 위 그림의 경우(루트 노드에는 항상 양이 있습니다) 0번 노드(루트 노드)에서 출발하면 양을 한 마리 모을 수 있습니다. 다음으로 1번 노드로 이동하면 당신이 모은 양은 두 마리가 됩니다. 이때, 바로 4번 노드로 이동하면 늑대 한 마리가 당신을 따라오게 됩니다. 아직은 양 2마리, 늑대 1마리로 양이 잡아먹히지 않지만, 이후에 갈 수 있는 모든 노드에는 늑대가 있고, 이어서 늑대가 있는 노드로 이동한다면(예를 들어 바로 6번 노드로 이동한다면) 양 2마리, 늑대 2마리가 되어 양이 모두 잡아먹힙니다. 여기서는 0번, 1번 노드를 방문하여 양을 2마리 모은 후, 8번 노드로 이동한 후(양 2마리 늑대 1마리) 이어서 7번, 9번 노드를 방문하면 양 4마리 늑대 1마리가 됩니다. 이제 4번, 6번 노드로 이동하면 양 4마리, 늑대 3마리가 되며, 이제 5번 노드로 이동할 수 있게 됩니다. 따라서 양을 최대 5마리 모을 수 있습니다.
- Source: tech.kakao.com
- Views: 13751
- Publish date: 17 hours ago
- Downloads: 32874
- Likes: 6437
- Dislikes: 10
- Title Website: 2022 카카오 신입 공채 1차 온라인 코딩테스트 for Tech … – Kakao
- Description Website:
- Source: Youtube
- Views: 74470
- Date: 54 minute ago
- Download: 85286
- Likes: 2668
- Dislikes: 7
2022 카카오 신입 공채 1차 온라인 코딩테스트 for Tech developers 문제해설
지난 2021년 9월 11일 토요일 오후 2시부터 7시까지 5시간 동안 2022 KAKAO BLIND RECRUITMENT 1차 코딩 테스트 가 진행되었습니다. 테스트에는 총 7개의 문제가 출제되었으며, 개발 언어는 C++ , Java , JavaScript , Kotlin , Python , Swift 총 6가지가 제공되었습니다.
문제는 작년과 마찬가지로 쉬운 난이도에서 어려운 난이도 순으로 배치했습니다. 6번 문제를 제외한 나머지 문제는 테스트 케이스를 모두 통과해야 정답으로 인정되었고, 부문 점수는 부여되지 않았습니다. 6번 문제에는 효율적인 풀이를 구현해야 통과되는 효율성 테스트를 추가했고, 효율성 테스트는 정확성 테스트와 별도의 점수가 부여되도록 배점을 설계했습니다.
그럼 각 문제들을 살펴보고 해설을 진행하겠습니다.
문제 1 – 신고 결과 받기
정답률 : 80.13%
문제 1 풀러가기
문제 설명
신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.
각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
k번 이상 신고된 유저는 즉시 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
게시판 이용이 정지된 유저도 불량 이용자를 신고할 수 있습니다.
다음은 전체 유저 목록이 [“muzi”, “frodo”, “apeach”, “neo”]이고, k = 2(즉, 2번 이상 신고 당하면 이용 정지)인 경우의 예시입니다.
유저 ID 신고 ID 설명 “muzi” “frodo” “muzi”가 “frodo”를 신고했습니다. “apeach” “frodo” “apeach”가 “frodo”를 신고했습니다. “frodo” “neo” “frodo”가 “neo”를 신고했습니다. “muzi” “neo” “muzi”가 “neo”를 신고했습니다. “apeach” “muzi” “apeach”가 “muzi”를 신고했습니다.
각 유저별로 신고 당한 횟수는 다음과 같습니다.
유저 ID 신고 당한 횟수 “muzi” 1 “frodo” 2 “apeach” 0 “neo” 2
위 예시에서는 2번 이상 신고당한 “frodo”와 “neo”의 게시판 이용이 정지됩니다. 이때, 각 유저별로 신고한 아이디와 정지된 아이디를 정리하면 다음과 같습니다.
유저 ID 신고 ID 정지 ID “muzi” [“frodo”, “neo”] [“frodo”, “neo”] “frodo” [“neo”] [“neo”] “apeach” [“muzi”, “frodo”] [“frodo”] “neo” 없음 없음
따라서 “muzi”는 처리 결과 메일을 2회, “frodo”와 “apeach”는 각각 처리 결과 메일을 1회 받게 됩니다.
이용자의 id가 담긴 문자열 배열 id_list , 각 이용자가 신고한 이용자에 대한 정보가 담긴 문자열 배열 report , 정지 기준이 되는 신고 횟수 k 가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
제한사항
2 ≤ id_list 의 길이 ≤ 1,000
의 길이 ≤ 1,000 1 ≤ id_list 의 원소 길이 ≤ 10
의 원소 길이 ≤ 10 id_list 의 원소는 이용자의 id를 나타내는 문자열이며 알파벳 소문자로만 이루어져 있습니다.
의 원소는 이용자의 id를 나타내는 문자열이며 알파벳 소문자로만 이루어져 있습니다. 1 ≤ report 의 길이 ≤ 200,000
의 길이 ≤ 200,000 3 ≤ report 의 원소 길이 ≤ 21
의 원소 길이 ≤ 21 report 의 원소는 “이용자 id 신고 id”형태의 문자열입니다.
의 원소는 “이용자 id 신고 id”형태의 문자열입니다. 예를 들어 “muzi frodo”의 경우 “muzi”가 “frodo”를 신고했다는 의미입니다.
id는 알파벳 소문자로만 이루어져 있습니다.
이용자 id와 신고 id는 공백(스페이스) 하나로 구분되어 있습니다.
자기 자신을 신고하는 경우는 없습니다.
1 ≤ k ≤ 200, k 는 자연수
≤ 200, 는 자연수 return 하는 배열은 id_list 에 담긴 id 순서대로 각 유저가 받은 결과 메일 수를 담으면 됩니다.
입출력 예
id_list report k result [“muzi”, “frodo”, “apeach”, “neo”] [“muzi frodo”,”apeach frodo”,”frodo neo”,”muzi neo”,”apeach muzi”] 2 [2,1,1,0] [“con”, “ryan”] [“ryan con”, “ryan con”, “ryan con”, “ryan con”] 3 [0,0]
입출력 예 설명
• 입출력 예 #1
문제의 예시와 같습니다.
• 입출력 예 #2
“ryan”이 “con”을 4번 신고했으나, 주어진 조건에 따라 한 유저가 같은 유저를 여러 번 신고한 경우는 신고 횟수 1회로 처리합니다. 따라서 “con”은 1회 신고당했습니다. 3번 이상 신고당한 이용자는 없으며, “con”과 “ryan”은 메일을 받지 않습니다. 따라서 [0, 0]을 return 합니다.
문제 풀이
이 문제는 해시 자료구조를 활용할 수 있는지 묻는 문제였습니다.
report를 하나씩 처리하면서 각 유저가 누구에게 신고를 당했는지 목록을 만듭니다.
[신고된 유저 아이디 1] : [신고한 유저 A, 신고한 유저 B, … ] [신고된 유저 아이디 2] : [신고한 유저 A, 신고한 유저 C, … ] … [신고된 유저 아이디 N] : [신고한 유저 X, 신고한 유저 Y, … ]유저 아이디는 최대 1,000개, report의 길이는 최대 200,000이므로 신고된 유저 아이디를 배열에 관리한다면 최악의 경우 O(아이디 개수 * report의 길이) 만큼의 시간이 걸립니다. 따라서 신고된 유저 아이디를 해시(또는 연관 배열) 자료구조를 이용해 관리하면 효율적으로 목록을 완성할 수 있습니다. 이때, 신고한 유저 목록에는 같은 아이디가 중복되어 들어가지 않도록 주의해야 합니다.
위와 같이 목록을 만들었다면 신고된 유저 아이디를 순회하면서 정지 기준을 만족하는 유저가 있다면(신고한 유저 수가 k 이상이면) 신고한 유저 목록을 순회하면서 메일을 보냈다는 표시(카운트를 1 증가) 해주면 됩니다.
문제 2 – k 진수에서 소수의 개수 구하기
정답률 : 55.82%
문제 2 풀러가기
문제 설명
양의 정수 n 이 주어집니다. 이 숫자를 k 진수로 바꿨을 때, 변환된 수 안에 아래 조건에 맞는 소수(Prime number)가 몇 개인지 알아보려 합니다.
0P0 처럼 소수 양쪽에 0이 있는 경우
처럼 소수 양쪽에 0이 있는 경우 P0 처럼 소수 오른쪽에만 0이 있고 왼쪽에는 아무것도 없는 경우
처럼 소수 오른쪽에만 0이 있고 왼쪽에는 아무것도 없는 경우 0P 처럼 소수 왼쪽에만 0이 있고 오른쪽에는 아무것도 없는 경우
처럼 소수 왼쪽에만 0이 있고 오른쪽에는 아무것도 없는 경우 P 처럼 소수 양쪽에 아무것도 없는 경우
처럼 소수 양쪽에 아무것도 없는 경우 단, P 는 각 자릿수에 0을 포함하지 않는 소수입니다.
는 각 자릿수에 0을 포함하지 않는 소수입니다. 예를 들어, 101은 P 가 될 수 없습니다.
예를 들어, 437674을 3진수로 바꾸면 211020101011입니다. 여기서 찾을 수 있는 조건에 맞는 소수는 왼쪽부터 순서대로 211, 2, 11이 있으며, 총 3개입니다. 211은 P0 형태에서 찾을 수 있으며, 2는 0P0 에서, 11은 0P 에서 찾을 수 있습니다.
정수 n 과 k 가 매개변수로 주어집니다. n 을 k 진수로 바꿨을 때, 변환된 수 안에서 찾을 수 있는 위 조건에 맞는 소수의 개수를 return 하도록 solution 함수를 완성해 주세요.
제한사항
1 ≤ n ≤ 1,000,000
≤ 1,000,000 3 ≤ k ≤ 10
입출력 예
n k result 437674 3 3 110011 10 2
입출력 예 설명
• 입출력 예 #1
문제 예시와 같습니다.
• 입출력 예 #2
110011을 10진수로 바꾸면 110011입니다. 여기서 찾을 수 있는 조건에 맞는 소수는 11, 11 2개입니다. 이와 같이, 중복되는 소수를 발견하더라도 모두 따로 세어야 합니다.
문제 풀이
이 문제는 진법 변환 후에 변환된 숫자를 0을 기준으로 파싱하고, 파싱 한 숫자를 소수 판별해 해결할 수 있는 문제입니다.
소수 판별하는 데에는 대표적으로 2가지 방법이 있습니다. 첫 번째로 에라토스테네스의 체가 있고, 두 번째는 어떤 수 n을 2부터 루트(n)까지 나눈 나머지가 모두 0이 아님을 확인하는 방법이 있습니다. 효율적인 소수 판별 알고리즘인 에라토스테네스의 체를 사용해서도 풀 수 있지만, 이 문제에서는 두 번째 방법으로도 충분히 해결할 수 있습니다.
이 문제의 제한사항을 살펴보면 n이 1부터 1,000,000까지이고 k는 3부터 10까지이므로, 1,000,000을 3진수로 바꾸면 1,212,210,202,001입니다. 일반적으로 진법 변환은 문자열을 사용해 구현하므로, 진법 변환된 문자열을 0을 기준으로 파싱 한 후에 소수를 판별하는 과정에서 정수 자료형으로 변환이 필요하게 됩니다. 이때, 개발 언어에 따라서 int 자료형의 표현 범위를 벗어날 수 있음을 유의해서 문제를 풀어야 합니다. 예를 들어 997,244를 3진수로 바꾸면 1,212,122,221,222가 됩니다. 이 숫자는 0이 없기 때문에 진법 변환된 숫자 그대로 정수 자료형으로 변환해서 소수 판별을 해야 하는데, 이는 int 자료형의 표현 범위를 벗어난다는 것을 알 수 있습니다.
문제 3 – 주차 요금 계산
정답률 : 73.10%
문제 3 풀러가기
문제 설명
주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.
요금표
기본 시간(분) 기본 요금(원) 단위 시간(분) 단위 요금(원) 180 5000 10 600
입/출차 기록
시각(시:분) 차량 번호 내역 05:34 5961 입차 06:00 0000 입차 06:34 0000 출차 07:59 5961 출차 07:59 0148 입차 18:59 0000 입차 19:09 0148 출차 22:59 5961 입차 23:00 5961 출차
자동차별 주차 요금
차량 번호 누적 주차 시간(분) 주차 요금(원) 0000 34 + 300 = 334 5000 + ⌈ (334 – 180) / 10 ⌉ x 600 = 14600 0148 670 5000 + ⌈ (670 – 180) / 10 ⌉ x 600 = 34400 5961 145 + 1 = 146 5000
어떤 차량이 입차된 후에 출차된 내역이 없다면, 23:59에 출차된 것으로 간주합니다. 0000 번 차량은 18:59에 입차된 이후, 출차된 내역이 없습니다. 따라서, 23:59에 출차된 것으로 간주합니다.
00:00부터 23:59까지의 입/출차 내역을 바탕으로 차량별 누적 주차 시간을 계산하여 요금을 일괄로 정산합니다.
누적 주차 시간이 기본 시간 이하라면, 기본요금 을 청구합니다.
이하라면, 을 청구합니다. 누적 주차 시간이 기본 시간 을 초과하면, 기본요금 에 더해서, 초과한 시간에 대해서 단위 시간 마다 단위 요금 을 청구합니다.
을 초과하면, 에 더해서, 초과한 시간에 대해서 마다 을 청구합니다. 초과한 시간이 단위 시간 으로 나누어떨어지지 않으면, 올림 합니다.
으로 나누어떨어지지 않으면, 합니다. ⌈ a ⌉ : a보다 작지 않은 최소의 정수를 의미합니다. 즉, 올림 을 의미합니다.
주차 요금을 나타내는 정수 배열 fees , 자동차의 입/출차 내역을 나타내는 문자열 배열 records 가 매개변수로 주어집니다. 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해 주세요.
제한사항
fees 의 길이 = 4
의 길이 = 4 fees[0] = 기본 시간(분) 1 ≤ fees[0] ≤ 1,439
fees[1] = 기본 요금(원) 0 ≤ fees[1] ≤ 100,000
fees[2] = 단위 시간(분) 1 ≤ fees[2] ≤ 1,439
fees[3] = 단위 요금(원) 1 ≤ fees[3] ≤ 10,000
1 ≤ records 의 길이 ≤ 1,000
의 길이 ≤ 1,000 records의 각 원소는 “시각 차량번호 내역” 형식의 문자열입니다. 시각 , 차량번호 , 내역 은 하나의 공백으로 구분되어 있습니다. 시각 은 차량이 입차되거나 출차된 시각을 나타내며, HH:MM 형식의 길이 5인 문자열입니다. HH:MM 은 00:00부터 23:59까지 주어집니다. 잘못된 시각(“25:22”, “09:65” 등)은 입력으로 주어지지 않습니다. 차량번호 는 자동차를 구분하기 위한, 0 ~ 9 로 구성된 길이 4인 문자열입니다. 내역 은 길이 2 또는 3인 문자열로, IN 또는 OUT 입니다. IN 은 입차를, OUT 은 출차를 의미합니다. records의 원소들은 시각을 기준으로 오름차순으로 정렬되어 주어집니다. records는 하루 동안의 입/출차된 기록만 담고 있으며, 입차된 차량이 다음날 출차되는 경우는 입력으로 주어지지 않습니다. 같은 시각에, 같은 차량번호의 내역이 2번 이상 입력으로 주어지지 않습니다. 마지막 시각(23:59)에 입차되는 경우는 입력으로 주어지지 않습니다. 아래의 예를 포함하여, 잘못된 입력은 주어지지 않습니다. 주차장에 없는 차량이 출차되는 경우 주차장에 이미 있는 차량(차량번호가 같은 차량)이 다시 입차되는 경우
형식의 문자열입니다.
입출력 예
fees records result [180, 5000, 10, 600] [“05:34 5961 IN”, “06:00 0000 IN”, “06:34 0000 OUT”, “07:59 5961 OUT”, “07:59 0148 IN”, “18:59 0000 IN”, “19:09 0148 OUT”, “22:59 5961 IN”, “23:00 5961 OUT”] [14600, 34400, 5000] [120, 0, 60, 591] [“16:00 3961 IN”,”16:00 0202 IN”,”18:00 3961 OUT”,”18:00 0202 OUT”,”23:58 3961 IN”] [0, 591] [1, 461, 1, 10] [“00:00 1234 IN”] [14841]
입출력 예 설명
• 입출력 예 #1
문제 예시와 같습니다.
• 입출력 예 #2
요금표
기본 시간(분) 기본 요금(원) 단위 시간(분) 단위 요금(원) 120 0 60 591
입/출차 기록
시각(시:분) 차량 번호 내역 16:00 3961 입차 16:00 0202 입차 18:00 3961 출차 18:00 0202 출차 23:58 3961 입차
자동차별 주차 요금
차량 번호 누적 주차 시간(분) 주차 요금(원) 0202 120 0 3961 120 + 1 = 121 0 + ⌈ (121 – 120) / 60 ⌉ x 591 = 591
3961 번 차량은 2번째 입차된 후에는 출차된 내역이 없으므로, 23:59에 출차되었다고 간주합니다.
• 입출력 예 #3
요금표
기본 시간(분) 기본 요금(원) 단위 시간(분) 단위 요금(원) 1 461 1 10
입/출차 기록
시각(시:분) 차량 번호 내역 00:00 1234 입차
자동차별 주차 요금
차량 번호 누적 주차 시간(분) 주차 요금(원) 1234 1439 461 + ⌈ (1439 – 1) / 1 ⌉ x 10 = 14841
1234 번 차량은 출차 내역이 없으므로, 23:59에 출차되었다고 간주합니다.
문제 풀이
이 문제는 문자열 처리 능력과, 주어진 주차 요금표를 코드를 통해 정확히 구현할 수 있는지를 확인하는 문제였습니다.
특히, 이 문제는 입/출차 시각과 누적 주차 시간을 모두 ‘분’단위로 환산하여 저장하면 조금 더 쉽게 해결할 수 있습니다.
차량번호의 범위가 0000~9999이므로, 차량의 수는 최대 1만 대입니다. 이를 이용하여 두 배열 in_time, total_time을 다음과 같이 정의합니다.
in_time[i] = i번 차량이 주차장에 입차 된 시각 입차 된 적이 없거나, 출차되었다면 -1 을 저장
total_time[i] = i번 차량의 누적 주차 시간
그 후 records에 담긴 원소를 순차적으로 처리해 줍니다.
“IN”을 포함하고 있다면, 시각을 저장합니다. in_time[차량번호] = 시각
“OUT”을 포함하고 있다면, 누적 주차 시간을 갱신합니다. total_time[차량번호] += ( 시각 – in_time[차량번호] ) in_time[차량번호] = -1
records를 모두 처리한 후에도 출차되지 않은 차량이 있다면, 즉, in_time[i] != -1 인 모든 i번 차량에 대해서는 23시 59분(1439분)에 출차되었다고 간주하고, total_time[i]를 갱신해 줍니다.
total_time[i] += ( 1439 – in_time[i] )
위와 같은 방법으로 누적 주차 시간을 계산한 후, total_time[i] > 0 를 만족하는 모든 i번 차량에 대해서, 오름차순으로 주차 요금을 계산해서 배열에 담으면 문제를 해결할 수 있습니다.
문제 4 – 양궁 대회
정답률 : 21.16%
문제 4 풀러가기
문제 설명
카카오배 양궁대회가 열렸습니다.
라이언 은 저번 카카오배 양궁대회 우승자이고 이번 대회에도 결승전까지 올라왔습니다. 결승전 상대는 어피치 입니다. 카카오배 양궁대회 운영위원회는 한 선수의 연속 우승보다는 다양한 선수들이 양궁대회에서 우승하기를 원합니다. 따라서, 양궁대회 운영위원회는 결승전 규칙을 전 대회 우승자인 라이언에게 불리하게 다음과 같이 정했습니다.
1. 어피치가 화살 n 발을 다 쏜 후에 라이언이 화살 n 발을 쏩니다.
2. 점수를 계산합니다.
과녁판은 아래 사진처럼 생겼으며 가장 작은 원의 과녁 점수는 10점이고 가장 큰 원의 바깥쪽은 과녁 점수가 0점입니다.
만약, k(k는 1~10사이의 자연수)점을 어피치가 a발을 맞혔고 라이언이 b발을 맞혔을 경우 더 많은 화살을 k점에 맞힌 선수가 k 점을 가져갑니다. 단, a = b일 경우는 어피치가 k점을 가져갑니다. k점을 여러 발 맞혀도 k점 보다 많은 점수를 가져가는 게 아니고 k점만 가져가는 것을 유의하세요. 또한 a = b = 0 인 경우, 즉, 라이언과 어피치 모두 k점에 단 하나의 화살도 맞히지 못한 경우는 어느 누구도 k점을 가져가지 않습니다.
* 예를 들어, 어피치가 10점을 2발 맞혔고 라이언도 10점을 2발 맞혔을 경우 어피치가 10점을 가져갑니다. * 다른 예로, 어피치가 10점을 0발 맞혔고 라이언이 10점을 2발 맞혔을 경우 라이언이 10점을 가져갑니다.
모든 과녁 점수에 대하여 각 선수의 최종 점수를 계산합니다.
3. 최종 점수가 더 높은 선수를 우승자로 결정합니다. 단, 최종 점수가 같을 경우 어피치를 우승자로 결정합니다.
현재 상황은 어피치가 화살 n 발을 다 쏜 후이고 라이언이 화살을 쏠 차례입니다.
라이언은 어피치를 가장 큰 점수 차이로 이기기 위해서 n 발의 화살을 어떤 과녁 점수에 맞혀야 하는지를 구하려고 합니다.
화살의 개수를 담은 자연수 n , 어피치가 맞힌 과녁 점수의 개수를 10점부터 0점까지 순서대로 담은 정수 배열 info 가 매개변수로 주어집니다. 이때, 라이언이 가장 큰 점수 차이로 우승하기 위해 n 발의 화살을 어떤 과녁 점수에 맞혀야 하는지를 10점부터 0점까지 순서대로 정수 배열에 담아 return 하도록 solution 함수를 완성해 주세요. 만약, 라이언이 우승할 수 없는 경우(무조건 지거나 비기는 경우)는 [-1] 을 return 해주세요.
제한사항
1 ≤ n ≤ 10
≤ 10 info 의 길이 = 11
의 길이 = 11 0 ≤ info 의 원소 ≤ n
의 원소 ≤ info 의 원소 총합 = n
의 원소 총합 = info 의 i번째 원소는 과녁의 10 – i 점을 맞힌 화살 개수입니다. ( i는 0~10 사이의 정수입니다.)
의 i번째 원소는 과녁의 점을 맞힌 화살 개수입니다. ( i는 0~10 사이의 정수입니다.) 라이언이 우승할 방법이 있는 경우, return 할 정수 배열의 길이는 11입니다.
0 ≤ return할 정수 배열의 원소 ≤ n
return할 정수 배열의 원소 총합 = n (꼭 n발을 다 쏴야 합니다.)
(꼭 n발을 다 쏴야 합니다.) return할 정수 배열의 i번째 원소는 과녁의 10 – i 점을 맞힌 화살 개수입니다. ( i는 0~10 사이의 정수입니다.)
점을 맞힌 화살 개수입니다. ( i는 0~10 사이의 정수입니다.) 라이언이 가장 큰 점수 차이로 우승할 수 있는 방법이 여러 가지일 경우, 가장 낮은 점수를 더 많이 맞힌 경우를 return 해주세요. 가장 낮은 점수를 맞힌 개수가 같을 경우 계속해서 그다음으로 낮은 점수를 더 많이 맞힌 경우를 return 해주세요. 예를 들어, [2,3,1,0,0,0,0,1,3,0,0] 과 [2,1,0,2,0,0,0,2,3,0,0] 를 비교하면 [2,1,0,2,0,0,0,2,3,0,0] 를 return 해야 합니다. 다른 예로, [0,0,2,3,4,1,0,0,0,0,0] 과 [9,0,0,0,0,0,0,0,1,0,0] 를 비교하면 [9,0,0,0,0,0,0,0,1,0,0] 를 return 해야 합니다.
라이언이 우승할 방법이 없는 경우, return 할 정수 배열의 길이는 1입니다.
라이언이 어떻게 화살을 쏘든 라이언의 점수가 어피치의 점수보다 낮거나 같으면 [-1] 을 return 해야 합니다.
입출력 예
n info result 5 [2,1,1,1,0,0,0,0,0,0,0] [0,2,2,0,1,0,0,0,0,0,0] 1 [1,0,0,0,0,0,0,0,0,0,0] [-1] 9 [0,0,1,2,0,1,1,1,1,1,1] [1,1,2,0,1,2,2,0,0,0,0] 10 [0,0,0,0,0,0,0,0,3,4,3] [1,1,1,1,1,1,1,1,0,0,2]
입출력 예 설명
• 입출력 예 #1
어피치와 라이언이 아래와 같이 화살을 맞힐 경우,
과녁 점수 어피치가 맞힌 화살 개수 라이언이 맞힌 화살 개수 결과 10 2 3 라이언이 10점 획득 9 1 2 라이언이 9점 획득 8 1 0 어피치가 8점 획득 7 1 0 어피치가 7점 획득 6 0 0 5 0 0 4 0 0 3 0 0 2 0 0 1 0 0 0 0 0
어피치의 최종 점수는 15점, 라이언의 최종 점수는 19점입니다. 4점 차이로 라이언이 우승합니다.
하지만, 라이언이 아래와 같이 화살을 맞힐 경우 더 큰 점수 차로 우승할 수 있습니다.
과녁 점수 어피치가 맞힌 화살 개수 라이언이 맞힌 화살 개수 결과 10 2 0 어피치가 10점 획득 9 1 2 라이언이 9점 획득 8 1 2 라이언이 8점 획득 7 1 0 어피치가 7점 획득 6 0 1 라이언이 6점 획득 5 0 0 4 0 0 3 0 0 2 0 0 1 0 0 0 0 0
어피치의 최종 점수는 17점, 라이언의 최종 점수는 23점입니다. 6점 차이로 라이언이 우승합니다.
따라서 [0,2,2,0,1,0,0,0,0,0,0] 을 return 해야 합니다.
• 입출력 예 #2
라이언이 10점을 맞혀도 어피치가 10점을 가져가게 됩니다.
따라서, 라이언은 우승할 수 없기 때문에 [-1] 을 return 해야 합니다.
• 입출력 예 #3
어피치와 라이언이 아래와 같이 화살을 맞힐 경우,
과녁 점수 어피치가 맞힌 화살 개수 라이언이 맞힌 화살 개수 결과 10 0 1 라이언이 10점 획득 9 0 1 라이언이 9점 획득 8 1 2 라이언이 8점 획득 7 2 3 라이언이 7점 획득 6 0 0 5 1 2 라이언이 5점 획득 4 1 0 어피치가 4점 획득 3 1 0 어피치가 3점 획득 2 1 0 어피치가 2점 획득 1 1 0 어피치가 1점 획득 0 1 0 어피치가 0점 획득
어피치의 최종 점수는 10점, 라이언의 최종 점수는 39점입니다. 29점 차이로 라이언이 우승합니다.
하지만 라이언이 아래와 같이 화살을 맞힐 경우,
과녁 점수 어피치가 맞힌 화살 개수 라이언이 맞힌 화살 개수 결과 10 0 1 라이언이 10점 획득 9 0 1 라이언이 9점 획득 8 1 2 라이언이 8점 획득 7 2 0 어피치가 7점 획득 6 0 1 라이언이 6점 획득 5 1 2 라이언이 5점 획득 4 1 2 라이언이 4점 획득 3 1 0 어피치가 3점 획득 2 1 0 어피치가 2점 획득 1 1 0 어피치가 1점 획득 0 1 0 어피치가 0점 획득
어피치의 최종 점수는 13점, 라이언의 최종 점수는 42점입니다. 이 경우도 29점 차이로 라이언이 우승합니다.
하지만, 첫 번째 경우와 두 번째 경우를 비교했을 때, 두 번째 경우가 두 경우 중 가장 낮은 점수인 4점을 더 많이 맞혔기 때문에 [1,1,2,3,0,2,0,0,0,0,0] 이 아닌 [1,1,2,0,1,2,2,0,0,0,0] 을 return 해야 합니다.
• 입출력 예 #4
여러 경우 중에서 가장 낮은 점수를 가장 많이 맞힌, 10~3점을 한 발씩 맞히고 나머지 두 발을 0점에 맞히는 경우인 [1,1,1,1,1,1,1,1,0,0,2] 를 return 해야 합니다.
문제 풀이
이 문제는 완전 탐색, 구현 문제입니다. 이 문제는 DFS, 비트 마스킹, 중복조합 등등 다양한 방법으로도 풀이가 가능한데요, 가장 많은 풀이가 나온 DFS를 이용한 완전 탐색으로 풀이를 진행하겠습니다.
이 문제를 해결하기 위해서는 각 점수를 아예 안 맞추거나 어피치보다 1발을 더 맞히는 경우로 각 점수(10점 ~ 0점)마다 2가지(총 2048가지)를 완전 탐색하면 됩니다.
예를 들어, 어피치가 [2,0,1,1,0,0,0,0,0,0,0] 처럼 화살을 맞췄을 경우 라이언은 과녁 점수 10점을 3발 맞추거나 0발 맞추거나만 선택하면 됩니다. 9점~0점도 동일한 방식으로 어피치보다 1발을 더 맞추거나 아예 안 맞추도록 구현하면 되고, 중간에 화살을 다 쐈을 경우는 나머지 과녁 점수를 모두 0발 맞춘 것으로 처리하면 됩니다. 만약 1점까지 쏘고도 화살이 남았을 경우는 남은 화살을 0점에 다 쏘도록 처리할 수 있습니다. 이렇게 가능한 모든 경우를 살펴보면서 라이언과 어피치의 최대 점수 차이를 구하면 됩니다.
만약 10점부터 0점까지를 0발부터 n발까지 하나씩 증가시키면서 완전탐색한다면 최악의 경우 시간 초과가 발생할 수 있는 점 유의하시길 바랍니다.
중복 조합으로 푸는 경우에도 10점부터 0점까지(11가지의 경우) 총, 10발의 화살을 쏘는 게 되기 때문에 11H10 = (11 + 10 – 1) C10 = 20C10 = 184,756으로 모든 경우의 수를 확인하면서 충분히 제한 시간 안에 문제를 해결할 수 있습니다.
문제 5 – 양과 늑대
정답률 : 7.76%
문제 5 풀러가기
문제 설명
2진 트리 모양 초원의 각 노드에 늑대와 양이 한 마리씩 놓여 있습니다. 이 초원의 루트 노드에서 출발하여 각 노드를 돌아다니며 양을 모으려 합니다. 각 노드를 방문할 때마다 해당 노드에 있던 양과 늑대가 당신을 따라오게 됩니다. 이때, 늑대는 양을 잡아먹을 기회를 노리고 있으며, 당신이 모은 양의 수 보다 늑대의 수가 같거나 더 많아지면 바로 모든 양을 잡아먹어 버립니다. 당신은 중간에 양이 늑대에게 잡아먹히지 않도록 하면서 최대한 많은 수의 양을 모아서 다시 루트 노드로 돌아오려 합니다.
예를 들어, 위 그림의 경우(루트 노드에는 항상 양이 있습니다) 0번 노드(루트 노드)에서 출발하면 양을 한 마리 모을 수 있습니다. 다음으로 1번 노드로 이동하면 당신이 모은 양은 두 마리가 됩니다. 이때, 바로 4번 노드로 이동하면 늑대 한 마리가 당신을 따라오게 됩니다. 아직은 양 2마리, 늑대 1마리로 양이 잡아먹히지 않지만, 이후에 갈 수 있는 모든 노드에는 늑대가 있고, 이어서 늑대가 있는 노드로 이동한다면(예를 들어 바로 6번 노드로 이동한다면) 양 2마리, 늑대 2마리가 되어 양이 모두 잡아먹힙니다. 여기서는 0번, 1번 노드를 방문하여 양을 2마리 모은 후, 8번 노드로 이동한 후(양 2마리 늑대 1마리) 이어서 7번, 9번 노드를 방문하면 양 4마리 늑대 1마리가 됩니다. 이제 4번, 6번 노드로 이동하면 양 4마리, 늑대 3마리가 되며, 이제 5번 노드로 이동할 수 있게 됩니다. 따라서 양을 최대 5마리 모을 수 있습니다.
각 노드에 있는 양 또는 늑대에 대한 정보가 담긴 배열 info , 2진 트리의 각 노드들의 연결 관계를 담은 2차원 배열 edges 가 매개변수로 주어질 때, 문제에 제시된 조건에 따라 각 노드를 방문하면서 모을 수 있는 양은 최대 몇 마리인지 return 하도록 solution 함수를 완성해 주세요.
제한사항
2 ≤ info 의 길이 ≤ 17
의 길이 ≤ 17 info 의 원소는 0 또는 1 입니다.
의 원소는 0 또는 1 입니다. info[i]는 i번 노드에 있는 양 또는 늑대를 나타냅니다.
0은 양, 1은 늑대를 의미합니다.
info[0]의 값은 항상 0입니다. 즉, 0번 노드(루트 노드)에는 항상 양이 있습니다.
edges 의 세로(행) 길이 = info 의 길이 – 1
의 세로(행) 길이 = 의 길이 – 1 edges 의 가로(열) 길이 = 2
의 가로(열) 길이 = 2 edges 의 각 행은 [부모 노드 번호, 자식 노드 번호] 형태로, 서로 연결된 두 노드를 나타냅니다.
의 각 행은 [부모 노드 번호, 자식 노드 번호] 형태로, 서로 연결된 두 노드를 나타냅니다. 동일한 간선에 대한 정보가 중복해서 주어지지 않습니다.
항상 하나의 이진 트리 형태로 입력이 주어지며, 잘못된 데이터가 주어지는 경우는 없습니다.
0번 노드는 항상 루트 노드입니다.
입출력 예
info edges result [0,0,1,1,1,0,1,0,1,0,1,1] [ [0,1],[1,2],[1,4],[0,8],[8,7],[9,10],[9,11],[4,3],[6,5],[4,6],[8,9] ] 5 [0,1,0,1,1,0,1,0,0,1,0] [ [0,1],[0,2],[1,3],[1,4],[2,5],[2,6],[3,7],[4,8],[6,9],[9,10] ] 5
입출력 예 설명
• 입출력 예 #1
문제의 예시와 같습니다.
• 입출력 예 #2
주어진 입력은 다음 그림과 같습니다.
0번 – 2번 – 5번 – 1번 – 4번 – 8번 – 3번 – 7번 노드 순으로 이동하면 양 5마리 늑대 3마리가 됩니다. 여기서 6번, 9번 노드로 이동하면 양 5마리, 늑대 5마리가 되어 양이 모두 잡아먹히게 됩니다. 따라서 늑대에게 잡아먹히지 않도록 하면서 최대로 모을 수 있는 양은 5마리입니다.
문제 풀이
4번 문제와 마찬가지로 이 문제 역시 다양한 방법으로 해결할 수 있는 문제인데요, 가장 많은 풀이가 나온 DFS를 이용한 완전탐색으로 풀이를 진행하겠습니다.
이 문제는 현재 위치, 현재까지 모은 양의 수, 늑대의 수, 그리고 다음으로 방문할 수 있는 노드 정보를 적절히 관리해 주면서 DFS를 이용해 완전탐색해서 해결할 수 있습니다. DFS를 수행하는 함수의 파라미터는 다음과 같이 구성할 수 있습니다.
DFS(현재 노드 번호, 양의 수, 늑대의 수, 다음으로 방문할 수 있는 노드의 집합)
현재 방문한 노드에 양이 있다면 양의 수를, 늑대가 있다면 늑대의 수를 1 증가시킵니다. 이때, xor 연산을 활용하면 아래와 같이 간단하게 구현할 수 있습니다. 현재 위치를 cur이라고 했을 때 현재 위치에 양이 있다면(info[cur]가 0인 경우) sheep에는 1이 더해지고, wolf에는 0이 더해집니다. 만약 늑대가 있다면 (info[cur]가 1이라면) sheep에는 0이 더해지고, wolf에는 1이 더해집니다.
sheep += info[cur] ^ 1 // xor wolf += info[cur]
다음으로 양의 수와 늑대의 수를 비교합니다. 만약 늑대가 양보다 많다면 현재 노드를 방문하는 것은 불가능하므로 더 이상 탐색하지 않습니다.
양의 수가 늑대의 수보다 더 많다면 모은 양의 최댓값을 갱신하고, 현재 노드의 자식 노드들을 다음으로 방문할 수 있는 노드 집합에 추가합니다.
이제 ‘다음으로 방문할 수 있는 노드의 집합’에 들어있는 모든 노드를 하나씩 방문하며 DFS 탐색을 수행합니다. 이 때, 다음으로 방문하는 노드의 번호를 ‘다음으로 방문할 수 있는 노드의 집합’에서 제거해 주어야 합니다.
이러한 방식으로 완전 탐색이 종료되면 최대로 모을 수 있는 양의 수를 구할 수 있습니다.
문제 6 – 파괴되지 않은 건물
정답률 : 정확성 51.11%, 효율성 1.86%
문제 6 풀러가기
문제 설명
[본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.]N x M 크기의 행렬 모양의 게임 맵이 있습니다. 이 맵에는 내구도를 가진 건물이 각 칸마다 하나씩 있습니다. 적은 이 건물들을 공격하여 파괴하려고 합니다. 건물은 적의 공격을 받으면 내구도가 감소하고 내구도가 0이하가 되면 파괴됩니다. 반대로, 아군은 회복 스킬을 사용하여 건물들의 내구도를 높이려고 합니다.
적의 공격과 아군의 회복 스킬은 항상 직사각형 모양입니다.
예를 들어, 아래 사진은 크기가 4 x 5인 맵에 내구도가 5인 건물들이 있는 상태입니다.
첫 번째로 적이 맵의 (0,0)부터 (3,4)까지 공격하여 4만큼 건물의 내구도를 낮추면 아래와 같은 상태가 됩니다.
두 번째로 적이 맵의 (2,0)부터 (2,3)까지 공격하여 2만큼 건물의 내구도를 낮추면 아래와 같이 4개의 건물이 파괴되는 상태가 됩니다.
세 번째로 아군이 맵의 (1,0)부터 (3,1)까지 회복하여 2만큼 건물의 내구도를 높이면 아래와 같이 2개의 건물이 파괴되었다가 복구되고 2개의 건물만 파괴되어있는 상태가 됩니다.
마지막으로 적이 맵의 (0,1)부터 (3,3)까지 공격하여 1만큼 건물의 내구도를 낮추면 아래와 같이 8개의 건물이 더 파괴되어 총 10개의 건물이 파괴된 상태가 됩니다. (내구도가 0 이하가 된 이미 파괴된 건물도, 공격을 받으면 계속해서 내구도가 하락하는 것에 유의해 주세요.)
최종적으로 총 10개의 건물이 파괴되지 않았습니다.
건물의 내구도를 나타내는 2차원 정수 배열 board 와 적의 공격 혹은 아군의 회복 스킬을 나타내는 정수 배열 skill 이 매개변수로 주어집니다. 적의 공격 혹은 아군의 회복 스킬이 모두 끝난 뒤 파괴되지 않은 건물의 개수를 return 하는 solution 함수를 완성해 주세요.
제한사항
1 ≤ board 의 행의 길이 (= N ) ≤ 1,000
의 행의 길이 (= ) ≤ 1,000 1 ≤ board 의 열의 길이 (= M ) ≤ 1,000
의 열의 길이 (= ) ≤ 1,000 1 ≤ board 의 원소 (각 건물의 내구도) ≤ 1,000
의 원소 (각 건물의 내구도) ≤ 1,000 1 ≤ skill 의 행의 길이 ≤ 250,000
의 행의 길이 ≤ 250,000 skill 의 열의 길이 = 6
의 열의 길이 = 6 skill 의 각 행은 [type, r1, c1, r2, c2, degree] 형태를 가지고 있습니다.
의 각 행은 형태를 가지고 있습니다. type은 1 혹은 2입니다. type이 1일 경우는 적의 공격을 의미합니다. 건물의 내구도를 낮춥니다. type이 2일 경우는 아군의 회복 스킬을 의미합니다. 건물의 내구도를 높입니다.
(r1, c1)부터 (r2, c2)까지 직사각형 모양의 범위 안에 있는 건물의 내구도를 degree 만큼 낮추거나 높인다는 뜻입니다. 0 ≤ r1 ≤ r2 < board 의 행의 길이 0 ≤ c1 ≤ c2 < board 의 열의 길이 1 ≤ degree ≤ 500 type이 1이면 degree 만큼 건물의 내구도를 낮춥니다. type이 2이면 degree 만큼 건물의 내구도를 높입니다. 건물은 파괴되었다가 회복 스킬을 받아 내구도가 1 이상이 되면 파괴되지 않은 상태가 됩니다. 즉, 최종적으로 건물의 내구도가 1 이상이면 파괴되지 않은 건물입니다. 정확성 테스트 케이스 제한사항 1 ≤ board 의 행의 길이 (= N ) ≤ 100 의 행의 길이 (= ) ≤ 100 1 ≤ board 의 열의 길이 (= M ) ≤ 100 의 열의 길이 (= ) ≤ 100 1 ≤ board 의 원소 (각 건물의 내구도) ≤ 100 의 원소 (각 건물의 내구도) ≤ 100 1 ≤ skill 의 행의 길이 ≤ 100 의 행의 길이 ≤ 100 1 ≤ degree ≤ 100 효율성 테스트 케이스 제한사항 주어진 조건 외 추가 제한사항 없습니다. 입출력 예 board skill result [ [5,5,5,5,5],[5,5,5,5,5],[5,5,5,5,5],[5,5,5,5,5] ] [ [1,0,0,3,4,4],[1,2,0,2,3,2],[2,1,0,3,1,2],[1,0,1,3,3,1] ] 10 [ [1,2,3],[4,5,6],[7,8,9] ] [ [1,1,1,2,2,4],[1,0,0,1,1,2],[2,2,0,2,0,100] ] 6 입출력 예 설명 • 입출력 예 #1 문제 예시와 같습니다. • 입출력 예 #2 <초기 맵 상태>
첫 번째로 적이 맵의 (1,1)부터 (2,2)까지 공격하여 4만큼 건물의 내구도를 낮추면 아래와 같은 상태가 됩니다.
두 번째로 적이 맵의 (0,0)부터 (1,1)까지 공격하여 2만큼 건물의 내구도를 낮추면 아래와 같은 상태가 됩니다.
마지막으로 아군이 맵의 (2,0)부터 (2,0)까지 회복하여 100만큼 건물의 내구도를 높이면 아래와 같은 상황이 됩니다.
총, 6개의 건물이 파괴되지 않았습니다. 따라서 6을 return 해야 합니다.
문제 풀이
이 문제는 2차원 배열에서 구간의 변화를 어떻게 효율적으로 처리할지가 관건인 문제입니다. 가장 쉽게 생각할 수 있는 브루트 포스로 풀 경우 정확성 테스트 케이스는 모두 맞출 수 있지만, 시간 복잡도가 O(N * M * K)가 되어 효율성 테스트케이스에서 시간 초과가 발생하게 됩니다.
2차원 배열에 대한 구간의 변화를 처리하는 방법을 설명드리기 전에, 우선 1차원 배열을 효율적으로 처리할 수 있는 방법을 설명드리겠습니다.
예를 들어, [1,2,4,8,9] 의 배열이 있고, 0번째부터 3번째 원소까지 2만큼 빼야 하는 상황이라고 가정하겠습니다. 즉, 배열을 [-1,0,2,6,9] 로 만들고 싶은 상황입니다. 가장 쉬운 방법으로는 0번째부터 3번째 원소까지 반복문을 사용해 2만큼 빼주는 방법이 있지만, 이 방법은 O(M)의 시간 복잡도가 걸립니다.
O(M)의 시간 복잡도를 O(1)로 만들 수 있는 방법은 바로 누적합을 이용하는 방법입니다. 위의 예시의 경우 [-2,0,0,0,2] 를 저장한 새로운 배열을 생성합니다. 이 배열을 앞에서부터 누적합하면 [-2,-2,-2,-2,0] 이 되기 때문에 초기 배열인 [1,2,4,8,9] 과 더해주면 [-1,0,2,6,9] 를 얻을 수 있게 됩니다. 즉, 1차원 배열의 a번째 원소부터 b번째 원소까지 c만큼의 변화를 주겠다고 하면 새로운 배열의 a번째 원소에 c를 더하고 b+1번째 원소에 c를 빼면 됩니다.
이 방식으로 문제를 풀면 O(N * M * K)의 복잡도를 O(N * K)로 줄일 수 있지만, 이 또한 시간 초과가 발생합니다.
따라서 이 아이디어를 2차원 배열로 확장해 줘야 합니다. 이번엔 2차원 배열에서 (0,0)부터 (2,2)까지 n만큼 변화시키는 경우를 예로 들어보겠습니다.
배열의 행만 따로 봐서 위에서 설명한 아이디어를 하나의 행씩 적용시키면, 1차원 배열의 0번째 원소부터 2번째 원소까지 n만큼의 변화를 3개의 행에 적용시키는 것이 됩니다.
n 0 0 -n n 0 0 -n n 0 0 -n
위 행렬을 다시 열만 따로 보면, 가장 왼쪽 열의 0번째 원소부터 2번째 원소까지 n만큼의 변화와 가장 오른쪽 열의 0번째 원소부터 2번째 원소까지 -n만큼의 변화와 같습니다. 각 열에 위의 아이디어를 적용시키면 아래와 같습니다. 이런 식으로 2차원 배열에도 적용시킬 수가 있습니다.
n 0 0 -n 0 0 0 0 0 0 0 0 -n 0 0 n
즉, 2차원 배열에서 (x1,y1)부터 (x2,y2)까지 n만큼의 변화는 (x1,y1)에 +n, (x1,y2+1)에 -n, (x2+1,y1)에 -n, (x2+1,y2+1)에 +n을 한 것과 같습니다. 위 배열을 위에서 아래로 누적합한 뒤, 왼쪽에서 오른쪽으로 누적합하거나 왼쪽에서 오른쪽으로 누적합 한 뒤, 위에서 아래로 누적합하면 처음에 의도한 (0,0)부터 (2,2)까지 n만큼 변화시키는 배열이 나오는 것을 확인할 수 있습니다.
n n n 0 n n n 0 n n n 0 0 0 0 0
이러한 방법으로 skill의 한 원소를 O(1)만에 처리할 수 있다는 것을 알 수 있습니다. 따라서 위의 방법으로 K개의 skill을 모두 처리할 수 있는 배열을 만드는데 O(K)가 걸리게 됩니다. 그리고 해당 배열을 누적합 배열로 바꾸는 과정이 필요한데, 행과 열을 각각 누적합 해줘야 하기 때문에 O(N * M)가 걸리게 됩니다. 따라서 O(K + N * M)으로 문제를 해결할 수 있습니다.
이해를 돕기 위해 2번 테스트케이스를 예시로 추가 설명드리겠습니다.
1. (1,1)부터 (2,2)까지 -4만큼 변화를 줘야 합니다. (배열의 (1,1)과 (3,3)에 -4, 배열의 (1,3)과 (3,1)에 4만큼 변화를 줍니다.)
0 0 0 0 0 -4 0 4 0 0 0 0 0 4 0 -4
2. (0,0)부터 (1,1)까지 -2만큼 변화를 줘야 합니다. (배열의 (0,0)과 (2,2)에 -2, 배열의 (0,2)과 (2,0)에 2만큼 변화를 줍니다.)
-2 0 2 0 0 -4 0 4 2 0 -2 0 0 4 0 -4
3. (2,0)부터 (2,0)까지 +100의 변화를 줘야 합니다. (배열의 (2,0)과 (3,1)에 100, 배열의 (2,1)과 (3,0)에 -100만큼 변화를 줍니다.)
-2 0 2 0 0 -4 0 4 102 -100 -2 0 -100 104 0 -4
이 배열을 이제 위에서 아래로 누적합 해주겠습니다.
-2 0 2 0 -2 -4 2 4 100 -104 0 4 0 0 0 0
그다음 왼쪽에서 오른쪽으로 누적합 해주겠습니다.
-2 -2 0 0 -2 -6 -4 0 100 -4 -4 0 0 0 0 0
이 배열을 board 와 합쳐 주겠습니다.
1 2 3 -2 -2 0 -1 0 3 4 5 6 + -2 -6 -4 = 2 -1 2 7 8 9 100 -4 -4 107 4 5
마지막 결과 배열과 같은 배열이 나왔습니다. 이 배열에서 0보다 큰 정수의 개수를 구하면 됩니다.
문제 7 – 사라지는 발판
정답률 : 0.78%
문제 7 풀러가기
문제 설명
플레이어 A와 플레이어 B가 서로 게임을 합니다. 당신은 이 게임이 끝날 때까지 양 플레이어가 캐릭터를 몇 번 움직이게 될지 예측하려고 합니다.
각 플레이어는 자신의 캐릭터 하나를 보드 위에 올려놓고 게임을 시작합니다. 게임 보드는 1×1 크기 정사각 격자로 이루어져 있으며, 보드 안에는 발판이 있는 부분과 없는 부분이 있습니다. 발판이 있는 곳에만 캐릭터가 서있을 수 있으며, 처음 캐릭터를 올려놓는 곳은 항상 발판이 있는 곳입니다. 캐릭터는 발판이 있는 곳으로만 이동할 수 있으며, 보드 밖으로 이동할 수 없습니다. 밟고 있던 발판은 그 위에 있던 캐릭터가 다른 곳으로 이동하여 다른 발판을 밟음과 동시에 사라집니다. 양 플레이어는 번갈아가며 자기 차례에 자신의 캐릭터를 상하좌우로 인접한 4개의 칸 중에서 발판이 있는 칸으로 옮겨야 합니다.
다음과 같은 2가지 상황에서 패자와 승자가 정해지며, 게임이 종료됩니다.
움직일 차례인데 캐릭터의 상하좌우 주변 4칸이 모두 발판이 없거나 보드 밖이라서 이동할 수 없는 경우, 해당 차례 플레이어는 패배합니다.
두 캐릭터가 같은 발판 위에 있을 때, 상대 플레이어의 캐릭터가 다른 발판으로 이동하여 자신의 캐릭터가 서있던 발판이 사라지게 되면 패배합니다.
게임은 항상 플레이어 A가 먼저 시작합니다. 양 플레이어는 최적의 플레이를 합니다. 즉, 이길 수 있는 플레이어는 최대한 빨리 승리하도록 플레이하고, 질 수밖에 없는 플레이어는 최대한 오래 버티도록 플레이합니다. ‘이길 수 있는 플레이어’는 실수만 하지 않는다면 항상 이기는 플레이어를 의미하며, ‘질 수밖에 없는 플레이어’는 최선을 다해도 상대가 실수하지 않으면 항상 질 수밖에 없는 플레이어를 의미합니다. 최대한 오래 버틴다는 것은 양 플레이어가 캐릭터를 움직이는 횟수를 최대화한다는 것을 의미합니다.
아래 그림은 초기 보드의 상태와 각 플레이어의 위치를 나타내는 예시입니다.
위와 같은 경우, 플레이어 A는 실수만 하지 않는다면 항상 이길 수 있습니다. 따라서 플레이어 A는 이길 수 있는 플레이어이며, B는 질 수밖에 없는 플레이어입니다. 다음은 A와 B가 최적의 플레이를 하는 과정을 나타냅니다.
플레이어 A가 초기 위치 (1, 0)에서 (1, 1)로 이동합니다. 플레이어 A가 (0, 0)이나 (2, 0)으로 이동할 경우 승리를 보장할 수 없습니다. 따라서 무조건 이길 방법이 있는 (1, 1)로 이동합니다. 플레이어 B는 (1, 1)로 이동할 경우, 바로 다음 차례에 A가 위 또는 아래 방향으로 이동하면 발판이 없어져 패배하게 됩니다. 질 수밖에 없는 플레이어는 최대한 오래 버티도록 플레이하기 때문에 (1, 1)로 이동하지 않습니다. (1, 2)에서 위쪽 칸인 (0, 2)로 이동합니다. A가 (1, 1)에서 (0, 1)로 이동합니다. B에게는 남은 선택지가 (0, 1)밖에 없습니다. 따라서 (0, 2)에서 (0, 1)로 이동합니다. A가 (0, 1)에서 (0, 0)으로 이동합니다. 이동을 완료함과 동시에 B가 서있던 (0, 1)의 발판이 사라집니다. B가 패배합니다. 만약 과정 2에서 B가 아래쪽 칸인 (2, 2)로 이동하더라도 A가 (2, 1)로 이동하면 됩니다. 이후 B가 (2, 1)로 이동, 다음 차례에 A가 (2, 0)으로 이동하면 B가 패배합니다.
위 예시에서 양 플레이어가 최적의 플레이를 했을 경우, 캐릭터의 이동 횟수 합은 5입니다. 최적의 플레이를 하는 방법은 여러 가지일 수 있으나, 이동한 횟수는 모두 5로 같습니다.
게임 보드의 초기 상태를 나타내는 2차원 정수 배열 board 와 플레이어 A의 캐릭터 초기 위치를 나타내는 정수 배열 aloc , 플레이어 B의 캐릭터 초기 위치를 나타내는 정수 배열 bloc 이 매개변수로 주어집니다. 양 플레이어가 최적의 플레이를 했을 때, 두 캐릭터가 움직인 횟수의 합을 return 하도록 solution 함수를 완성해 주세요.
제한사항
1 ≤ board 의 세로 길이 ≤ 5
의 세로 길이 ≤ 5 1 ≤ board 의 가로 길이 ≤ 5
의 가로 길이 ≤ 5 board 의 원소는 0 또는 1입니다.
의 원소는 0 또는 1입니다. 0은 발판이 없음을, 1은 발판이 있음을 나타냅니다.
aloc 과 bloc 은 각각 플레이어 A의 캐릭터와 플레이어 B의 캐릭터 초기 위치를 나타내는 좌표값이며 [r, c] 형태입니다.
과 은 각각 플레이어 A의 캐릭터와 플레이어 B의 캐릭터 초기 위치를 나타내는 좌표값이며 [r, c] 형태입니다. r은 몇 번째 행인지를 나타냅니다.
0 ≤ r < board 의 세로 길이 의 세로 길이 c는 몇 번째 열인지를 나타냅니다. 0 ≤ c < board 의 가로 길이 의 가로 길이 초기 보드의 aloc 과 bloc 위치는 항상 발판이 있는 곳입니다. 과 위치는 항상 발판이 있는 곳입니다. aloc 과 bloc 이 같을 수 있습니다. 과 이 같을 수 있습니다. 상대 플레이어의 캐릭터가 있는 칸으로 이동할 수 있습니다. 입출력 예 board aloc bloc result [ [1, 1, 1], [1, 1, 1], [1, 1, 1] ] [1, 0] [1, 2] 5 [ [1, 1, 1], [1, 0, 1], [1, 1, 1] ] [1, 0] [1, 2] 4 [ [1, 1, 1, 1, 1] ] [0, 0] [0, 4] 4 [ [1] ] [0, 0] [0, 0] 0 입출력 예 설명 • 입출력 예 #1 문제 예시와 같습니다. • 입출력 예 #2 주어진 조건을 그림으로 나타내면 아래와 같습니다. 이길 수 있는 플레이어는 B, 질 수밖에 없는 플레이어는 A입니다. 다음은 B가 이기는 방법 중 하나입니다. A가 (1, 0)에서 (0, 0)으로 이동 B가 (1, 2)에서 (2, 2)로 이동 A가 (0, 0)에서 (0, 1)로 이동 B가 (2, 2)에서 (2, 1)로 이동 A가 (0, 1)에서 (0, 2)로 이동 B가 (2, 1)에서 (2, 0)으로 이동 A는 어디로도 이동할 수가 없어 패배 위와 같이 플레이할 경우 이동 횟수 6번 만에 게임을 B의 승리로 끝낼 수 있습니다. B가 다음과 같이 플레이할 경우 게임을 더 빨리 끝낼 수 있습니다. 이길 수 있는 플레이어는 최대한 빨리 게임을 끝내려 하기 때문에 위 방법 대신 아래 방법을 선택합니다. A가 (1, 0)에서 (0, 0)으로 이동 B가 (1, 2)에서 (0, 2)로 이동 A가 (0, 0)에서 (0, 1)로 이동 B가 (0, 2)에서 (0, 1)로 이동 A가 어디로도 이동할 수가 없어 패배 위와 같이 플레이할 경우 이동 횟수 4번 만에 게임을 B의 승리로 끝낼 수 있습니다. 따라서 4를 return 합니다. • 입출력 예 #3 양 플레이어는 매 차례마다 한 가지 선택지밖에 고를 수 없습니다. 그 결과, (0, 2)에서 어디로도 이동할 수 없는 A의 패배합니다. 양 플레이어가 캐릭터를 움직인 횟수의 합은 4입니다. • 입출력 예 #4 게임을 시작하는 플레이어 A가 처음부터 어디로도 이동할 수 없는 상태입니다. 따라서 A의 패배이며, 이동 횟수의 합은 0입니다. 문제 풀이 이 문제는 완전 탐색으로 해결할 수 있는 문제입니다. 문제에서 주어진 게임판의 크기가 크지 않고, 발판을 밟으면 사라진다는 조건이 있기 때문에 탐색해야 하는 가짓수가 크게 줄어듭니다. 따라서 완전 탐색을 하더라도 제한 시간 내에 충분히 풀 수 있습니다. 이번에는 재귀 함수를 이용한 완전 탐색으로 해설을 진행하겠습니다. 재귀 함수는 어떤 함수 내에서 자신을 다시 호출하여 작업을 수행하는 함수를 말합니다. 이 문제에서는 게임판의 상태에 따라 이번에 움직여야 하는 플레이어가 이길 수 있는지, 질 수밖에 없는지를 판단하고 판단한 결과와 이동한 횟수를 반환하는 재귀 함수를 구현해서 해결할 수 있습니다. 즉, 함수의 매개변수로 게임판의 상태, A의 위치, B의 위치 등을 넘겨주면, 이번 턴에 움직여야 하는 플레이어의 승패 여부와 총 이동 횟수를 알려주는 함수입니다. 플레이어들의 총 이동 횟수를 이용해 플레이어 A의 턴인지, B의 턴인지 구분하는 방식으로 하나의 재귀 함수로 구현할 수도 있지만, 설명 상의 편의를 위해서 A의 승패 여부와 플레이어의 총 이동 횟수를 반환하는 함수와 B의 승패 여부와 플레이어의 총 이동 횟수를 반환하는 함수를 분리하고, 각각 A 함수와 B 함수라고 부르겠습니다. 이 함수들은 플레이어가 상하좌우 4가지 방향 중 이동할 수 있는 방향으로 이동하여 게임판의 상태를 바꾼 뒤, 그 상태를 상대 플레이어에게 넘기는 방식으로 동작합니다. 즉, A 함수는 플레이어 A를 움직이는 함수, B 함수는 플레이어 B를 움직이는 함수가 되고, A 함수에서는 B 함수를, B 함수에서는 A 함수를 호출하게 됩니다. A 함수와 B 함수는 플레이어의 승패 여부와 이동 횟수를 반환합니다. 따라서 A 함수에서는 B 함수의 호출 결과를 통해 플레이어 B의 승패 여부와 총 이동 횟수를 알 수 있고, B 함수에서는 플레이어 A의 승패 여부와 총 이동 횟수를 알 수 있습니다. 만약 상대 턴으로 넘어간 모든 함수의 결과가 ‘패배’일 경우, ‘나’는 반드시 이길 수 있습니다. 반대로, 상대 턴으로 넘어간 모든 함수의 결과가 ‘승리’일 경우, ‘나’는 무조건 질 수밖에 없습니다. 따라서 함수를 호출한 결과를 종합해 ‘이길 수 있는 방법이 있는지’, ‘질 수밖에 없는지’를 구할 수 있습니다. 그리고 문제에 ‘양 플레이어는 최적의 플레이를 합니다.’라는 조건이 있기 때문에, 승리하는 플레이어는 최소한의 이동으로 승리하고 패배하는 플레이어는 최대한의 이동으로 패배해야 합니다. 따라서 이동 횟수의 최댓값 또는 최솟값을 상대방의 결과에 따라 적절하게 반환해 주면 됩니다. 이러한 방식으로 A 함수와 B 함수를 구현하고, ‘게임은 항상 플레이어 A가 먼저 시작합니다.’라는 문제 조건에 의해 A 함수를 호출해 줍니다. 그러면 A 함수는 함수 내부에서 B 함수를 호출하고, B 함수 역시 함수 내부에서 A 함수를 호출하면서 가능한 모든 경우에 대해서 탐색하게 되고, 결국 초기 매개변수들을 전달한 A 함수의 결과로 최적의 이동 횟수가 반환되는 것을 확인할 수 있습니다. 마치며 지금까지 2022 KAKAO BLIND RECRUITMENT 1차 코딩 테스트 문제와 풀이에 대해 살펴보았습니다. 설명 드린 풀이 외에도 다양한 풀이법이 있기 때문에, 풀이를 암기하기보다는 어떠한 흐름으로 풀이가 진행되는지를 이해하고, 다른 방법으로 풀 수는 없는지에 대해 고민해 보면 큰 도움이 될 것입니다. 또한 이전에 진행했던 KAKAO BLIND RECRUITMENT 와 인턴십 코딩 테스트 문제들에 대해서도 해설을 제공하고 있으니 참고하시기 바랍니다. 마지막으로 2022 KAKAO BLIND RECRUITMENT 에 많은 관심 가져 주셔서 감사드리며, 5시간이라는 긴 시간동안 테스트 응시하시느라 정말 고생 많으셨습니다! ✔️ 카카오 온라인 코딩 테스트 문제해설 바로가기
[코테후기] 2022 SKT ICT 1차 코딩테스트 – 합격 – CastleRain – 티스토리
3번을 풀다가 시간초과가 나버렸는데 최단거리 경로구하는 공식을 팩토리얼사용하는것만 기억하고 있어서 엄청난 수의 크기로 인한 .. 큰값에서의 오류가 나버렸다.
구현은 은근 머리가 아팠다. 각 경우를 생각해서 구했는데 다행히 O(n)만에 풀린 것 같아 조건안에는 다 풀 수 있을 것 같다.
4번은 한번 설계는 해봤지만 아무리 생각해도 안풀리길래 넘겼는데 비슷한문제로 플5문제가 나왔다. (어짜피 못푸는 문제였다..)
- Source: castlerain.tistory.com
- Views: 20692
- Publish date: 19 hours ago
- Downloads: 8366
- Likes: 9998
- Dislikes: 7
- Title Website: [코테후기] 2022 SKT ICT 1차 코딩테스트 – 합격 – CastleRain – 티스토리
- Description Website:
카카오, SK, 현대자동차를 거친 개발자 출신 인사팀장 피셜 합격하는 코딩테스트 준비법 [나는 인사담당자다]
- Source: Youtube
- Views: 77828
- Date: 6 hours ago
- Download: 84335
- Likes: 4125
- Dislikes: 2
[코테후기] 2022 SKT ICT 1차 코딩테스트 – 합격
날짜 : 22.03.12 10:00 ~ 13:00
문제는 총 4문제가 출제되었고 시간은 3시간이 주어졌다.
유형만 보면 다음과 같이 출제가 되었다.
1. 그리디
2. 구현
3. DP or 수학?
4. 트리(?) -> 이해 못함
1번 그리디
1번 문제는 전형적인 그리디 문제여서 정렬을 하고 풀면 정답이 나왔다.
약간 비슷한 문제를 보자면 밑의 문제에서 가치가 추가되었다?? 정도면 될 것 같다.
https://www.acmicpc.net/problem/9084
2번 구현
구현은 은근 머리가 아팠다. 각 경우를 생각해서 구했는데 다행히 O(n)만에 풀린 것 같아 조건안에는 다 풀 수 있을 것 같다.
중간부분에 머리가 아파서 그냥 하드코딩으로 구현을 했는데 정답이 나오긴해서 넘기긴 했으나 좋은 점수는 못받을 것 같다.
다른분들 푸신걸 보니 내 코드보다 반절이상 짧았다..
3. DP or 수학?
3번을 풀다가 시간초과가 나버렸는데 최단거리 경로구하는 공식을 팩토리얼사용하는것만 기억하고 있어서 엄청난 수의 크기로 인한 .. 큰값에서의 오류가 나버렸다.
이후 알게 된 점인데 최단거리를 구하는 공식에는 두가지가있다. (더 있을 수도 있다.)
1. 팩토리얼을 사용하는 (가로 + 세로)! / 가로!*세로!
2. 파스칼 삼각형을 이용한 구현
여기서는 2번을 이용해서 풀면 쉽게 정답으로 갈 수 있었는데 2번에서 시간을 너무 쏟아부어서 아무생각도 안들었다.
갓호석님의 풀이방법을 보고 충격… 을 받았다. (저리 쉬운문제였나..)
4. 트리(?) 몰려..
4번은 한번 설계는 해봤지만 아무리 생각해도 안풀리길래 넘겼는데 비슷한문제로 플5문제가 나왔다. (어짜피 못푸는 문제였다..)
https://www.acmicpc.net/problem/20188
전체적으로 보았을 때 2솔은 확실한데 3번 하나가 약간 애매하게 맞춘느낌이라 그냥 2솔이다라고 생각하는게 맞을 것 같다.
오픈 카톡방을 봤을 때 3솔이 커트라인이라고 하는걸로봐서 2차시험까지는 어려울 것 같다.
(가도 어짜피 떨어질 것 같다.)
올해 첫 코테는 이렇게 끝.. 계속 해봐야겠다. KT 코테도 가봤으면 좋겠다.
22.3.16 추가
2솔도 합격을 주는걸로 봐서 커트라인이 생각보다 높지 않은것 같다.
KT도 오늘 서류 합격이 왔는데 카톡방을 보면 KT도 대국민시험2느낌일것같은?? (거의 다 붙었는것같다.)
SKT 코테가 이번주니 준비 열심히 해봐야겠다. 그래프랑 트리…
2차 코테 후기는 다음글에서….
[코테후기] 2022 SKT ICT 2차 코테 후기
코딩 테스트 풀이 – 2022 카카오 블라인드 1차 (1~4번 문제)
# 소수 판별 (True/False) def prime_check(n): if n == 1 : return False for div in range(2,int(math.sqrt(n))+1): if n%div == 0: return False return True
실력이 아직 많이 부족해서 5시간 동안 4번 문제까지 푸는 것을 목표로 했는데 3시간만에 1~4문제를 풀어버려서 적어도 5번 문제를 꼭 풀어야 2차 갈 수 있겠구나 싶었다. 결국 5번은 TC 4개 Fail를 해결못하고 실패…ㅠㅠ
어떻게든 현재보다 더 최적의 경우가 나왔을때 다른 노드들에 이 정보를 전파해주면 쉽게 풀릴 것 같았는데 평소에 그래프/트리 문제를 많이 소홀히한 탓인지… 집중력이 떨어진 탓인지 풀릴듯 말듯 하다가 못풀었다.
12 thg 9, 2021 — 2021/09/11(일) 14:00~19:00 진행되었던 카카오 블라인드 1차 코딩테스트 문제 풀이 게시물입니다. 코드나 문제를 상세히 올려도 되는지 모르겠어서 …
- Source: 11001.tistory.com
- Views: 76130
- Publish date: 34 minute ago
- Downloads: 54338
- Likes: 3482
- Dislikes: 6
- Title Website: 코딩 테스트 풀이 – 2022 카카오 블라인드 1차 (1~4번 문제)
- Description Website: 12 thg 9, 2021 — 2021/09/11(일) 14:00~19:00 진행되었던 카카오 블라인드 1차 코딩테스트 문제 풀이 게시물입니다. 코드나 문제를 상세히 올려도 되는지 모르겠어서 …
카카오 코딩 테스트 – 합승 택시 요금 (Java 풀이)
- Source: Youtube
- Views: 101498
- Date: 22 hours ago
- Download: 90936
- Likes: 9324
- Dislikes: 4
코딩 테스트 풀이 – 2022 카카오 블라인드 1차 (1~4번 문제)
2021/09/11(일) 14:00~19:00 진행되었던 카카오 블라인드 1차 코딩테스트 문제 풀이 게시물입니다.
코드나 문제를 상세히 올려도 되는지 모르겠어서 간략히만 해설 합니다.
제가 아직 실력이 부족하여 4번까지만 TC ALL AC를 맞아서 우선은 4번까지 해설합니다.
혹시나 문제가 되면 글 바로 내리겠습니다.
1번 문제
핵심 키워드 : 구현, 딕셔너리
문제 내용
유저들끼리 서로 신고함. 한번에 1명의 유저를 신고가능 (A B = A가 B를 신고함)
k번 이상 신고받으면 방출되면서 유저신고한 모든 사람들한테 신고처리 메일을 보냄
풀이
총 3개의 딕셔너리 만든다.
reported_cnt_list[유저명] : 신고된 횟수 report_me_user_list[유저명] : [날신고한 유저1, 날신고한 유저2, …] mail_list[유저명] : 신고처리 메일 받은 횟수
신고 리스트 반복.
ex) A가 B를 신고을 경우
reported_cnt_list[B] +1 : B의 신고받은 횟수 1 증가
report_me_user_list[B].append(A) : B를 신고한 사람 목록에 A추가
신고된 횟수가 k이상인것들 뽑아서 그 유저의 메일통보 횟수 증가
mail_list[유저명] +1
2번 문제
핵심 키워드 : 진법 변환, 소수
문제 내용
양의 정수 n 을 k진법으로 변환 후 조건에 맞는 소수 개수 리턴
풀이
먼저 진법 변환 함수, 소수 판별 함수를 준비한다.
# 진법 변환 (10진수 → n진수) def to_radix(n, b): if n < b: return str(n) s = to_radix(n//b, b) return s + str(n%b) # 소수 판별 (True/False) def prime_check(n): if n == 1 : return False for div in range(2,int(math.sqrt(n))+1): if n%div == 0: return False return True 이중 for문을 돌면서 문자열[i~j]이 조건에 만족하는지 확인 조건 문자열[i~j]가 0을 포함하지 않고 소수인지 확인. → 0P, P0, 0P0 형태 중 1개인지 확인 문자열이 0을 포함하지 않고 소수인지 확인 (P형태) (잡담) 진법 변환 방법이 생각이 안 나서 찾아봤던 문제였다. 웃긴건 처음에 찾아왔던 진법 변환 함수가 제대로 작동 안되는 경우가 있는 함수여서 다시 찾느라 5~10분 정도를 허비해버렸다. 3번 문제 핵심 키워드 : 문자열, 딕셔너리 문제 내용 주차장의 요금표와 차량의 IN(입차), OUT(출차) 기록이 주어졌을 때, 차량별로 주차 요금 계산 요금표 : 기본시간(분), 기본요금(원), 단위시간(분), 단위요금(원) 풀이 총 3개의 딕셔너리를 만든다. car_inout_time_dict[차번호] = (입차시간, 출차시간) car_cost_dict[차번호] = 요금 car_park_time_dict[차번호] = 주차누적시간 자동차 IN,OUT 기록을 보고 car_inout_time_dict[차번호] 업데이트 → OUT(출차)시 car_park_time_dict[차번호] 업데이트 자동차 OUT 기록이 없는 대상 확인해서 23:59으로 넣어주기 → car_inout_time_dict[차번호]의 IN시간보다 OUT 시간이 더 빠른경우 주차비용 마지막에 일괄 계산 (잡담) 차량 IN/OUT 시간을 처음부터 모두 minute(정수)로 변환해서 기록했으면 훨씬 빨리 풀었을것 같다. 그리고 주차요금 계산할 때 문제 예시를 조금만 더 자세히 읽어봤으면 괜히 헛짓거리 안 했을 것이란 생각이 든다. 4번 문제 핵심 키워드 : 브루트포스, BFS, 그리디 문제 내용 10점~0점까지 과녁에 어피치가 화살 n발 쏘고난 이후의 상황이다. 이제 라이언이 n발 쏜다. 어피치가 k점에 2발 맞혔다면 라이언은 k점에 3발이상은 맞혀야 점수 얻는다. (예시) [0,0,0,0,0,0,0,0,0,0] 이라는 배열이 순서대로 10점,9점...0점 과녁을 맞힌 화살 수라 하였을때 어피치가 [1,1,1,0,0,0,0,0,0,0] 이라면 라이언은 [3,0,0,0,0,0,0,0,0,0,] or [2,1,0,0,0,0,0,0,0,0] or [1,1,1,0,0,0,0,0,0,0] ... [0,0,0,0,0,0,0,0,0,3] 의 조합 가능. 풀이 BFS로 라이언이 화살을 쏠 수 있는 모든 조합을 구한다. 어피치가 맞힌 화살수에 +1한 리스트를 set로 만들어서 [2,2,2,1,1,1,1,1,1,1] → {2,1} 이렇게 변환. 그리고 queue에 (tuple(점수합,list(맞힌횟수))) 이렇게 넣어서 BFS 돌렸다. 즉, {1,2}로 만들 수 있는 조합의 합이 n인 것들을 구한 것이다. 결과 → (3, [1,1,1]), (3, [1,2]), (3, [2,1]) 라이언이 무조건 높은 점수를 취득해야하므로 해당 조합들을 그리디하게 10점 부터 차례로 가져가도록 했다. 1,1,1, 의 경우 10점(1발), 9점(1발), 8점(1발)을 가져감 1,2의 경우 10점(1발), 9점(2발) 가져감 이렇게 해서 라이언과 어피치 점수를 비교하여 점수가 가장 차이가 많이 나는 경우, 또 그러한 경우가 많다면 라이언이 최저점수를 최대한 많이 맞힌 경우를 update했다. 라이언의 화살이 남는 경우가 존재한다. 남는 화살은 모두 0점 과녁에 추가해줘야 한다. (잡담) 문제 읽고나서 그리디인가? DP인가? 조합인가? 딱 3가지가 떠올랐다. 그리디/DP는 풀이법이 생각이 안나서 먼저 조합을 시도해보았고, 조합 다해보니 이제 그리디로 할 수 있겠구나 싶었다. 만약 C++로 풀었다면 비트마스킹 같은걸 썼을 것 같기도 하다. 문제 자체는 간단 명료한데 풀다보면 처리할 부분이 생각보다 꽤나 많다. - 라이언과 어피치 점수차이가 동일하면 라이언이 최저점수를 최대한 많이 맞힌 경우를 update - 라이언 화살이 남는 경우 → 0점 과녁에 추가 - 모든 경우에 어피치와 동점이거나 어피치가 점수가 더 높은경우 → [-1] 리턴 5번 문제 (실패) 핵심 키워드 : 그래프 탐색, DP 문제 내용 이진트리 모양 초원에 늑대와 양 존재 루트에서 출발하여 양을 수집한다. 노드 방문마다 늑대/양이 나를 따라옴 현재 수집한 양의 수 <= 현재 수집한 늑대 수 되는 순간 모든 양 죽임당함 최대한 많은 양을 남기고 루트로 돌아와야 함. (잡담) 부모/자식을 양방향 그래프로 재해석해서 부모→자식 : 양(+1비용), 늑대(-1비용), 자식→부모 : 양/늑대(0비용) 이런 생각도 해봤고, 단순히 BFS를 여러번 돌려볼까도 생각해봤고, 우선순위 큐로 양이 많은순서, 늑대가 적은 순서 꺼내오면서 매순간 노드정보 update도 생각해봤다. 어떻게든 현재보다 더 최적의 경우가 나왔을때 다른 노드들에 이 정보를 전파해주면 쉽게 풀릴 것 같았는데 평소에 그래프/트리 문제를 많이 소홀히한 탓인지... 집중력이 떨어진 탓인지 풀릴듯 말듯 하다가 못풀었다. 후기 문제 난이도가 이전 까지의 코테보다 많이 낮아진 느낌이었다. 실력이 아직 많이 부족해서 5시간 동안 4번 문제까지 푸는 것을 목표로 했는데 3시간만에 1~4문제를 풀어버려서 적어도 5번 문제를 꼭 풀어야 2차 갈 수 있겠구나 싶었다. 결국 5번은 TC 4개 Fail를 해결못하고 실패...ㅠㅠ 앞으로 그래프/트리/어려운DP 쪽을 보충해서 코테 정복하는 날까지 열심히 해야겠다.
[Kakao] 2022 KAKAO BLIND RECRUITMENT 코딩테스트 1차 …
무난한 DFS… 라기엔 함정이 있다. 이미 왔던 길을 다시 갈 수 있다는 점. 처음엔 비트마스킹+dp인가? 싶었는데, 계속 관찰하다보니 visit배열 차원을 늘려주면 됐다. visit배열을 현재 데리고 있는 양을 포함한 visit[18][18]로 둬도 되고, 늑대까지 포함한 visit[18][18][18]로 두어도 된다. 늑대 한마리만 더 늘어나는 이상한 길을 택하진 않을테니, 그리디적으로 생각해보면 visit[18][18]로도 충분히 가능함을 알 수 있다. 근데 어차피 N이 17까지밖에 안되기 때문에 어떻게 두어도 상관없을 듯.
소수는 에라토스테네스 체를 이용하여 구하면 되나, 3진수로 나타날 때 수가 long long범위까지도 갈 수 있다! 그러므로 1~long long범위의 수까지 배열에 소수를 저장하는 방법으론 불가능하다. 따라서 나는 sieve로 1000만 정도까지 구하고, 그보다 큰 수는 sieve로 구한 소수들로 소수여부판단을 해주었다. 이것 또한 적절한 파싱이 필요하기 때문에 조금 짜증났다. 그래도 더럽다고 생각이 들 정돈 아니어서 재밌게 풀었다.
처음엔 단순 구현일 줄 알았는데, 계속 관찰하다보니 백트래킹인 것이 눈에 보였다. 양궁 점수도 0~10점까지 밖에 없기 때문에 백트래킹으로 잘 처리해주면 된다. 또한, 낮은 점수를 많이 쏜 경우가 우선되도록 한다는 말은, 높은 점수를 적게 쏜 경우가 우선된다는 말과 같다. 만약 n개보다 적게 활을 쐈을 경우 나머진 0점에 때려박도록 하였다.
11 thg 9, 2021 — 대기업 코딩테스트를 응시해보는 것은 이번이 처음이다. 카카오는 내가 가고 싶은 기업 중 하나이기도 하고, 카카오 알고리즘 문제들이 꽤나 어렵다는 …
- Source: kth990303.tistory.com
- Views: 109110
- Publish date: 3 hours ago
- Downloads: 49409
- Likes: 7167
- Dislikes: 1
- Title Website: [Kakao] 2022 KAKAO BLIND RECRUITMENT 코딩테스트 1차 …
- Description Website: 11 thg 9, 2021 — 대기업 코딩테스트를 응시해보는 것은 이번이 처음이다. 카카오는 내가 가고 싶은 기업 중 하나이기도 하고, 카카오 알고리즘 문제들이 꽤나 어렵다는 …
2019 카카오 코딩 테스트 | 크레인 인형 뽑기 | 레벨 1 | 인턴쉽 문제 | 개발자
- Source: Youtube
- Views: 92423
- Date: 12 hours ago
- Download: 37872
- Likes: 3066
- Dislikes: 6
[Kakao] 2022 KAKAO BLIND RECRUITMENT 코딩테스트 1차 후기
https://programmers.co.kr/competitions/1571
대기업 코딩테스트를 응시해보는 것은 이번이 처음이다.
카카오는 내가 가고 싶은 기업 중 하나이기도 하고, 카카오 알고리즘 문제들이 꽤나 어렵다는 소문이 자자해 경험삼아 응시해보았다.
문제들이 흥미롭고 꽤나 재밌었는데, 개인적으로 내 실력부족으로 인한 테스트케이스 일부 실패 때문에 많이 아쉬운 대회였기도 하다.
카카오 가고싶당
지문, 풀이코드, 테스트케이스 배포 및 공유는 불가능하기 때문에 간단하게 느낀 점 및 내가 해결한 방법을 포스팅 해보겠다.
+) 이 글은 2022 코테 후기입니다. 2023 카카오 블라인드 코테 1차 후기는 여기서 볼 수 있습니다.
https://kth990303.tistory.com/379
주관적으로 생각 하는 난이도는 아래와 같다.
문제 정확성 효율성 1 Silver IV 2 Silver III 3 Silver IV 4 Silver I 5 Gold IV 6 Bronze I Gold II 7
작년 기준 3.5솔이면 합격 이었다는데, 커트라인이 높아질진 잘 모르겠다. 작년 카카오 블라인드 코테는 따로 응시하진 않았고 문제를 쭉 훑어본 정도이긴 한데, 개인적으론 올해가 작년보다 더 쉬운듯하다 .
1번. (TC All AC)
크게 어렵지 않은 문제. 유저들이 불량유저들을 신고하는 문제인데, 신고가 정상적으로 처리되면 신고자에게 문자가 간다. 이 때 신고자는 문자를 몇 번 받을 수 있을지 처리하는 문제이다.
딱히 알고리즘이 요구되진 않는다. 다만, 문자열이라서 index 구하기가 조금 까다롭거나, 파싱 부분이 조금 힘들 수 있을듯? map이랑 substr 적당히 써서 간단하게 해결했다.
2번. (TC All AC)
100만 이하의 수를 3~10진수로 바꾼 문자열에 포함된 소수의 개수를 구하는 문제.
소수는 에라토스테네스 체를 이용하여 구하면 되나, 3진수로 나타날 때 수가 long long범위까지도 갈 수 있다! 그러므로 1~long long범위의 수까지 배열에 소수를 저장하는 방법으론 불가능하다. 따라서 나는 sieve로 1000만 정도까지 구하고, 그보다 큰 수는 sieve로 구한 소수들로 소수여부판단을 해주었다. 이것 또한 적절한 파싱이 필요하기 때문에 조금 짜증났다. 그래도 더럽다고 생각이 들 정돈 아니어서 재밌게 풀었다.
3번. (TC All AC)
개인적으론 2번보다 쉽다고 생각하는 문제. 1번과 유사하게 문자열과 그에 따른 index 구하기가 까다로우므로 map으로 적절히 처리한다. 그 외 추가적인 구현이 요구되나, 그렇게 빡세게 요구되진 않는다. 3번까지는 딱히 알고리즘이 요구되지도 않고 굉장히 무난한 문제들로 나온 것같다. 4번부터 조금씩 어려워지는 듯
4번. (TC 2개 실패, 나머지 All AC)
좀 아쉬운 문제. 맞았는데 왜 틀리죠?
굉장히 이상한 점수계산 방법의 양궁 결승전이 진행될 때, 라이언이 아파치를 압도적으로 이기게 하려면 활을 어떻게 쏴야 할 지 구하는 문제이다. 출제위원분께서 올림픽을 보면서 문제를 만든게 아닐까 생각된다 ㅎㅎ
처음엔 단순 구현일 줄 알았는데, 계속 관찰하다보니 백트래킹인 것이 눈에 보였다. 양궁 점수도 0~10점까지 밖에 없기 때문에 백트래킹으로 잘 처리해주면 된다. 또한, 낮은 점수를 많이 쏜 경우가 우선되도록 한다는 말은, 높은 점수를 적게 쏜 경우가 우선된다는 말과 같다. 만약 n개보다 적게 활을 쐈을 경우 나머진 0점에 때려박도록 하였다.
5번. (TC 1개 실패, 나머지 All AC)
좀 아쉬운 문제222. 맞았는데 왜 틀리죠? ㅠㅠㅠㅠㅠㅠㅠㅠㅠ 왜틀리긴 어딘가 틀렸으니까 틀렸겠지
출처: 나동빈 유튜브
무난한 DFS… 라기엔 함정이 있다. 이미 왔던 길을 다시 갈 수 있다는 점. 처음엔 비트마스킹+dp인가? 싶었는데, 계속 관찰하다보니 visit배열 차원을 늘려주면 됐다. visit배열을 현재 데리고 있는 양을 포함한 visit[18][18]로 둬도 되고, 늑대까지 포함한 visit[18][18][18]로 두어도 된다. 늑대 한마리만 더 늘어나는 이상한 길을 택하진 않을테니, 그리디적으로 생각해보면 visit[18][18]로도 충분히 가능함을 알 수 있다. 근데 어차피 N이 17까지밖에 안되기 때문에 어떻게 두어도 상관없을 듯.
6번. (정확성 TC All AC / 효율성 TC All AC)
정확성 만점받는 방법은 1, 3번 급으로 쉬우니 패스.
물론, 효율성 만점받지 못할 경우를 생각하여 정확성만 AC받는 코드도 제출하긴 했다.
그러나 효율성 부분은 O(N*N*25만)으로 처리할 경우 시간초과가 난다.
더더욱 놀랐던건 적절한 누적합을 이용해 O(N*25만)으로 해도 효율성 부분에서 점수를 하나도 못 얻는다는 점이다! 6번인 이유가 있었다… 그렇기 때문에 효율성 부분에서 조금이라도 점수를 얻으려면 골치아픈 이차원 누적합 + 이차원 누적합의 변화율을 고려해야 한다.
update만 필요하기 때문에 세그먼트트리가 필요없다. query까지 요구됐으면 이 문제는 넘사벽 다이아 문제가 되지 않았을까.. 누적합으로 쉽게 는 아니고, 실수할 여지가 높아 힘들었던 문제.
이차원 누적합은 아래 백준 문제가 도움이 될 것이다.
https://www.acmicpc.net/problem/15724
누적합에 대한 변화율은 아래 문제가 도움이 될 것이다.
개인적으로 난 누적합 변화율 부분에서 이계도함수가 떠올랐다. 아마 실제로도 비슷하긴 할것이다. 변화율의 변화율을 이용하는 것이기 때문에..
https://www.acmicpc.net/problem/19951
그런데, 이번 카카오 문제는 이차원 누적합 + 이차원 누적합에 대한 변화율을 따지는 문제였기 때문에 위 두문제를 제대로 풀 줄 알더라도, 꽤나 어려웠을 것이다. (아니면 내가 그냥 빡대가리인 걸수도 있다.)
이차원 누적합일 땐, 누적합의 변화량을 (r1, c1), (r1, c2+1), (r2+1, c1), (r2+1, c2+1)에 처리해준다. 이 때, +, – 헷갈리지 않도록 조심하자.
그리고 누적합의 변화량을 이차원 누적합에 적용시키기 위해 prefix_sum[i-1][j] + prefix_sum[i][j-1] 을 더해준 후, 변화량을 더해주고, prefix_sum[i-1][j-1]이 중복됐으므로 빼주면 된다.
그렇게 해서 이 이차원 누적합을 원래 값에 더해준 값이 1 이상인지 비교해주면 된다.
이렇게 하면 효율성 부분도 All AC를 받는다.
7번은 문제 자체를 보지 않았다.
4번, 5번 TC가 딱 1,2개씩 틀리던데, 이게 너무 아쉽다. 멋지고 깔끔하게 6솔이었으면 좋았을텐데. 그래도 부분점수를 많이 챙겨가서 다행이기도하고, 목표로 여긴 3솔보단 많이 풀어서 다행인가 싶기도 하다.
그래도 생각했던 것보다 잘 풀어서 기분이 좋다.
이렇게 꾸준하게 공부해서 취업할 때 코테에 발목잡히지 않도록 해야겠다.
+) ps러들은 all solved 한 사람들이 꽤 많은 것 같은데, 나도 더 열심히 노력해야겠다. 많이 배우고 간 대회 🙂
+) 21.09.17 추가
야호
오후 6시 경, 합격 이메일이 도착했다.
문자는 따로 오지 않았다.
+) 계열사는 1지망 카카오 백엔드, 2지망 카카오페이로 지원하였다.
2차 테스트는 9월 25일 토요일이나, 현재는 군복무중이기 때문에 2차는 따로 응시하지 않을 예정이다.
그동안 열심히 공부해서 전역후에 2023 블라인드 테스트부턴 2차 코테도 응시해서 합격할 수 있도록 최선을 다해야겠다!
2022 카카오 신입 공채 2차 온라인 코딩 테스트 풀이 답안 – GitHub
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
2022 카카오 신입 공채 2차 온라인 코딩 테스트 풀이 답안. Contribute to cpm0722/kakao-2022-round2 development by creating an account on GitHub.
- Source: github.com
- Views: 53529
- Publish date: 21 hours ago
- Downloads: 104509
- Likes: 9120
- Dislikes: 1
- Title Website: 2022 카카오 신입 공채 2차 온라인 코딩 테스트 풀이 답안 – GitHub
- Description Website: 2022 카카오 신입 공채 2차 온라인 코딩 테스트 풀이 답안. Contribute to cpm0722/kakao-2022-round2 development by creating an account on GitHub.
카카오 코딩 테스트 – 합승 택시 요금 (C++ 풀이)
- Source: Youtube
- Views: 48229
- Date: 15 hours ago
- Download: 65531
- Likes: 4640
- Dislikes: 9
cpm0722/kakao-2022-round2: 2022 카카오 신입 공채 2차 온라인 코딩 테스트 풀이 답안
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
카카오 신입공채 코테 문제 해설
블라인드 채용으로 관심을 모은 카카오 신입 공채의 세 번째 테스트가 지난 10월 29일(일), 오후 2시부터 6시까지 네 시간에 걸쳐 오프라인으로 치러졌습니다. 두 차례의 온라인 테스트를 통과한
카카오 신입 공채 3차 코딩 테스트 문제 해설
tech.kakao.com
20 thg 8, 2021 — 2018 카카오 신입 공채 1,2,3차 코딩 테스트 문제 해설. https://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/.
- Source: rladuddms.tistory.com
- Views: 74924
- Publish date: 9 hours ago
- Downloads: 109332
- Likes: 7696
- Dislikes: 5
- Title Website: 카카오 신입공채 코테 문제 해설
- Description Website: 20 thg 8, 2021 — 2018 카카오 신입 공채 1,2,3차 코딩 테스트 문제 해설. https://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/.
코딩테스트 팁 – 절대 하면 안되는 2가지
- Source: Youtube
- Views: 3979
- Date: 4 minute ago
- Download: 55552
- Likes: 8564
- Dislikes: 1
카카오 신입공채 코테 문제 해설
카카오 신입 공채 3차 코딩 테스트 문제 해설
블라인드 채용으로 관심을 모은 카카오 신입 공채의 세 번째 테스트가 지난 10월 29일(일), 오후 2시부터 6시까지 네 시간에 걸쳐 오프라인으로 치러졌습니다. 두 차례의 온라인 테스트를 통과한
tech.kakao.com
2023 카카오 신입 개발자 블라인드 채용 후기 (1차 코딩테스트 …
24 thg 11, 2022 — (중간에 카카오 IDC 화재사건 때문에 1주일이 밀리는 이슈가 있기는 했습니다.)처음에는 저도 코딩테스트 연습을 위해서 지원을 했지만 하나씩 합격 …
- Source: velog.io
- Views: 97700
- Publish date: 13 hours ago
- Downloads: 28342
- Likes: 9923
- Dislikes: 6
- Title Website: 2023 카카오 신입 개발자 블라인드 채용 후기 (1차 코딩테스트 …
- Description Website: 24 thg 11, 2022 — (중간에 카카오 IDC 화재사건 때문에 1주일이 밀리는 이슈가 있기는 했습니다.)처음에는 저도 코딩테스트 연습을 위해서 지원을 했지만 하나씩 합격 …
- Source: Youtube
- Views: 27161
- Date: 18 hours ago
- Download: 11408
- Likes: 307
- Dislikes: 3
2023 Kakao Blind Recruitment 1차 코딩테스트 풀이
DSU를 써야하는지 아닌지 고민을 하다가, 쓸 필요가 없을 것 같음을 깨닫고 종료 거의 직전에 푼 문제이다. 일단 표 제한이 50*50이기 때문에 꽤 할만해보였다. 먼저 50*50 정수배열을 하나 더 만들어 관리했는데, 각 좌표가 $(i,j)$일 때 $i*50+j$로 계산해 모두 다르게 표현했고, merge가 됐다면 같은 수로 표현한다. 알기로 명령어 종류가 4개였는데, 그림으로 표현해보자. 모든 쿼리는 50*50에 할 수 있고, 쿼리 개수까지 곱해도 얼마 안됐던 것 같다.
이 문제 역시 처음에 BFS를 써야겠다고 생각해 코드를 열심히 짜다가, 이건 아님을 깨닫고 고쳤다. 먼저 사전순 순서인 d, l, r, u를 실행할 수 있는대로 실행하는 것이 목표다. 이동할 때마다 목표지점까지의 최단거리 $ |x_i-x_j|+|y_i-y_j| $를 계산하고, 이 값과 앞으로 이동해야하는 횟수를 비교해 d, l, r, u로 가도 되는지(가도 제한횟수 안에 목표까지 도달할 수 있는지)를 각각 판단해 이동했다. 생각보다 어렵지는 않았다.
문제 모양새는 어떠한 알고리즘을 요구하는 것 같지만서도, 잘 생각해보면 그 알고리즘이 필요없는 문제가 있었다. 4번은 트리탐색을 해야할 것 같지만 안해도 되고, 5번은 dsu를 써야할 것 같지만 안써도 되고, 6번은 BFS나 Dijkstra를 써야할 것 같지만 안써도 되었다. 시간복잡도를 줄이는 방안으로 알고리즘을 쓰는 것이 중요함을 다시금 깨닫게 해준 코테였다.
1 thg 10, 2022 — 후기. 2023년 카카오 공채 1차 코딩테스트를 쳐보았다. 결과는 1~6번까지 6솔브 했다. 2020~2022 공채 기출들과 2023년 코테와의 차이점을 보자면,.
- Source: ggyuchive.tistory.com
- Views: 50115
- Publish date: 41 minute ago
- Downloads: 218
- Likes: 4051
- Dislikes: 8
- Title Website: 2023 Kakao Blind Recruitment 1차 코딩테스트 풀이
- Description Website: 1 thg 10, 2022 — 후기. 2023년 카카오 공채 1차 코딩테스트를 쳐보았다. 결과는 1~6번까지 6솔브 했다. 2020~2022 공채 기출들과 2023년 코테와의 차이점을 보자면,.
2018년도 카카오 블라인드 코딩 테스트 채용 – 전체 문제풀이 (총 38분)
- Source: Youtube
- Views: 72977
- Date: 33 minute ago
- Download: 27399
- Likes: 5619
- Dislikes: 4
2023 Kakao Blind Recruitment 1차 코딩테스트 풀이
후기
2023년 카카오 공채 1차 코딩테스트를 쳐보았다. 결과는 1~6번까지 6솔브 했다.
2020~2022 공채 기출들과 2023년 코테와의 차이점을 보자면,
1. 그리디스러운 문제들이 많이 출제되었다.
문제 모양새는 어떠한 알고리즘을 요구하는 것 같지만서도, 잘 생각해보면 그 알고리즘이 필요없는 문제가 있었다. 4번은 트리탐색을 해야할 것 같지만 안해도 되고, 5번은 dsu를 써야할 것 같지만 안써도 되고, 6번은 BFS나 Dijkstra를 써야할 것 같지만 안써도 되었다. 시간복잡도를 줄이는 방안으로 알고리즘을 쓰는 것이 중요함을 다시금 깨닫게 해준 코테였다.
2. 2번이 꽤 어려웠다.
여태까지 코딩테스트는 1,2,3번이 쉬운 문제에 속했으나, 올해 2번은 평소 2번과는 꽤 달랐다. 당황한 사람들이 많았을 것 같고, 2번의 난이도가 이번 코테 전체 난이도를 높인 느낌이 있다.
3. 정확성/효율성이 나눠지는 문제가 없었다.
이 덕분에 합격선이 4솔 아니면 5솔로 딱 떨어질텐데, 개인적으로는 Programming 분야는 4솔브이상이라면 합격일 것이라고 예상한다.
1차 결과
문제 풀이
1번, 3번, 4번, 6번, 2번, 5번 순으로 풀었다. 원래 모든 문제를 읽고 푸는걸 좋아했고, 어떤 문제를 풀면서 다른 문제의 아이디어가 생각날 때가 많았어서 좀 뒤죽박죽 풀었다.
1번. 구현 (+16min)
한 달에 28일인 달력에서 날짜가 넘어갈 때마다 년, 월, 일 계산을 잘 해줘야 하는 문제. 년도 제한이 크지 않아 하루씩 계산해도 된다. 전형적인 1번 문제.
2번. 그리디 (+235min)
최적의 방안은 한 번 갔다올 때마다 지급이나 수거가 필요한 가장 멀리 떨어진 곳에서부터 capacity만큼 택배를 주고, 박스를 수거하는 것이다. 이 점을 증명하는 것이 쉽지도 않고, 택배 지급과 수거가 따로 이루어지는데 항상 가능한지가 의문이 들 수 있지만, 언제나 가능하다는 것을 직접 시뮬레이션하다보면 알 수 있다. 난이도가 꽤 높다.
3번. 브루트포스, 구현 (+46min)
할인율 선택지가 4개라는 점과, 이모티콘 개수가 최대 m = 7개인 점을 이용해 완전탐색으로 구현이 가능하다. 가능한 모든 조합 개수 $4^m$을 계산하고 4씩 나눈 나머지로 할인율을 정해두면 완전탐색이 된다. 코테에 나오는 전형적인 유형이기 때문에 쉽게 풀었을 것이다.
4번. 트리, 비트마스킹 (+107min)
전위탐색으로 번호가 붙여진 포화이진트리들이 있을 때, 어떠한 수를 주면 그 수에 맞는 트리가 있는지 묻는 문제이다. 전위탐색으로 매겨진 포화이진트리 번호에서 이 성질을 관찰했다면 쉽게 풀 수 있다.
번호가 홀수인 노드는 리프노드(자식이 없는 노드)이고, 리프노드는 번호가 홀수이다.
번호를 $m \times 2^n (m은 홀수, n \geq 1)$로 표현했을 때, 자식노드 2개의 번호는 $m \times 2^n-2^{n-1}$, $m \times 2^n+2^{n-1}$ 이다.
트리임이 성립하려면 부모, 자식 관계에 있는 노드를 탐색하면서 부모가 0, 자식이 1인 경우가 하나도 없으면 된다.
이 성질들을 알아냈다면 트리탐색을 할 필요가 없고, 비트연산(shift, and)만으로 가능성을 판단할 수 있다.
5번. 구현, 파싱 (+291min)
DSU를 써야하는지 아닌지 고민을 하다가, 쓸 필요가 없을 것 같음을 깨닫고 종료 거의 직전에 푼 문제이다. 일단 표 제한이 50*50이기 때문에 꽤 할만해보였다. 먼저 50*50 정수배열을 하나 더 만들어 관리했는데, 각 좌표가 $(i,j)$일 때 $i*50+j$로 계산해 모두 다르게 표현했고, merge가 됐다면 같은 수로 표현한다. 알기로 명령어 종류가 4개였는데, 그림으로 표현해보자. 모든 쿼리는 50*50에 할 수 있고, 쿼리 개수까지 곱해도 얼마 안됐던 것 같다.
1) UPDATE 문자 문자
string 50*50 배열에서 관리하는 string을 바꾸면 된다.
2) UPDATE 좌표 문자
(merge된 것도 같이 update) 따로 만든 정수배열에서 같은 숫자라면 같이 update해준다.
3) MERGE 좌표 좌표
따로 관리하는 배열의 값이 각각 X, Y라면 Y를 X로 모두 바꾸고, string 배열에서도 바꿔주면 된다.
4) UNMERGE 좌표
따로 관리하는 배열의 값이 X인 것들을 모두 초기상태로 되돌려주고 string 배열도 조건에 맞게 한다.
6번. 그리디 (+158min)
이 문제 역시 처음에 BFS를 써야겠다고 생각해 코드를 열심히 짜다가, 이건 아님을 깨닫고 고쳤다. 먼저 사전순 순서인 d, l, r, u를 실행할 수 있는대로 실행하는 것이 목표다. 이동할 때마다 목표지점까지의 최단거리 $ |x_i-x_j|+|y_i-y_j| $를 계산하고, 이 값과 앞으로 이동해야하는 횟수를 비교해 d, l, r, u로 가도 되는지(가도 제한횟수 안에 목표까지 도달할 수 있는지)를 각각 판단해 이동했다. 생각보다 어렵지는 않았다.
주제에 대한 관련 정보 카카오 코딩 테스트
Bing에서 카카오 코딩 테스트 주제에 대한 최신 정보를 볼 수 있습니다.
주제에 대한 기사 보기를 마쳤습니다 카카오 코딩 테스트. 이 기사가 유용했다면 공유하십시오. 매우 감사합니다. 사람들이 이 주제와 관련하여 자주 검색하는 키워드: 카카오 코딩 테스트 카카오 코딩테스트 후기, 카카오 코딩테스트 부정행위, 카카오 코딩테스트 난이도, 카카오 코딩테스트 합격 기준, 카카오 코딩테스트 준비기간, 카카오 2023 코딩테스트, 카카오 코딩테스트 난이도 백준, 카카오 코딩테스트 커트라인