Skip to content

Commit dde24b5

Browse files
committed
[level 3] Title: 징검다리 건너기, Time: 10.20 ms, Memory: 40 MB -BaekjoonHub
1 parent 91fc28e commit dde24b5

2 files changed

Lines changed: 134 additions & 0 deletions

File tree

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# [level 3] 징검다리 건너기 - 64062
2+
3+
[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/64062)
4+
5+
### 성능 요약
6+
7+
메모리: 40 MB, 시간: 10.20 ms
8+
9+
### 구분
10+
11+
코딩테스트 연습 > 2019 카카오 개발자 겨울 인턴십
12+
13+
### 채점결과
14+
15+
정확성: 64.1<br/>효율성: 35.9<br/>합계: 100.0 / 100.0
16+
17+
### 제출 일자
18+
19+
2026년 05월 20일 14:49:21
20+
21+
### 문제 설명
22+
23+
<p><strong>[본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.]</strong></p>
24+
25+
<p>카카오 초등학교의 "니니즈 친구들"이 "라이언" 선생님과 함께 가을 소풍을 가는 중에 <strong>징검다리</strong>가 있는 개울을 만나서 건너편으로 건너려고 합니다. "라이언" 선생님은 "니니즈 친구들"이 무사히 징검다리를 건널 수 있도록 다음과 같이 규칙을 만들었습니다.</p>
26+
27+
<ul>
28+
<li>징검다리는 일렬로 놓여 있고 각 징검다리의 디딤돌에는 모두 숫자가 적혀 있으며 디딤돌의 숫자는 한 번 밟을 때마다 1씩 줄어듭니다.</li>
29+
<li>디딤돌의 숫자가 0이 되면 더 이상 밟을 수 없으며 이때는 그 다음 디딤돌로 한번에 여러 칸을 건너 뛸 수 있습니다.</li>
30+
<li>단, 다음으로 밟을 수 있는 디딤돌이 여러 개인 경우 무조건 가장 가까운 디딤돌로만 건너뛸 수 있습니다.</li>
31+
</ul>
32+
33+
<p>"니니즈 친구들"은 개울의 왼쪽에 있으며, 개울의 오른쪽 건너편에 도착해야 징검다리를 건넌 것으로 인정합니다.<br>
34+
"니니즈 친구들"은 한 번에 한 명씩 징검다리를 건너야 하며, 한 친구가 징검다리를 모두 건넌 후에 그 다음 친구가 건너기 시작합니다.</p>
35+
36+
<p>디딤돌에 적힌 숫자가 순서대로 담긴 배열 stones와 한 번에 건너뛸 수 있는 디딤돌의 최대 칸수 k가 매개변수로 주어질 때, 최대 몇 명까지 징검다리를 건널 수 있는지 return 하도록 solution 함수를 완성해주세요.</p>
37+
38+
<h4><strong>[제한사항]</strong></h4>
39+
40+
<ul>
41+
<li>징검다리를 건너야 하는 니니즈 친구들의 수는 무제한 이라고 간주합니다.</li>
42+
<li>stones 배열의 크기는 1 이상 200,000 이하입니다.</li>
43+
<li>stones 배열 각 원소들의 값은 1 이상 200,000,000 이하인 자연수입니다.</li>
44+
<li>k는 1 이상 stones의 길이 이하인 자연수입니다.</li>
45+
</ul>
46+
47+
<hr>
48+
49+
<h5><strong>[입출력 예]</strong></h5>
50+
<table class="table">
51+
<thead><tr>
52+
<th>stones</th>
53+
<th>k</th>
54+
<th>result</th>
55+
</tr>
56+
</thead>
57+
<tbody><tr>
58+
<td>[2, 4, 5, 3, 2, 1, 4, 2, 5, 1]</td>
59+
<td>3</td>
60+
<td>3</td>
61+
</tr>
62+
</tbody>
63+
</table>
64+
<h5><strong>입출력 예에 대한 설명</strong></h5>
65+
66+
<hr>
67+
68+
<p><strong>입출력 예 #1</strong></p>
69+
70+
<p>첫 번째 친구는 다음과 같이 징검다리를 건널 수 있습니다.<br>
71+
<img src="https://asset.programmers.co.kr/files/production/4560e242-cf83-4e77-a14c-174f3831499d/step_stones_104.png" title="" alt="step_stones_104.png"></p>
72+
73+
<p>첫 번째 친구가 징검다리를 건넌 후 디딤돌에 적힌 숫자는 아래 그림과 같습니다.<br>
74+
두 번째 친구도 아래 그림과 같이 징검다리를 건널 수 있습니다.<br>
75+
<img src="https://asset.programmers.co.kr/files/production/d64f29ac-3e35-4fd3-91fa-4d70e3b6c80a/step_stones_101.png" title="" alt="step_stones_101.png"></p>
76+
77+
<p>두 번째 친구가 징검다리를 건넌 후 디딤돌에 적힌 숫자는 아래 그림과 같습니다.<br>
78+
세 번째 친구도 아래 그림과 같이 징검다리를 건널 수 있습니다.<br>
79+
<img src="https://asset.programmers.co.kr/files/production/369bc8a1-7017-4135-a499-505247ab9cfc/step_stones_102.png" title="" alt="step_stones_102.png"></p>
80+
81+
<p>세 번째 친구가 징검다리를 건넌 후 디딤돌에 적힌 숫자는 아래 그림과 같습니다. <br>
82+
네 번째 친구가 징검다리를 건너려면, 세 번째 디딤돌에서 일곱 번째 디딤돌로 네 칸을 건너뛰어야 합니다. 하지만 k = 3 이므로 건너뛸 수 없습니다.<br>
83+
<img src="https://asset.programmers.co.kr/files/production/e44e0a83-e637-48ad-858c-4c135c3b078f/step_stones_103.png" title="" alt="step_stones_103.png"></p>
84+
85+
<p>따라서 최대 3명이 디딤돌을 모두 건널 수 있습니다.</p>
86+
87+
88+
> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/**
2+
* 징검다리 건너는 규칙
3+
* 1. 일렬로 놓여있고 숫자가 적혀있으며 밟을때마다 1씩 줄어들음
4+
* 2. 숫자가 0이 되면 더 밟을 수 없음. 이때는 그다음 디딤돌로 한번에 여러칸(k) 건너뛸수있음
5+
* 3. 밟을 수 있는 디딤돌이 여러개면 무조건 가장 가까운 디딤돌로만 건너뜀
6+
*
7+
* 개울 왼쪽에서 시작해서 오른쪽에 도착해야 건넌 것으로 인정
8+
* 한명씩 건너야하고 한명이 다 건너고 다음사람이 건너야함
9+
*
10+
* 최대 몇명까지 징검다리를 건널 수 있는지 return
11+
**/
12+
13+
function crossStones(stones, k, mid) {
14+
let count = 0;
15+
16+
for (let i = 0; i < stones.length; i++) {
17+
if (stones[i] < mid) {
18+
count++;
19+
if (count >= k) return false;
20+
} else {
21+
count = 0;
22+
}
23+
}
24+
25+
return true;
26+
}
27+
28+
function solution(stones, k) {
29+
let left = 1;
30+
let right = 200000000;
31+
let answer = 0;
32+
33+
while (left <= right) {
34+
let mid = Math.floor((left + right) / 2);
35+
36+
if (crossStones(stones, k, mid)) {
37+
//mid명이 건널 수 있으면 answer로 일단 기록
38+
answer = mid;
39+
left = mid + 1;
40+
} else {
41+
//건널 수 없는 경우
42+
right = mid - 1;
43+
}
44+
}
45+
return answer;
46+
}

0 commit comments

Comments
 (0)