본문 바로가기
Algorithm/C++

[백준 1431] 시리얼 번호

by imagineer_jinny 2022. 9. 25.

1431번: 시리얼 번호 (acmicpc.net)

 

1431번: 시리얼 번호

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

www.acmicpc.net

 

 

배운것

- isdigit 함수: 숫자를 판단하는 함수

 

C언어 : <ctype.h>

C++ : <cctype>

 

int isdigit(int c);

매개변수로 들어온 char 타입이 10진수 숫자로 변경이 가능하면 0이 아닌 숫자(true), 아니면 0(false)를 반환하는 함수

 

- 문자 -> 숫자 변환

1) isdigit(문자)으로 숫자 될 수 있는지 확인

2) ex. 문자= 5 일 때

 

아스키코드상 수로 표시된 문자열은 다음과 같음

 

문자 5는 아스키코드 번호로 53임.

우리는 이걸 숫자 5로 바꿔주고 싶음

그럴 때

 

문자 - '0'(아스키코드로 48) 를 해주면

문자 5(아스키코드로 53) - '0'(아스키코드로 48) = 숫자 5

 

- 리턴값은 원본(a,b)가 아니라 비교해준 값을 그냥 리턴해주면 되나봄.

 

정답 코드

// Authored by : std-freejia
// Co-authored by : BaaaaaaaaaaarkingDog
// http://boj.kr/94521fc9def24d4bb4e041ec211b2ba4
#include <bits/stdc++.h>
using namespace std;

int n;
string st;
vector<string> v;

bool cmp (string& a, string& b){
  int lena = a.size(), lenb = b.size();
  int suma = 0, sumb = 0;
  if(lena != lenb) return lena < lenb;

  for(int i = 0; i < lena; i++){ // 숫자만 더한다. 
    if(isdigit(a[i])) suma += (a[i] - '0');
  }
  for(int i = 0; i < lenb; i++){
    if(isdigit(b[i])) sumb += (b[i] - '0');
  }
  if(suma != sumb) return suma < sumb;
  return a < b; // 사전순
}

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

  cin >> n;
  for(int i = 0; i < n; i++){
    cin >> st;
    v.push_back(st);
  }
  sort(v.begin(), v.end(), cmp);
  for(auto i : v) cout << i << '\n';
}

'Algorithm > C++' 카테고리의 다른 글

[백준 11652] 카드  (0) 2022.09.26
[백준 2573] 빙산  (0) 2022.09.26
[백준 10825] 국영수  (0) 2022.09.25
[백준 11650] 좌표 정렬하기  (0) 2022.09.23
[백준 15688] 수 정렬하기 5  (0) 2022.09.21

댓글