728x90
신고 결과 받기
https://school.programmers.co.kr/learn/courses/30/lessons/92334
#include <bits/stdc++.h>
using namespace std;
map<string,int> ban_num;
map<string, vector<string>> mem;
vector<string> split(string s, string delimeter){
vector<string> ret;
int pos=s.find(delimeter);
string temp=s.substr(0,pos);
ret.push_back(temp);
s.erase(0, temp.size()+delimeter.size());
ret.push_back(s);
return ret;
}
vector<int> solution(vector<string> id_list, vector<string> report, int k) {
vector<int> answer;
// set<string> rp;
// for(string r:report){
// rp.insert(r);
// }
//중복 제거하기
sort(report.begin(), report.end());
report.erase(unique(report.begin(), report.end()), report.end());
for(string r:report){
vector<string> v=split(r," ");
string from = v[0]; //신고한 사람
string to=v[1]; //신고당한 사람
mem[from].push_back(to);//신고한 사람-신고당한사람
ban_num[to]++; //신고당한 사람 횟수 증가
}
vector<string> ban_mem;
for(int i=0;i<id_list.size();i++){ //신고된 사람 구하기
if(ban_num[id_list[i]]>=k) ban_mem.push_back(id_list[i]);
}
map<string,int> ans;
for(auto it:mem){
for(string s:it.second){
for(string b:ban_mem){
if(s==b) ans[it.first]++; //한 사람당 받을 메일개수 저장
}
}
}
bool ok=false;
for(string id:id_list){
for(auto a:ans){
if(id==a.first){
ok=true;answer.push_back(a.second); break;
}
}
if(!ok) answer.push_back(0);
ok=false;
}
return answer;
}
숫자 문자열과 영단어
https://school.programmers.co.kr/learn/courses/30/lessons/81301#
직접 replace하지말고 라이브러리 함수를 갖다 써야 실수가 없다.
코드
#include <bits/stdc++.h>
using namespace std;
map<string,int> mp;
int solution(string s) {
int answer = 0;
//맵 만들기
mp["zero"]=0; mp["one"]=1; mp["two"]=2; mp["three"]=3;
mp["four"]=4; mp["five"]=5; mp["six"]=6; mp["seven"]=7;
mp["eight"]=8; mp["nine"]=9;
//바꿔주기
string temp="";
for(auto it:mp){
long long pos=0;
while((pos=s.find(it.first))!=string::npos){
s.replace(pos, it.first.size(), to_string(it.second));
}
}
//직접 구현하는 것보다 replace 함수를 사용하자.
// for(int i=0;i<s.size();i++){
// if(isdigit(s[i])==0){ //문자이면
// while((isdigit(s[i]))==0){
// temp+=s[i++];
// if(mp[temp]){i--; break;}
// }
// answer = answer * 10 + mp[temp];
// temp="";
// }
// else answer=answer*10+ (s[i]-'0');
// }
answer=stoi(s);
return answer;
}
replace(바꾸고싶은 문자 시작위치, 바꾸고싶은 문자 크기, 새롭게 바꿀 문자);
반환형은 size_t 또는 long long으로 잡아야 편하다.
신규 아이디 추천
코드
#include <bits/stdc++.h>
using namespace std;
string solution(string new_id) {
string an = "";
for(int i=0;i<new_id.size();i++){
char c=new_id[i]; //number
//1. 대문자이면 소문자로 바꾸기
if('A'<=c && c<='Z'){
c+=32; an+=c;
}
else if('a'<=c && c<='z') an+=c;
//2. 그 외 모든 문자 제거하기
else if(('0'<=c && c<='9') || c=='_' || c=='-' || c=='.') an+=c;
else;
}
//3. 연속..인거 .으로 치환
long long pos=0;
while((pos=an.find("..")) != string::npos){
an.replace(pos, 2, ".");
}
//처음과 끝에 나타나면 제거
while(an[0]=='.') an.erase(0,1);
cout << an<<"\n";
while(an[an.size()-1]=='.') an.erase(an.size()-1,1);
//빈문자열이라면 "a" 대입
if(an.size()==0) an="a";
//16글자 이상이면 15개 제외하고 제거
else if(an.size()>=16){
an.erase(15); //인덱스 15부터(16글자부터 제거)
while(an[an.size()-1]=='.') an.erase(an.size()-1);
}
if(an.size()<=2){
while(an.size()!=3){
an+=an[an.size()-1];
}
}
return an;
}
숫자는 0부터 9까지이다!
키패드 누르기
https://school.programmers.co.kr/learn/courses/30/lessons/67256
코드
#include <bits/stdc++.h>
using namespace std;
string solution(vector<int> numbers, string hand) {
string answer = "";
int l=10; int r=12; //처음값
//숫자마다 위치 정하기
for(int n:numbers){
if(n==1||n==4||n==7) {
answer+="L"; l=n;}
else if(n==3||n==6||n==9){
answer+="R"; r=n;
}
else{ //2,5,8,0일때
if(n==0) n=11;
int rtemp=abs(r-n)/3+abs(r-n)%3; //움직이는 횟수 구하기
int ltemp=abs(l-n)/3+abs(l-n)%3;
if(rtemp>ltemp){
answer+="L"; l=n;
}
else if(rtemp<ltemp){
answer+="R"; r=n;
}
else { //같으면 오른손 또는 왼손으로
if(hand=="right"){
r=n; answer+="R";
} else{
l=n; answer+="L";
}
}
}
}
return answer;
}
크레인 인형뽑기
코드
#include <bits/stdc++.h>
using namespace std;
vector<int> bv[104];
int solution(vector<vector<int>> board, vector<int> moves) {
int answer = 0;
for(int i=0;i<board.size();i++){
for(int j=0;j<board.size();j++){
if(board[i][j]==0) continue;
bv[j+1].push_back(board[i][j]);
}
}
// for(int i=1;i<=board.size();i++){
// for(int b:bv[i]) cout << b << " ";
// cout << "\n";
// }
stack<int> stk;
for(int i=0;i<moves.size();i++){
int num=moves[i];
cout <<"num:" << num<<":";
for(int j=0;j<bv[num].size();j++){
if(bv[num][j]==0) continue;
if(stk.size() && stk.top()==bv[num][j]){
stk.pop(); answer+=2;
}
else stk.push(bv[num][j]);
bv[num][j]=0;
break;
}
}
return answer;
}
문제를 잘 읽자
더 쉬운 풀이
#include <bits/stdc++.h>
using namespace std;
vector<int> bv[104];
int solution(vector<vector<int>> board, vector<int> moves) {
int answer = 0;
for(int i=0;i<board.size();i++){
for(int j=0;j<board.size();j++){
if(board[i][j]==0) continue;
bv[j+1].push_back(board[i][j]);
}
}
stack<int> stk;
for(int i=0;i<moves.size();i++){
int num=moves[i]-1;
for(int j=0;j<board.size();j++){
if(board[j][num]==0) continue;
else{
if(stk.size() && stk.top()==board[j][num]){
stk.pop(); answer+=2;
}
else stk.push(board[j][num]);
board[j][num]=0;
break;
}
}
}
return answer;
}
728x90
'알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글
1715번: 카드 정렬하기 (0) | 2023.05.22 |
---|---|
프로그래머스 문제 모음 (0) | 2023.03.21 |
프로그래머스 문제풀이 모음 (4) | 2023.03.20 |
프로그래머스 문제 풀이 모음 (0) | 2023.03.19 |
프로그래머스: 입국 심사 (2) | 2023.03.18 |