우선 문자열처리가 C++에서 어렵다.
나는 아직 stringstream에 익숙하지 않아서 어려웠다.
stringstream만 익숙한 사람이라면 무리없이 풀 것이다.
https://programmers.co.kr/learn/courses/30/lessons/92335
#맞는 풀이
#include <bits/stdc++.h>
using namespace std;
bool IsPrime(long long num){
if(num == 2)return true;
if(num == 1 ||num % 2 == 0) return false;
for(long long i = 3; i<(long long)sqrt(num)+1; i += 2){
if(num % i == 0){
return false;
}
}
return true;
}
//n을 k진법으로 바꿈.
string Convert(int n, int k){
int div = n / k;
int r = n % k;
if(div != 0){
return Convert(div, k) + to_string(r);
}else{
return to_string(r);
}
}
//n을 k진법으로 바꿈
int solution(int n, int k) {
string target = k == 10 ? to_string(n) : Convert(n,k);
stringstream ss(target);
//소수의 개수
int answer = 0;
//필터링을 담을 문자열
string val;
//구분자를 0으로 하여 ss에서 split함
while(getline(ss, val, '0')){
//0이 연속으로 나왔을 때는 val이 비어있음 => 다음 것 조사
if(val.size() == 0){continue;}
if(IsPrime(stol(val))){
answer ++;
}
}
return answer;
}
1. 진법 변환
이 주제는 정말 많이 나오면서 많이 안나오는데 쉽게 생각하자면
div가 0이 나올때까지 나누는 것이다.
0이 나올 때까지 나온 나머지가 곧 진법 수이다.
//n을 k진법으로 바꿈.
string Convert(int n, int k){
int div = n / k;
int r = n % k;
if(div != 0){
return Convert(div, k) + to_string(r);
}else{
return to_string(r);
}
}
이거 자체를 기억해두는 것도 나쁘진 않다. 다만 0까지 나눴을 때 왜 그게 k진수가 되는지는 알고 있자.
2. 0을 구분자로 구분하기
여기에서 0을 경계로 string을 나누는데
getline(ss, val, '0')의 뜻을 알아보자
**우선 getline은 입력을 받아올 때 많이 썼다.
string s;
getline(cin, s);
이런식으로 cin(입력)을 s에 넣는 식이었다.
하지만 아래와 같이 stringstream을 쓸 때에는 조금 모양이 달라진다.
즉, ss 중에서 조건에 맞는('0') 값을 val에 넣는다는 말이다.
엥 근데... 뭘 return하길래.. 계속 while문에 쓸 수 있는거지???
해당 stream을 다시 반환한다.
??? 아니 근데.. 계속 뒤에거를 읽던데??
똑같은 것을 반환하면 계속 앞에 것만 읽어야할 것 아니야??
하지만 처리방식이 아래와 같다.
getline자체는 eof를 만나면 멈추고
stringstream이 delimiter를 만날 때까지 extract 되고 해당 읽어들인 스트림은 없어진다는 뜻이다.
즉, 다시 똑같은 것을 반환받더라도 없어진 스트림을 반환받는 것이다.
이러한 것은 문자열 처리에 유용하니
while문도 통째로 기억하는 것이 좋다.
while(getline(ss, val, '0')){
...
}
'문제풀이(Problem Solving)' 카테고리의 다른 글
프로그래머스 카카오, 신규 아이디 추천 C++ [CPP] ★★★★ (0) | 2022.05.08 |
---|---|
프로그래머스 카카오, 신고 결과 받기 C++ [CPP] ★★ (0) | 2022.05.05 |
백준, BOJ, 16571번, 알파 틱택토 C++ [CPP] ★★★ (0) | 2022.05.03 |
백준, BOJ, 12100번, 2048 C++ [CPP] ★★★★ (0) | 2022.05.01 |
백준, BOJ, 2110번, 공유기 설치 C++ [CPP] ★★ (2) | 2022.04.10 |