Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

05 우선순위큐 #5

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"files.associations": {
"vector": "cpp"
}
}
62 changes: 62 additions & 0 deletions 05_우선순위큐/11279.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#include <iostream>

using namespace std;

bool isEmpty(vector<int> & heap){
return heap.size()==1;

}

void push(int x, vector<int>&heap){
int idx=heap.size();
heap.push_back(x);
while(heap[idx], heap[idx/2]){
swap(heap[idx], heap[idx/2]);
idx/=2;
}
return;
}

int pop(vector<int> &heap){
int itemp=heap[1];

heap[1]=heap[heap.size()-1];
heap.pop_back();

int size=heap.size();
int parent=1, child=2;
while(){
if(child+1<size&&heap[child+1]>heap[child]){
child++;
}
if(child[])
}

}

int main()
{
cout<<"Hello World";

int n, x;
cin>> n;
while(n--){
cin>>x;
if(x==0){
//head이 비어있는지 확인
if(isEmpty(heap_vec)){
cout<<"0\n";
}
else{
cout<<pop(heap_vec)<<"\n";

}
}
//x가 0이 아닌 자연수일경우
else{

}
}

return 0;
}
38 changes: 38 additions & 0 deletions 05_우선순위큐/14235.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#include <iostream>
#include <queue>

using namespace std;

int main()
{
priority_queue<int> pq;
vector<int> ans;
int n, a;
int k;
cin>>n;
for(int i=0; i<n; i++){
cin>>k;
if(k!=0){//a값을 입력받는 경우
a=k;
for(int j=0; j<a; j++){
cin>>k;
pq.push(k);
}
Comment on lines +14 to +20

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2. k와 a를 다른 변수로 사용하는 게 좋아요! k로 입력받았으면 반복문의 범위를 for (int j=0; j<k; j++)로 두고 반복문 안에서 a를 입력받아 pq에 삽입해주세요~!

}
else{
if(!(pq.empty())){
ans.push_back(pq.top());
pq.pop();
}
else{
ans.push_back(-1);
}
}
}

for(int i=0; i<ans.size(); i++){
cout<<ans[i]<<"\n";
}
Comment on lines +33 to +35

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

연산을 진행하며 vector에 결과값을 저장해서 한번에 출력하는 지금의 방식도 좋지만 하나하나 진행할동안 바로 출력해줘도 좋을 것 같아요!


return 0;
}
25 changes: 25 additions & 0 deletions 05_우선순위큐/2075.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#include <iostream>
#include <queue>

using namespace std;

int main()

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3. 문제 조건에 맞게 잘 구현해주셨네요!

{
ios_base::sync_with_stdio(false);//이거 안해줬더니 시간 초과
cin.tie(0);

int n, k;
cin>>n;

priority_queue< int, vector<int>, greater<int> > pq;
for(int i=0; i<n*n; i++){
cin>>k;
pq.push(k);
if(pq.size()>n){//pq에서 안빼줬더니 메모리 초과 발생했었다.
pq.pop();
}
}
cout<<pq.top();

return 0;
}
70 changes: 70 additions & 0 deletions 05_우선순위큐/2607.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
#include <iostream>
#include <vector>

using namespace std;
const int NUM_CHARS = 26;//알파벳 개수

/*
* 원본 단어와의 차이의 개수를 센다.
*/

/*
* [비슷한 단어]
*
* 단어가 같은 구성일 조건
* 1. 두 개의 단어가 같은 종류의 문자로 이루어짐
* 2. 같은 문자는 같은 개수만큼 있음
*
* 비슷한 단어의 조건
* 1. 한 단어에서 한 문자를 더하거나, 빼면 같은 구성이 됨
* -> 두 단어에서 다른 문자의 개수가 총 1개
* 2. 한 단어에서 한 문자를 바꾸면 같은 구성이 됨
* -> 두 단어에서 다른 문자의 개수가 총 2개
* -> !주의! 이때, 두 단어의 길이가 같아야 함 cf) doll | do
*/

// 각 알파벳의 개수 세기
void countFreq(string word, vector<int> &freq) {//참조변수로 벡터 이용
for (int i = 0; i < word.length(); i++) {
freq[word[i] - 'A']++; //알파벳 위치를 A부터 index 0으로 두고 저장하기
}
}

int countDiff(string word, vector<int> original_freq) {
vector<int> freq(NUM_CHARS, 0);
int diff = 0; // 원본 단어와의 차이

countFreq(word, freq); // 각 알파벳의 개수 세기

// 원본 단어와 다른 알파벳 개수 구하기
for (int i = 0; i < NUM_CHARS; i++) {
diff += abs(original_freq[i] - freq[i]);//알파벳 인덱스의 개수가 서로 다르면 다른만큼 차 증가
}
return diff;
}

int main() {
int N, ans=0;
string original;
// 입력
cin >> N;
cin >> original;
vector<int> original_freq(NUM_CHARS, 0);

// 연산
countFreq(original, original_freq);

for (int i = 1; i < N; i++) {
string word;
cin >> word;

int diff = countDiff(word, original_freq);//입력받은 단어와 original 단어의 다른 알파벳 개수 구하기
// 비슷한 단어 세기
if (diff == 0 || diff == 1 || diff == 2 && original.length() == word.length()) {//diff가 0,1거나 2면서 두 단어의 길이가 같은경우
ans++;//비슷한 단어로 취급
}
}
// 출력
cout << ans;
return 0;
}