문자열 처리

joon_1592·2021년 1월 6일
0

알고리즘

목록 보기
8/51

파이썬은 str 객체를 통해 문자열을 지원한다.
알고리즘문제에서 문자열 관련 문제들은 어렵지 않은데, C스타일로 짜다보면 머리가 어질어질해진다. 왜 코드가 심각하게 길어지는것같지? 하면 90%정도 이미 함수, 메소드가 있다고 생각하면 된다.

1. 문자열 slicing

[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;
}

2. substring

파이썬의 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)
profile
공부용 벨로그

0개의 댓글