티스토리 뷰
안녕하세요 감자 코딩 & 감자 개발자입니다. 이번에 살펴볼 문제는 11656번 문제입니다. 바로 접미사 배열을 활용하는 문제인데요. 문자열을 토큰을 잘 잘라내어 정렬까지 할 수있냐하는 문제입니다.
문제 링크
https://www.acmicpc.net/problem/11656
접미사 배열 성공
시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 4372 2701 2192 63.555%
문제
접미사 배열은 문자열 S의 모든 접미사를 사전순으로 정렬해 놓은 배열이다.
baekjoon의 접미사는 baekjoon, aekjoon, ekjoon, kjoon, joon, oon, on, n 으로 총 8가지가 있고, 이를 사전순으로 정렬하면, aekjoon, baekjoon, ekjoon, joon, kjoon, n, on, oon이 된다.
문자열 S가 주어졌을 때, 모든 접미사를 사전순으로 정렬한 다음 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 문자열 S가 주어진다. S는 알파벳 소문자로만 이루어져 있고, 길이는 1,000보다 작거나 같다.
출력
첫째 줄부터 S의 접미사를 사전순으로 한 줄에 하나씩 출력한다.
예제 입력 1
baekjoon
예제 출력 1
aekjoon
baekjoon
ekjoon
joon
kjoon
n
on
oon
이번문제는 얼마나 내가 C++ 잘 함수를 알고있느냐에 따라 구현하는 시간도 달라질것이고, 푸는 방식도 달라진다고 생각을 했습니다. 그럼 바로 문제풀이에 들어가보죠.
문제 해결 방식
baekjoon aekjoon ekjoon kjoon joon oon on n
이것을 사전순으로 정렬을 하게 된다면 ?
aekjoon
baekjoon
ekjoon
joon
kjoon
n
on
oon
이형태가 나와야합니다. 그렇다면? 사전순으로 정렬하려면 맨앞에 있는 값에 따라 a-z까지의 순으로 정렬이 될수 있겠군요.
3)입력받은값들을 저는 C++에 함수인 strsub함수를 사용하려고 합니다.
strsub(a,b)함수에 대해서 간략히 말씀드리자면
a = 시작하는 문자열 인덱스
b = 마지막 문자열 인덱스
이렇게 문자열을 내가 원하는대로 잘라낼 수 있습니다.
지금 우리가 잘라내는 형식으로 자르기 위해서는
* 시작지점 0으로 부터 string size만큼(값 변동)
* 마지막 지점 string size만큼(값 변동X) 이 되어야합니다.
이렇게 잘라진값들을 이제 string 배열에다가 저장을 하였습니다.
4) 그리고 이제 사전순으로 정렬을 해보아야겠죠? 어떻게 하시고싶으신가요? 저는 c++에서 제공하는 sort함수를 사용하려고 합니다. 뭐 직접 구현해도 되지만, C++에서 편하게 제공해주는게 있기때문에 사용을 하였구요. 직접 정렬을 해주셔도 됩니다만, 전 편하게 가겠습니다.
sort(a,b)함수에 대해서 간략히 말씀드리면
a =시작점, 시작하는 문자열 주소(포인터점)
b = 도착점, 시작하는 문자열 주소 + 입력받은 문자열의 개수 로 지정을 해주게 되면 현재시작하는 주소점에서 부터 입력받은 문자열을 비교하여 사전순으로 정렬하게 됩니다. 저는 string 배열을 만들어서 그 안에 저장하였습니다.
5) 마지막으로 정렬된 배열을 출력해주면 문제풀이는 끝이나게됩니다. 쉽쥬?
코드 리뷰
//
// 11656(접미사배열).cpp
// beakjoon_algorithm
//
// Created by kgh on 22/12/2018.
// Copyright © 2018 kgh. All rights reserved.
//
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main(void){
string str;
string result[1000];
cin >> str;
// substr을 사용하여 하나씩 늘려가면서 접미사 저장
for(int i=0; i<str.size(); i++){
result[i] = str.substr(i,str.size());
}
// #include <algorithm>, sort()함수의 첫번째 파라미터 = 시작점 포인터지점(주소) , 두번째 파라미터 = 도착지 포인터지점(주소)+문자열개수(str.size)
sort(result,result+str.size());
// 저장된 접미사값 sort된값을 사용하여 정렬
for(int i=0; i<str.size(); i++){
cout << result[i] << endl;
}
}
substr()함수로 접미사를 저장시켜주고, sort()함수로 사전순으로 정렬을 해주고, 마지막으로 출력까지 시켰습니다. C++함수를 얼마나 아느냐에따라 구현시간이 달라질 수있었던 문제였고, C언어에서 자주 쓰이던 string Tokenizer를 C++에서는 쉽게 사용이 가능하다고 생각을 했습니다. C,C++은 항상어렵습니다
이상 감자 코딩 & 감자개발자 11656접미사 배열 리뷰를 마치겠습니다.
감사합니다 :)
'Algorithm' 카테고리의 다른 글
[알고리즘] 백준 1707 이분 그래프 (0) | 2019.04.11 |
---|---|
[알고리즘] 백준 알고리즘 1463 1로 만들기(Top-Down/Bottom-Up, 피보나치수열) C++ (0) | 2018.12.26 |
[알고리즘] 백준알고리즘 10824번 네 수 (0) | 2018.12.22 |
[알고리즘] 백준 알고리즘 11655번 ROT13 (0) | 2018.12.22 |
[알고리즘] 백준 알고리즘 2743 단어 길이 재기 (0) | 2018.12.22 |
- Total
- Today
- Yesterday
- 텐서플로우
- 학교
- 백준알고리즘
- 머신러닝
- 노드
- C langauge
- 감자개발자
- 복습
- db
- BFS
- 코드엔진
- 리버싱
- TensorFlow
- 백준
- programming
- MVC
- 감자코딩
- 알고리즘
- 안드로이드
- node.js
- 개발하는 관광이
- C언어
- Controller
- 스프링
- Android
- 프로그래밍
- Algorigm
- Spring
- 초보자를 위한 C언어 300제
- node
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |