본문 바로가기
Programming/C++ - 백준

[백준] 1431번 : 시리얼 번호 | vector 구조체 (C++)

by 지구코드 2024. 3. 18.
반응형

문제


풀이

'구조체를 이용한 벡터' 풀이했다. 

 

비슷한 정렬 문제 풀이를 아래에 첨부한다. 아래는 vector에 구조체를 넣어 같은 방식으로 풀이한 정렬 문제이다.

 

 

[백준] 10825번 : 국영수 (C++)

문제 풀이 vector에 구조체를 넣어 풀이했다. 아래는 array에 구조체를 넣어 풀이한 문제이다. 또한, vector을 이용한 sort 함수와 사용자 지정 compare을 자세히 설명해놓았으니 이 부분이 어렵다면 읽

jigoo-log.tistory.com

 

array에 구조체를 넣어 풀이한 정렬 문제이다.

또한, vector을 이용한 sort 함수와 사용자 지정 compare을 자세히 설명해놓았으니 이 부분이 어렵다면 읽어보는걸 추천한다! 👍👍

 

 

[백준] 11650번 : 좌표 정렬하기 | Sort 함수와 Compare & Array와 Vector 풀이 (C++)

문제 풀이 '이차원 벡터'와 '이차원 배열'로 풀이했다. 총 세 가지의 풀이로 문제를 해결했다! [ '이차원 벡터' 풀이 ] 1. 이차원 벡터 선언 vector v; // 이차원 벡터 선언 2. 이차원 벡터 요소 입력 for

jigoo-log.tistory.com

 

 1. vector를 선언하기 위한 구조체(struct) 생성

 

struct serial {		// vector 구조체 생성
	string str;
	int jarisu = 0, length = 0;
};

 

 2. 구조체 vector 선언

 

	vector<serial> v;	// 구조체 vector 선언

 

 3. 구조체 이름 설정, 구조체의 각 값에 입력 값 저장 

자릿수를 구해서 저장하는게 중요!

 

	for (int i = 0; i < n; i++) {
		cin >> s;
		l = s.length();

		serial code;    // 구조체의 이름 설정
		code.str = s;    // 구조체의 각 값에 입력받은 값 저장
		code.length = l;

		for (int k = 0; k < s.length(); k++) {	// 아스키코드 이용해서 자릿수 구하고 저장
			if (0 <= (s[k] - 48) && (s[k] - 48) <= 9) {
				j += (s[k] - 48);
			}
		}
		code.jarisu = j;

		j = 0;	// 꼭 자릿수 초기화시켜줘야 함

		v.push_back({ code.str, code.jarisu, code.length });    // vector에 붙임
	}

 

 4. 조건에 맞게 정렬

 

 // 사용자 지정 compare
bool compare(serial a, serial b) {	// (주의) a.str 뒤에 괄호 없음
	if (a.length == b.length && a.jarisu == b.jarisu) {	// 3. 길이와 자릿수가 모두 같다면,
		return a.str < b.str;	// 사전 순대로(아스키코드 순)
	}
	else if (a.length == b.length) {	// 2. 길이만 같다면,
		return a.jarisu < b.jarisu;	// 자릿수를 오름차순으로
	}
	else {
		return a.length < b.length;	// 1. 길이 순으로
	}
}

	sort(v.begin(), v.end(), compare);

 

5. 구조체 vector에서 str 값만 출력

 

	for (int i = 0; i < n; i++) {
		cout << v[i].str << "\n";
	}

 


코드

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

struct serial {		// vector 구조체 생성
	string str;
	int jarisu = 0, length = 0;
};

 // 사용자 지정 compare
bool compare(serial a, serial b) {	// (주의) a.str 뒤에 괄호 없음
	if (a.length == b.length && a.jarisu == b.jarisu) {	// 3. 길이와 자릿수가 모두 같다면,
		return a.str < b.str;	// 사전 순대로(아스키코드 순)
	}
	else if (a.length == b.length) {	// 2. 길이만 같다면,
		return a.jarisu < b.jarisu;	// 자릿수를 오름차순으로
	}
	else {
		return a.length < b.length;	// 1. 길이 순으로
	}
}

int main() {
	int n, j = 0, l;
	string s;
	vector<serial> v;	// 구조체 vector 선언

	cin >> n;

	for (int i = 0; i < n; i++) {
		cin >> s;
		l = s.length();

		serial code;    // 구조체의 이름 설정
		code.str = s;    // 구조체의 각 값에 입력받은 값 저장
		code.length = l;

		for (int k = 0; k < s.length(); k++) {	// 아스키코드 이용해서 자릿수 구하고 저장
			if (0 <= (s[k] - 48) && (s[k] - 48) <= 9) {
				j += (s[k] - 48);
			}
		}
		code.jarisu = j;

		j = 0;	// 꼭 자릿수 초기화시켜줘야 함

		v.push_back({ code.str, code.jarisu, code.length });    // vector에 붙임
	
		// cout << v[i].str << " " << v[i].jarisu << " " << v[i].length << "\n";   // 출력 확인용 코드
	}

	sort(v.begin(), v.end(), compare);

	for (int i = 0; i < n; i++) {
		cout << v[i].str << "\n";
	}

	return 0;
}

결과

 

 

1431번: 시리얼 번호

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

www.acmicpc.net

 

반응형

댓글