컴굥일지

[BOJ/백준 1431][C++] 시리얼 번호 본문

알고리즘/코테 문제

[BOJ/백준 1431][C++] 시리얼 번호

gyong 2022. 2. 7. 01:32
반응형

문제

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

 

문제 내용

시리얼 번호는 숫자와 알파벳 대문자로 이루어져 있다.
시리얼을 입력받아서 기준대로 출력하는 프로그램을 짜면 된다.

이때 A가 먼저 올 기준은 아래와 같다.

1. A와 B의 길이가 다르면, 짧은 것이 먼저 온다.
2. 만약 서로 길이가 같다면, A의 모든 자리수의 합과 B의 모든 자리수의 합을 비교해서 작은 합을 가지는 것이 먼저온다. (숫자인 것만 더한다)
3. 만약 1,2번 둘 조건으로도 비교할 수 없으면, 사전순으로 비교한다. 숫자가 알파벳보다 사전순으로 작다.

 

문제 풀이

문제에서 원하는 기준대로 정렬해주기 위해 sorting()함수를 새로 만들어주었다.

코드와 주석을 읽으면 이해가 될 것이다.

 

코드

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

bool sorting(string A,string B) {
	// 1. 길이 비교
	if (A.length() != B.length()) return A.length() < B.length();

	// 2. 숫자 합 구하기
	int asum = 0, bsum = 0;
	for (int i = 0; i < A.length(); i++) {
		if ('0' <= A[i] && A[i] <= '9') asum += A[i] - '0';
		if ('0' <= B[i] && B[i]<= '9') bsum += B[i] - '0';
	}
	if (asum != bsum) return asum < bsum;

	// 3. 사전순 비교
	return A < B;
}


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

	//입력
	int n; string tmp;
	cin >> n;
	vector<string>v(n);

	for (int i = 0; i < n; i++) cin >> v[i];

	//문제 해결
	sort(v.begin(), v.end(), sorting);

	//결과 출력
	for (int i = 0; i < n; i++) cout << v[i] << '\n';

	
}

 

문제 코드 설명

1) 문제 해결

sort()함수를 사용하여 배열을 정렬했다.
이때 세번째 인자에 정렬 기준 함수의 이름을 넣어서 문제에서 원하는 기준대로 정렬하게 했다.

반응형
Comments