본문 바로가기
문제해결/백준

백준 29730번 (C++)

by wafla 2024. 1. 7.

https://www.acmicpc.net/problem/29730

 

29730번: 임스의 데일리 인증 스터디

취업 준비생 임스는 취업 준비를 하면서 그날그날 무슨 공부를 하였는지 기록하기 위해 데일리 인증이라는 스터디를 시작했다. 임스는 매일 무슨 공부를 하였는지 적으면서 몇 개의 규칙을 정

www.acmicpc.net

 

n개의 문자열이 주어지는데 boj.kr/문제번호 로 이루어진 문자열인 경우와 아닌 경우를 나누고 아닌 경우부터 정렬 후 출력하는 문제다.

 

문제번호가 1이상 30000이하라 boj.kr/123456789 같은 경우는 링크가 아닌 경우로 취급해야 하는줄 알았는데 그렇게하면 문자열 최대 길이가 100이라 정수 표현 범위를 넘어간다.

 

그래서인지 문자열이 boj.kr/로 시작하는 경우는 링크, 반대는 링크가 아닌 벡터에 넣고 문자열 길이가 짧은 순으로 정렬하도록 compare 함수를 작성해주면 된다.

 

가끔씩 이 문제처럼 공백이 들어간 문자열을 입력해야 하는 경우가 있다.

C++에서는 getline() 함수를 사용하면 되는데 그냥 getline() 함수만 사용하면 이 문제를 해결할 수 없다.

 

처음에 문자열의 개수를 cin을 통해 n개 입력 받고 엔터를 누르는데 cin은 '\n'을 버퍼에 남겨둔다.

하지만 getline()은 '\n'을 입력버퍼에서 가져와서 처리하기 때문에 빈 문자열이 입력되게 된다.

따라서 n을 입력 받고 cin.ignore()으로 버퍼의 '\n'를 지워줘야 한다.

 

C언어의 경우 fgets와 gets가 있는데 둘의 차이점도 알게 됐다.

fgets는 문자열을 받고 '\n' 뒤에 '\0'을 추가로 붙이고

gets는 '\n'을 '\0'으로 바꿔준다.

따라서 fgets를 사용하려면 문자열의 최대 길이가 1 만큼 더 커야 된다.

 

C++ 코드

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <string>
#include <deque>
#include <cmath>
#include <memory.h>
#include <stack>
#include <map>
#include <set>
#include <numeric>
#define X first
#define Y second
#define INF 0x3f3f3f3f
#define MOD 998244353
#define ll long long
#define int long long
#define pi pair<int,int>
#define T pair<int, pi>
using namespace std;
bool cmp(string a, string b)
{
	if (a.size() == b.size())
		return a < b;
	return a.size() < b.size();
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL), cout.tie(NULL);
	int n;
	cin >> n;
	vector<string> v1;
	vector<string> v2;
	for (int i = 0; i < n; i++)
	{
		string s;
		getline(cin, s);
		cout << s << '\n';
		if (s.size() > 7)
		{
			if (s.substr(0, 7) == "boj.kr/")
				v2.push_back(s);
			else
				v1.push_back(s);
		}
		else
			v1.push_back(s);
	}
	sort(v1.begin(), v1.end(), cmp);
	sort(v2.begin(), v2.end(), cmp);
	for (auto i : v1)
		cout << i << '\n';
	for (auto i : v2)
		cout << i << '\n';
}

'문제해결 > 백준' 카테고리의 다른 글

백준 11112번 (C++)  (0) 2024.09.20
백준 30446번 (C++)  (0) 2023.12.25