Link https://www.acmicpc.net/problem/6324
소스결과 1996 KB / 0 ms
출처 Baekjoon
언어 C++ 17
분류 문자열처리
설명
URL이 주어질 때 URL을 프로토콜, 호스트, 포트, 경로 4개로 분해해서 보여주는 문제.
처음 시도 했을 때로부터 무려 5개월만에 해결한 문제. 출력 형식을 맞추는게 생각보다 까다로웠다.
보이는 대로 처리 하면 바로 틀렸습니다가 나오는데. 프로토콜이나 호스트에 대해서는 어떤 예외 처리도 안해줘야 하지만, 포트와 경로에 대해서는 예외 처리가 필요하다.
포트 검색을 위해 콜론(:), 경로는 슬래시(/) 위치를 검색 한다. 둘 다 존재하는 경우 중, 콜론의 위치가 슬래시보다 뒤에 있을 때가 유일한 예외다.
위의 경우에 대해서는 포트는 존재하지 않는 것으로 판별 해야한다.
문제 처리를 위해 문자 배열을 사용하는 것이 아닌 string 클래스를 이용해 문자열 처리를 하는 경우 substr 조건 위치를 잘 조절 해야했다.
알고리즘
1. URL을 받아온다.
2. 각각의 구분 기호 :// , : , / 위치를 구한다.
3. 콜론 위치가 경로 위치보다 뒤인 경우를 제외하고는 구해진 위치를 기준으로 substr함수를 통해 잘라낸다.
4. 3의 예외 사항인 경우에 대해서는 포트번호는 <default>로 해야한다.
5. 출력 조건에 맞추어 출력한다.
소스코드
#include <iostream>
#include <string>
using namespace std;
const string protocolTag = "://";
void func(string& str, int number)
{
string protocol, host, port, path;
int protocolPos = str.find(protocolTag);
protocol = str.substr(0, protocolPos);
int portPos = str.find(":", protocolPos + 3);
int pathPos = str.find("/", protocolPos + 3);
if (portPos == string::npos && pathPos == string::npos)
{
host = str.substr(protocolPos + 3);
port = path = "<default>";
}
else if (portPos != string::npos)
{
host = str.substr(protocolPos + 3, portPos - protocolPos - 3);
if (pathPos != string::npos && portPos < pathPos)
{
port = str.substr(portPos + 1, pathPos - portPos -1);
path = str.substr(pathPos + 1);
}
else if (pathPos != string::npos && portPos > pathPos)
{
host = str.substr(protocolPos + 3, pathPos - protocolPos - 3);
port = "<default>";
path = str.substr(pathPos + 1);
}
else
{
port = str.substr(portPos + 1);
path = "<default>";
}
}
else
{
host = str.substr(protocolPos + 3, pathPos - protocolPos - 3);
path = str.substr(pathPos+1);
port = "<default>";
}
cout << "URL #" << number << '\n';
cout << "Protocol = " << protocol << '\n';
cout << "Host = " << host << '\n';
cout << "Port = " << port << '\n';
cout << "Path = " << path << '\n';
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
string input;
cin >> input;
func(input, i + 1);
if (i != n - 1)
cout << endl;
}
return 0;
}
'Algorithm > 문자열 처리' 카테고리의 다른 글
Baekjoon 10353 큰 수 A+B (2) (0) | 2019.03.08 |
---|---|
Baekjoon 16944 강력한 비밀번호 (0) | 2019.03.08 |
BaekJoon 2864 5와 6의 차이 (0) | 2019.01.29 |
BaekJoon 1157 단어 공부 (0) | 2019.01.17 |
BaekJoon 1475 방번호 (0) | 2019.01.17 |