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)
반응형