-
[BOJ]백준 16923번: 다음 다양한 단어Problem Solving/BOJ(백준) 2019. 4. 26. 01:17
https://www.acmicpc.net/problem/16923
16923번: 다음 다양한 단어
다양한 단어란 모두 다른 알파벳 소문자로만 이루어진 단어를 의미한다. 예를 들어, "codeplus", "coding", "algorithm"은 다양한 단어, "baekjoon", "startlink"는 다양한 단어가 아니다. 다양한 단어 S가 주어졌을 때, 사전 순으로 S의 바로 다음에 오는 다양한 단어를 구해보자.
www.acmicpc.net
다양한 단어 ? -> 모두 다른 알파벳 소문자로만 이루어진 단어
ex. coding, algorithm, ijin(x)
단어가 주어졌을 때 사전 상으로 주어진 단어의 바로 다음에 오는 단어를 출력하는 문제이다
다음 단어를 찾는 알고리즘을 구현하는 문제이다
이 문제의 풀이방법은 두 가지로 나뉜다.
1. 모든 알파벳이 다 포함된 단어일 때
2. 아닐 때
2번의 경우에는, 사용하지 않은 알파벳 중에 알파벳 순으로 가장 빠른 알파벳이 가장 뒤에 오면 된다.
ex. algorithm -> algorithmb / abcef -> abcefd
1번의 경우일 때는 조금 까다로운데, 사전 상 다음에 오는 알고리즘을 잘 생각해야 한다.
예제 4번에 나오는 abcdefghijklmnopqrstuvwzyx의 경우를 보자
abcdefghijklmnopqrstuvwzyx의 다음 단어가 abcdefghijklmnopqrstuvx인 이유는 뭘까?
사전의 순서는 트리와 유사한 구조를 가진다
옆의 트리가 있다고 했을 때, 사전순으로
A -> AB -> ABC -> ABD -> AC -> ... -> AZ순이다.
잘 보면, 트리는 다음 두 가지 특징을 가진다
① 특정 자식은 조상노드와 알파벳이 겹치지 않아야 한다.
② 전위순회(루트-왼-오)로 트리를 탐색할 경우 사전순으로 탐색이 가능하다!!
우리는 단어의 바로 다음에 오는 단어를 알아내야 한다
따라서, abcdefghijklmnopqrstuvwzyx의 경우에는 뒤에서부터 탐색을 했을 때
1. x -> 이미 앞의 글자들(조상노드들)에 x의 뒤 순서인 알파벳(y, z)이 있기 때문에 바꿀 수 X
2. y, z도 동일
3. w의 경우에는 w의 뒤 순서인 (x, y, z)가 앞의 글자들에 있는지 탐색했을 때 없기 때문에 w를 x로 바꾸고 바로 다음 글자를 null로 바꾸면 다음에 오는 단어 완성
해당 코드에서 사용한 apb배열은, 각 알파벳에 해당하는 글자의 위치를 저장하기 위해 사용했다.
#include <cstdio> int apb[26], i = 0; //각 알파벳의 위치를 저장하기 위한 배열 char s[27]; //문자열을 입력받는 배열 int main() { while (scanf(" %c", &s[i]) != EOF) //한 글자씩 알파벳을 입력받는다 apb[s[i++] - 'a'] = i + 1; //apb 배열의 알파벳 위치에 입력받은 글자의 위치를 저장한다. //만약 acb라면, apb배열에는 {1, 3, 2, ...}가 저장됨 if (i < 26) { for (int j = 0; j < 26; j++) if (!apb[j]) { s[i++] = j + 'a'; printf("%s", s); return 0; } } else { for (int j = 25; j >= 0; j--) //문자열의 뒤부터 탐색 for (int k = s[j] - 'a' + 1; k < 26; k++) //해당 글자의 뒤 순서 글자들을 탐색 if (apb[s[j] - 'a'] < apb[k]) { //만약 뒤 순서의 알파벳의 위치가 현재 글자보다 앞에 위치한다면 s[j] = k + 'a'; //그 글자로 현재 글자를 교체하고 s[j + 1] = '\0'; //다음 글자를 null문자로 printf("%s", s); //출력 return 0; } } printf("-1"); return 0; }
'Problem Solving > BOJ(백준)' 카테고리의 다른 글
[BOJ]백준 17144번: 미세먼지 안녕! (440) 2019.06.23 [BOJ]백준 11559번: Puyo Puyo (424) 2019.05.17 [BOJ]백준 16917번 : 양념 반 후라이드 반 (398) 2019.04.26 [BOJ]백준 15804번: 저거 못 타면 지각이야!! (433) 2019.04.25 [BOJ]백준 11718번: 그대로 출력하기 (427) 2019.02.06