알고리즘 (출제자 Benjamin)
- 정렬
- 문자열
문제 해설
알고리즘 문제를 해결하기 위해서 문제를 풀 때 무작정 문제를 읽고 코딩을 시작하는 것보다는, 무엇을 고려해서 문제를 해결해야 하는지를 먼저 파악하는 연습이 필요합니다. 이 문제의 요구 사항을 정리해보면 아래와 같습니다.
- 단어들을 문제에서 주어진 기준에 따라서 정렬하기
- 앞에서
번째에 위치한 단어를 찾기
이렇게 항상 무엇을 해야 하는지를 먼저 파악한 다음, 어떻게 구현을 할 수 있을지를 고민해보는 것이 효율적으로 문제를 해결하는 데 많은 도움이 될 것입니다.
여러 기준에 따라 정렬하기
문제에서 요구하는 정렬의 기준이 다소 복잡합니다. 단어들을 길이 순으로 정렬한 뒤, 다시 사전 순으로 정렬을 하라고 합니다. 이렇게 여러 기준을 한 번에 고려해서 정렬을 하려면 어떻게 해야 할까요?
여기서 소개드릴 방식은 기본적으로 여러 개의 원소가 있는 배열을 정렬하는 방식을 활용하는 것입니다. 배열 단위로 정렬을 할 때는 우선 가장 앞에 있는 원소를 기준으로 오름차순으로 정렬한 뒤, 같은 원소가 있다면 그 다음 원소를 기준으로 정렬을 하는 방식을 사용합니다. 이전 조건(첫 번째 원소를 기준)을 만족하지 못하는 경우에만 다음 조건(그 다음 원소 기준)을 이용해서 정렬을 한다는 점에서, 문제의 정렬 방식을 적용해볼 수 있을 것 같습니다. 아래 코드와 같이 [단어의 길이, 단어] 의 배열을 만들어서 정렬을 해줄 수 있습니다.
words = []
for i in range(N):
word = input()
length = len(word)
words.append([length, word])
words.sort()파이썬의 lambda 함수를 이용하면 조금 더 간결한 코드를 짤 수도 있습니다.
words = []
for i in range(N):
word = input()
words.append(word)
words.sort(key = lambda x : (len(x), x))위의 기준에 따라 정렬을 잘 했다면, 이제 앞에서 번째에 위치한 단어를 출력하는 것은 단순히 정렬된 문자열에서
번째 인덱스에 위치한 값을 출력하는 것만으로 가능합니다.
단어의 최대 길이를 라고 했을 때, 총
시간에 문제를 해결할 수 있습니다.
이 100만으로 크므로,
시간에 동작하는 정렬을 사용해야 시간 안에 통과할 수 있다는 점을 유의합시다.
코드(Python/C++)
import sys
input = sys.stdin.readline
N, K = map(int, input().split())
words = []
for i in range(N):
word = input().rstrip()
words.append(word)
words.sort(key = lambda x : (len(x), x))
print(words[K - 1])#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int N, K;
cin >> N >> K;
vector<string> words(N);
for (string& word : words) cin >> word;
sort(words.begin(), words.end(), [&](string& a, string& b) {
if (a.size() != b.size()) return a.size() < b.size();
return a < b;
});
cout << words[K - 1];
return 0;
}// Run by Node.js
const readline = require('readline');
let rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let count = 0
let N, K;
let words = [];
let inputs = [];
rl.on('line', function(line){
count += 1
inputs.push(line.trim());
const [n, k] = inputs[0].split(' ').map(Number);
N = n;
K = k;
if (count === N + 1){
rl.close();
}
})
rl.on('close', function() {
words = inputs.slice(1);
words.sort((a,b) => {
if (a.length === b.length) {
if (a > b) return 1
else if (a < b) return -1
else return 1
} else {
return a.length - b.length
}
});
console.log(words[K-1]);
})