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

[ 그리디 ] 9월 27일 #6

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": {
"queue": "cpp"
}
}
64 changes: 64 additions & 0 deletions 06_그리디/1213.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#include <iostream>

using namespace std;

int alphabet[26];
Copy link

Choose a reason for hiding this comment

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

P2
마찬가지로 알튜비튜에서는 정말 필요한 경우를 제외하고는 전역변수 사용을 지양하고 있습니다! 이 경우에는 메인 함수 안에서 배열을 선언하고 인자를 넘겨주면 충분히 문제를 해결할 수 있을 것 같아요!


bool isPossible(string &mid){
int count=0;

for(int i=0;i<26;i++){
if(alphabet[i]!=0){
if(alphabet[i]%2==1){
count++;
if(count>1){
return false;
Comment on lines +14 to +15
Copy link

Choose a reason for hiding this comment

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

팰린드롬을 만들 수 없는 조건을 잘 발견해주셨네요!👍

}
mid=i+'A';
}
}
}
return true;
}

string makePd(string mid){
string ans;
for(int i=0;i<26;i++){
for(int j=0;j<alphabet[i]/2;j++){
ans+=i+'A';
}
}
ans+=mid;
for(int i=25;i>=0;i--){
for(int j=0;j<alphabet[i]/2;j++){
ans+=i+'A';
}
}
return ans;
}

int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);

string s, answer="", mid="";

cin >> s;

for(int i=0;i<s.size();i++){
alphabet[s[i]-'A']++;
}

if(!isPossible(mid)){
cout << "I'm Sorry Hansoo";
return 0;
}
else{
answer=makePd(mid);
}
Comment on lines +57 to +59
Copy link

Choose a reason for hiding this comment

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

P3
이 경우에는 위 경우를 만족하면 리턴되고 있으니 else를 붙이지 않아도 됩니다!


cout << answer;

return 0;
}
32 changes: 32 additions & 0 deletions 06_그리디/17451.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#include <iostream>

using namespace std;

int arr[300000];
Copy link

Choose a reason for hiding this comment

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

P2
알튜비튜에서는 정말 필요한 경우를 제외하고는 전역변수 사용을 지양하고 있습니다! 이 경우에는 메인 함수 안에서 배열을 선언해도 문제를 해결할 수 있을 것처럼 보이네요!


int main()
{
int n, speed;

cin >> n;

for(int i=0;i<n;i++){
cin >> speed;
arr[i]=speed;
}

long long answer=arr[n-1];

for(int i=n-2;i>=0;i--){
if(answer%arr[i]==0){
continue;
}
else{
answer = (answer / arr[i] + 1) * arr[i];
}
}
Comment on lines +20 to +27
Copy link

Choose a reason for hiding this comment

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

최소 속도를 만드는 조건을 파악해서 문제를 잘 풀어주셨네요!👍


cout << answer;

return 0;
}
67 changes: 67 additions & 0 deletions 06_그리디/18111.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#include <iostream>
#include <vector>

using namespace std;

typedef pair<int, int> pii; //다음 pair의 이름을 pii로 선언
Copy link
Member

Choose a reason for hiding this comment

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

별칭 지정 좋습니다!


const int MAX_HEIGHT = 257; //상수 선언
const int INF = 987'654'321; //상수 선언

int calcCost(int height, int n, int m, int b, vector<vector<int>>& blocks) { //비용 계산
int cost = 0; //비용
int added = 0; //추가해야 하는 블록 개수
int removed = 0; //제거해야 하는 블록 개수

for (int i = 0; i < n; i++) { //전달받은 n번 동안 반복
for (int j = 0; j < m; j++) { //전달받은 m번 동안 반복
int gap = abs(height - blocks[i][j]); //목표한 높이와 블록의 차를 변수에 넣기
Copy link
Member

Choose a reason for hiding this comment

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

abs 함수 사용 좋습니다!


if (blocks[i][j] > height) { //목표한 높이보다 높은 칸일 때
removed += gap; //차이만큼의 블록을 제거
}
else if (blocks[i][j] < height) { //목표한 높이보다 낮은 칸일 때
added += gap; //차이만큼의 블록을 추가
}
}
}

cost = 2 * removed + added; //비용 계산

// 블록 개수가 부족하다면 모든 땅의 높이를 height로 만드는 것이 불가능
return (added > (b + removed)) ? INF : cost; //블록 개수가 부족하면 INF 리턴, 아닐 시 cost 리턴
}

pii makeGroundEven(int n, int m, int b, vector<vector<int>>& ground) { //모든 땅의 높이를 같게 만드는 비용과 그 높이 계산
int minCost = INF; //최소 비용
int height = 0; //높이

for (int i = 0; i < MAX_HEIGHT; i++) { //최대 높이까지 둘러보는 동안
int cost = calcCost(i, n, m, b, ground); //비용 계산
if (cost <= minCost) { //비용이 최소비용보다 낮거나 같을 경우
minCost = cost; //최소비용 변수에 현재 비용 넣기
height = i; //높이를 현재 보고 있는 높이 값으로 설정
}
}

return {minCost, height}; //최소 비용과 그 높이를 리턴
}

int main() { //메인 함수
int n, m, b; //입력받기 위한 변수

// 입력
cin >> n >> m >> b; //입력받기
vector<vector<int>> ground(n, vector<int>(m)); //고르게 만들어야 할 땅
for (int i = 0; i < n; i++) { //입력 받은 n번 동안 반복하며
for (int j = 0; j < m; j++) { //입력 받은 m번 동안 반복하며
cin >> ground[i][j]; //현재 땅을 입력 받기
}
}

pii answer = makeGroundEven(n, m, b, ground); //땅을 고르게 만드는 데 드는 비용과 그 높이를 연산

cout << answer.first << " " << answer.second << "\n"; //결과 출력
Copy link
Member

Choose a reason for hiding this comment

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

endl로 하는 편이 더 좋습니다!


return 0; //코드 끝
}