Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# [Bronze I] 알고리즘 수업 - 선택 정렬 1 - 23881

[문제 링크](https://www.acmicpc.net/problem/23881)

### 성능 요약

메모리: 32276 KB, 시간: 1412 ms

### 분류

구현, 시뮬레이션, 정렬

### 문제 설명

<p>오늘도 서준이는 선택 정렬 수업 조교를 하고 있다. 아빠가 수업한 내용을 학생들이 잘 이해했는지 문제를 통해서 확인해보자.</p>

<p><em>N</em>개의 서로 다른 양의 정수가 저장된 배열 A가 있다. 선택 정렬로 배열 A를 오름차순 정렬할 경우 <em>K </em>번째 교환되는 수를 구해서 우리 서준이를 도와주자.</p>

<p>크기가 <em>N</em>인 배열에 대한 선택 정렬 의사 코드는 다음과 같다.</p>

<pre>selection_sort(A[1..N]) { # A[1..N]을 오름차순 정렬한다.
for last <- N downto 2 {
A[1..last]중 가장 큰 수 A[i]를 찾는다
if (last != i) then A[last] <-> A[i] # last와 i가 서로 다르면 A[last]와 A[i]를 교환
}
}</pre>

### 입력

<p>첫째 줄에 배열 A의 크기 <em>N</em>(5 ≤ <em>N</em> ≤ 10,000), 교환 횟수 <em>K</em>(1 ≤ <em>K</em> ≤ N)가 주어진다.</p>

<p>다음 줄에 서로 다른 배열 A의 원소 A<sub>1</sub>, A<sub>2</sub>, ..., A<sub>N</sub>이 주어진다. (1 ≤ A<sub>i</sub> ≤ 10<sup>9</sup>)</p>

### 출력

<p><em>K </em>번째 교환되는 두 개의 수를 작은 수부터 한 줄에 출력한다. 교환 횟수가 <em>K </em>보다 작으면 -1을 출력한다.</p>

Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import sys

# sys.stdin = open("input.txt", "r")
input = sys.stdin.readline

n, k = map(int, input().split())
l = list(map(int, input().split()))

cnt = 0

for i in range(n - 1, 0, -1):
index = l.index(max(l[:i + 1]))

if index != i:
l[index], l[i] = l[i], l[index]
cnt += 1

if cnt == k:
print(l[index], l[i])
exit()

print(-1)
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# [Bronze I] 알고리즘 수업 - 선택 정렬 2 - 23882

[문제 링크](https://www.acmicpc.net/problem/23882)

### 성능 요약

메모리: 32276 KB, 시간: 1372 ms

### 분류

구현, 시뮬레이션, 정렬

### 문제 설명

<p>오늘도 서준이는 선택 정렬 수업 조교를 하고 있다. 아빠가 수업한 내용을 학생들이 잘 이해했는지 문제를 통해서 확인해보자.</p>

<p><em>N</em>개의 서로 다른 양의 정수가 저장된 배열 A가 있다. 선택 정렬로 배열 A를 오름차순 정렬할 경우 <em>K </em>번 교환이 발생한 직후의 배열 A를 출력해 보자.</p>

<p>크기가 <em>N</em>인 배열에 대한 선택 정렬 의사 코드는 다음과 같다.</p>

<pre>selection_sort(A[1..N]) { # A[1..N]을 오름차순 정렬한다.
for last <- N downto 2 {
A[1..last]중 가장 큰 수 A[i]를 찾는다
if (last != i) then A[last] <-> A[i] # last와 i가 서로 다르면 A[last]와 A[i]를 교환
}
}</pre>

### 입력

<p>첫째 줄에 배열 A의 크기 <em>N</em>(5 ≤ <em>N</em> ≤ 10,000), 교환 횟수 <em>K</em>(1 ≤ <em>K</em> ≤ N)가 주어진다.</p>

<p>다음 줄에 서로 다른 배열 A의 원소 A<sub>1</sub>, A<sub>2</sub>, ..., A<sub>N</sub>이 주어진다. (1 ≤ A<sub>i</sub> ≤ 10<sup>9</sup>)</p>

### 출력

<p> <em>K </em>번 교환이 발생한 직후의 배열 A를 한 줄에 출력한다. 교환 횟수가 <em>K </em>보다 작으면 -1을 출력한다.</p>

Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import sys

# sys.stdin = open("input.txt", "r")
input = sys.stdin.readline

n, k = map(int, input().split())
l = list(map(int, input().split()))

cnt = 0

for i in range(n - 1, 0, -1):
index = l.index(max(l[:i + 1]))

if index != i:
l[index], l[i] = l[i], l[index]
cnt += 1

if cnt == k:
print(*l)
exit()

print(-1)
100 changes: 100 additions & 0 deletions 프로그래머스/lv3/68646. 풍선 터트리기/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
# [level 3] 풍선 터트리기 - 68646

[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/68646)

### 성능 요약

메모리: 89.5 MB, 시간: 27.46 ms

### 구분

코딩테스트 연습 > 월간 코드 챌린지 시즌1

### 채점결과

Empty

### 문제 설명

<p>일렬로 나열된 n개의 풍선이 있습니다. 모든 풍선에는 서로 다른 숫자가 써져 있습니다. 당신은 다음 과정을 반복하면서 풍선들을 단 1개만 남을 때까지 계속 터트리려고 합니다.</p>

<ol>
<li>임의의 <strong>인접한</strong> 두 풍선을 고른 뒤, 두 풍선 중 하나를 터트립니다.</li>
<li>터진 풍선으로 인해 풍선들 사이에 빈 공간이 생겼다면, 빈 공간이 없도록 풍선들을 중앙으로 밀착시킵니다.</li>
</ol>

<p>여기서 조건이 있습니다. 인접한 두 풍선 중에서 <strong>번호가 더 작은 풍선</strong>을 터트리는 행위는 최대 1번만 할 수 있습니다. 즉, 어떤 시점에서 인접한 두 풍선 중 번호가 더 작은 풍선을 터트렸다면, 그 이후에는 인접한 두 풍선을 고른 뒤 번호가 더 큰 풍선만을 터트릴 수 있습니다.</p>

<p>당신은 어떤 풍선이 최후까지 남을 수 있는지 알아보고 싶습니다. 위에 서술된 조건대로 풍선을 터트리다 보면, 어떤 풍선은 최후까지 남을 수도 있지만, 어떤 풍선은 무슨 수를 쓰더라도 마지막까지 남기는 것이 <strong>불가능</strong>할 수도 있습니다.</p>

<p>일렬로 나열된 풍선들의 번호가 담긴 배열 a가 주어집니다. 위에 서술된 규칙대로 풍선들을 1개만 남을 때까지 터트렸을 때 최후까지 남기는 것이 가능한 풍선들의 개수를 return 하도록 solution 함수를 완성해주세요.</p>

<hr>

<h5>제한 사항</h5>

<ul>
<li>a의 길이는 1 이상 1,000,000 이하입니다.

<ul>
<li><code>a[i]</code>는 i+1 번째 풍선에 써진 숫자를 의미합니다.</li>
<li>a의 모든 수는 -1,000,000,000 이상 1,000,000,000 이하인 정수입니다.</li>
<li>a의 모든 수는 서로 다릅니다.</li>
</ul></li>
</ul>

<hr>

<h5>입출력 예</h5>
<table class="table">
<thead><tr>
<th>a</th>
<th>result</th>
</tr>
</thead>
<tbody><tr>
<td><code>[9,-1,-5]</code></td>
<td>3</td>
</tr>
<tr>
<td><code>[-16,27,65,-2,58,-92,-71,-68,-61,-33]</code></td>
<td>6</td>
</tr>
</tbody>
</table>
<hr>

<h5>입출력 예 설명</h5>

<p>입출력 예 #1</p>

<ul>
<li>첫 번째 풍선(9가 써진 풍선)을 최후까지 남기는 방법은 다음과 같습니다.

<ol>
<li><code>[9, -1, -5]</code> 에서 -1, -5가 써진 풍선을 고른 뒤, -1이 써진 풍선(번호가 더 큰 것)을 터트립니다.</li>
<li><code>[9, -5]</code> 에서 9, -5가 써진 풍선을 고른 뒤, -5가 써진 풍선(번호가 더 작은 것)을 터트립니다.</li>
</ol></li>
<li>두 번째 풍선(-1이 써진 풍선)을 최후까지 남기는 방법은 다음과 같습니다.

<ol>
<li><code>[9, -1, -5]</code> 에서 9, -1이 써진 풍선을 고른 뒤, 9가 써진 풍선(번호가 더 큰 것)을 터트립니다.</li>
<li><code>[-1, -5]</code> 에서 -1, -5가 써진 풍선을 고른 뒤, -5가 써진 풍선(번호가 더 작은 것)을 터트립니다.</li>
</ol></li>
<li>세 번째 풍선(-5가 써진 풍선)을 최후까지 남기는 방법은 다음과 같습니다.

<ol>
<li><code>[9, -1, -5]</code> 에서 9, -1이 써진 풍선을 고른 뒤, 9가 써진 풍선(번호가 더 큰 것)을 터트립니다.</li>
<li><code>[-1, -5]</code> 에서 -1, -5가 써진 풍선을 고른 뒤, -1이 써진 풍선(번호가 더 큰 것)을 터트립니다.</li>
</ol></li>
<li>3개의 풍선이 최후까지 남을 수 있으므로, 3을 return 해야 합니다.</li>
</ul>

<p>입출력 예 #2</p>

<ul>
<li>최후까지 남을 수 있는 풍선은 -16, -92, -71, -68, -61, -33이 써진 풍선으로 모두 6개입니다.</li>
</ul>


> 출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
function solution(a) {
var answer = 2;
var al = a.length;

var ldp = [...a];
var rdp = [...a];

for (let i = 1; i < al; i++) {
if (ldp[i] > ldp[i - 1]) ldp[i] = ldp[i - 1];
}
for (let i = al - 2; i >= 0; i--) {
if (rdp[i] > rdp[i + 1]) rdp[i] = rdp[i + 1];
}

for (let i = 1; i < al - 1; i++) {
// console.log(a, a[i], ldp[i - 1], rdp[i + 1]);
if (a[i] < ldp[i - 1] || a[i] < rdp[i + 1]) {
answer++;
}
}

return answer;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
# [level 4] [3차] 자동완성 - 17685

[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/17685?language=javascript)

### 성능 요약

메모리: 37.3 MB, 시간: 0.20 ms

### 구분

코딩테스트 연습 > 2018 KAKAO BLIND RECRUITMENT

### 채점결과

Empty

### 문제 설명

<h2>자동완성</h2>

<p>포털 다음에서 검색어 자동완성 기능을 넣고 싶은 라이언은 한 번 입력된 문자열을 학습해서 다음 입력 때 활용하고 싶어 졌다. 예를 들어, <code>go</code> 가 한 번 입력되었다면, 다음 사용자는 <code>g</code> 만 입력해도 <code>go</code>를 추천해주므로 <code>o</code>를 입력할 필요가 없어진다! 단, 학습에 사용된 단어들 중 앞부분이 같은 경우에는 어쩔 수 없이 다른 문자가 나올 때까지 입력을 해야 한다.<br>
효과가 얼마나 좋을지 알고 싶은 라이언은 학습된 단어들을 찾을 때 몇 글자를 입력해야 하는지 궁금해졌다.</p>

<p>예를 들어, 학습된 단어들이 아래와 같을 때</p>
<div class="highlight"><pre class="codehilite"><code>go
gone
guild
</code></pre></div>
<ul>
<li><code>go</code>를 찾을 때 <code>go</code>를 모두 입력해야 한다.</li>
<li><code>gone</code>을 찾을 때 <code>gon</code> 까지 입력해야 한다.
(<code>gon</code>이 입력되기 전까지는 <code>go</code> 인지 <code>gone</code>인지 확신할 수 없다.)</li>
<li><code>guild</code>를 찾을 때는 <code>gu</code> 까지만 입력하면 <code>guild</code>가 완성된다.</li>
</ul>

<p>이 경우 총 입력해야 할 문자의 수는 <code>7</code>이다.</p>

<p>라이언을 도와 위와 같이 문자열이 입력으로 주어지면 학습을 시킨 후, 학습된 단어들을 순서대로 찾을 때 몇 개의 문자를 입력하면 되는지 계산하는 프로그램을 만들어보자.</p>

<h3>입력 형식</h3>

<p>학습과 검색에 사용될 중복 없는 단어 <code>N</code>개가 주어진다. <br>
모든 단어는 알파벳 소문자로 구성되며 단어의 수 <code>N</code>과 단어들의 길이의 총합 <code>L</code>의 범위는 다음과 같다.</p>

<ul>
<li>2 &lt;= <code>N</code> &lt;= 100,000</li>
<li>2 &lt;= <code>L</code> &lt;= 1,000,000</li>
</ul>

<h3>출력 형식</h3>

<p>단어를 찾을 때 입력해야 할 총 문자수를 리턴한다.</p>

<h3>입출력 예제</h3>
<table class="table">
<thead><tr>
<th>words</th>
<th>result</th>
</tr>
</thead>
<tbody><tr>
<td>["go","gone","guild"]</td>
<td>7</td>
</tr>
<tr>
<td>["abc","def","ghi","jklm"]</td>
<td>4</td>
</tr>
<tr>
<td>["word","war","warrior","world"]</td>
<td>15</td>
</tr>
</tbody>
</table>
<h3>입출력 설명</h3>

<ul>
<li>첫 번째 예제는 본문 설명과 같다.</li>
<li>두 번째 예제에서는 모든 단어들이 공통된 부분이 없으므로, 가장 앞글자만 입력하면 된다.</li>
<li>세 번째 예제는 총 <code>15</code> 자를 입력해야 하고 설명은 아래와 같다.

<ul>
<li><code>word</code>는 <code>word</code>모두 입력해야 한다.</li>
<li><code>war</code>는 <code>war</code> 까지 모두 입력해야 한다.</li>
<li><code>warrior</code>는 <code>warr</code> 까지만 입력하면 된다.</li>
<li><code>world</code>는 <code>worl</code>까지 입력해야 한다. (<code>word</code>와 구분되어야 함을 명심하자)</li>
</ul></li>
</ul>

<p><a href="http://tech.kakao.com/2017/11/14/kakao-blind-recruitment-round-3/" target="_blank" rel="noopener">해설 보러가기</a></p>


> 출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function solution(words) {

words.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);

let r = 0, a, b, c;

words.forEach((w, i) => {
const right = words[i + 1] || words[i - 1];
const left = words[i - 1] || words[i + 1];

for (let i = 1, l = w.length; i <= l; i++) {
r++;
a = w.substring(0, i);
if (a != left.substring(0, i) && a != right.substring(0, i))
return;
}
});

return r;

}