BOJ

[C++] user input 숫자인지 문자인지 파악하기, map 자료형 카운터처럼 사용하기

민사민서 2023. 8. 15. 13:57

user input 숫자인지 문자인지

- stoi(), stol(), stod() 등의 함수 에러처리로 파악한다

bool check_number(string s) {
    try {
        stoi(s);
    } catch (const invalid_argument& e) { // 숫자 형태 아닐 때
        return false;
    } catch (const out_of_range& e) { // 표현 가능 범위 넘었을 때
        return false;
    }
    return true;
}

 

in python?

- unsigned 정수에 한해 isdigit() 함수를 사용 가능하다 ("123"은 true, "25kim6"은 false)

for _ in range(m):
    tmp = input()
    if tmp.isdigit():
        print(l[int(tmp)])
    else:
        print(d[tmp])

 

map counter 처럼 사용하기

- map 사용 시 할당안된 val은 일반 변수의 경우 0, 포인터 변수의 경우 NULL로 초기화되어있다

map<int, int> m;

for(int i=0; i<N; i++) {
    cin >> tmp;
    m[tmp]++;
}

 

in python?

collections 모듈의 Counter 클래스를 사용하면 됨

Counter( ) 생성자의 인자로 List, Dictionary, String 등등이 들어갈 수 있다. 딕셔너리 형태로 count 해주더라

from collections import Counter

cards = list(map(int,input().split()))
counter = Counter(cards) # Counter({10: 3, 3: 2, -10: 2, 6: 1, 2: 1, 7: 1}) 이런 형태

finds = list(map(int,input().split()))
for find in finds:
    print(counter[find], end=' ')

 

set 자료형 교집합, 대칭차집합 구하기

- <algorithm> 헤더 선언 필요, 정렬된 상태의 자료형에서 사용 가능 (set은 자동정렬, vector는 수동 정렬 필요)

- set_intersection() 함수와 std::inserter() 사용

set<string> d;
set<string> b;
set<string> db;

for(int i=0; i<N; i++) {
    cin >> name;
    d.insert(name);
}
for(int i=0; i<M; i++) {
    cin >> name;
    b.insert(name);
}

set_intersection(d.begin(), d.end(), b.begin(), b.end(), inserter(db, db.begin()));

 

- set_symmetric_difference() 함수와 std::inserter() 사용해 대칭차집합 구할 수 있음

- 차집합은 set_difference() 임

sort(v1.begin(), v1.end());
sort(v2.begin(), v2.end());

set_symmetric_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), inserter(res, res.begin()));

 

in python?

- & 기호 또는 set.intersection() 함수를 통해 가능 / ^ 기호 통해 가능

res = set_d & set_b # set_d.intersection(set_b)
# res = s1 ^ s2
for name in sorted(res):
    print(name)