※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 1431번 문제인 시리얼 번호이다.

문제는 아래 링크를 확인하자.

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

 

1431번: 시리얼 번호

첫째 줄에 기타의 개수 N이 주어진다. N은 50보다 작거나 같다. 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또는 숫자로만 이루어

www.acmicpc.net

문제에서 주어진 정렬기준을 잘 보고, 이 정렬기준을 순서대로 비교하는 비교함수를 작성하는 것으로 문제를 해결할 수 있다.

 

아스키코드에서 '0~9'보다 'A~Z'가 나중에 할당되어있으므로 3번에 주어진 사전식 정렬의 기준을 직접 구현할 필요는 없다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

string s[50];

bool comp(string s1, string s2) {
	if (s1.length() != s2.length()) return s1.length() < s2.length();
	int digitsum1 = 0, digitsum2 = 0;
	for (auto x : s1) {
		if ('0' <= x && x <= '9') digitsum1 += x - '0';
	}
	for (auto x : s2) {
		if ('0' <= x && x <= '9') digitsum2 += x - '0';
	}
	if (digitsum1 != digitsum2) return digitsum1 < digitsum2;

	return s1 < s2;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N; cin >> N;
	for (int i = 0; i < N; i++) cin >> s[i];
	sort(s, s + N, comp);

	for (int i = 0; i < N; i++) cout << s[i] << '\n';
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 11658 // C++] 구간 합 구하기 3  (0) 2022.03.03
[BOJ 24510 // C++] 시간복잡도를 배운 도도  (0) 2022.03.02
[BOJ 7596 // C++] MP3 Songs  (0) 2022.02.28
[BOJ 1449 // C++] 수리공 항승  (0) 2022.02.27
[BOJ 11381 // C++] Sequences  (0) 2022.02.26

+ Recent posts