파이썬은 str 객체를 통해 문자열을 지원한다.
알고리즘문제에서 문자열 관련 문제들은 어렵지 않은데, C스타일로 짜다보면 머리가 어질어질해진다. 왜 코드가 심각하게 길어지는것같지? 하면 90%정도 이미 함수, 메소드가 있다고 생각하면 된다.
[BOJ 11656] 접미사 배열
앞 문자부터 하나씩 잘라낸 후 그 문자열을 정렬하여 출력하는 문제이다.
파이썬의 경우 문자열 slicing으로 리스트에 넣은 뒤, 리스트를 정렬하여 출력한다.
# python code
s = input()
L = []
for i in range(len(s)):
L.append(s[i:])
L.sort()
for x in L:
print(x)
C++은 string 클래스의 substr() 메소드를 이용하여 파이썬의 슬라이싱과 같은 기능을 하게 한다. 정렬하는 리스트는 vector로 간단히 구현한다.
// C++ code
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
//freopen("input.txt", "r", stdin);
string s;
vector<string> v;
cin >> s;
for (int i = 0; i < s.length(); i++) {
v.push_back(s.substr(i));
}
sort(v.begin(), v.end());
for (int i = 0; i < v.size(); i++) {
cout << v[i] << "\n";
}
return 0;
}
파이썬의 str 클래스는 find 메소드를 통해 부분문자열이 있는지 확인할 수 있다. c++에서도 string 클래스에서 find 메소드로 동일한 역할을 한다.
s1 = 'make america greate again'
s2 = 'eat'
s3 = 'apple'
print(s1.find(s2)) # 15
print(s1.find(s3)) # -1
s1에서 s2가 있다면 그 시작 인덱스를 반환한다. 없다면 -1을 반환한다.
s1에서 greate에 eat가 있으므로 시작 인덱스는 15이다.
s1에서 apple은 없으므로 -1을 반환한다.
[BOJ 5555] 반지
반지에 새겨진 문자열에 찾고자 하는 문자열이 있는지 확인하는 문제이다.
단, 반지는 문장이 이어져 있으므로 주어진 문자열을 이어붙여서 확인한다.
target = input()
N = int(input())
ans = 0
for _ in range(N):
ring = input()
ring += ring
if ring.find(target) != -1:
ans += 1
print(ans)