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

[정렬] 3월 7일 #1

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open

[정렬] 3월 7일 #1

wants to merge 4 commits into from

Conversation

btothey99
Copy link
Collaborator

내용 & 질문

과제 제출합니다.

<기존 제출>

X

<추가 제출>

문제번호 1026, 1758, 10804, 11651, 12840

Copy link

@bsa0322 bsa0322 left a comment

Choose a reason for hiding this comment

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

p1. 전체적으로 너무 잘 풀어주셨어요!! 주석 설명도 자세해서 코드리뷰 하기도 너무 좋았습니다 😊 감사합니다! 보물 문제는 거의 풀어주셨어요! 아래 코멘트 남겼는데, 수정 후 저 다시 리뷰어로 호출해주세요~! 다른 문제들에 대해서는 가독성을 높이거나 연산 횟수를 조금 더 줄일 수 있는 부분에 대해서 사소한 코멘트 남겼으니 참고 정도 해주시면 좋을 것 같습니다~! 과제 하시느라 너무 수고하셨습니다! 😊
+ 아! 그리고 지금 제출해주신 건 마감 기한 내에 직접 풀어주신 제출이기에 기존 제출에 해당한다는 점 말씀드립니다~!

Comment on lines +11 to +13
//가장 작은 값과 가장 큰 값을 곱하면 최솟값이 나오지 않을까?
//그 다음 작은 값과 그 다음 큰 값을 만나도록 짜려면?
// a를 오름차순으로 정렬한 뒤 b의 가장 큰 값의 인덱스를 찾아 a의 첫 번째 원소부터 짝을 맺게 하면 되지 않을까?
Copy link

Choose a reason for hiding this comment

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

우선 생각해 주신 아이디어는 완전 맞습니다! 😊 사실 해당 문제는 O(N) 으로 풀 수 있지만 현재 코드에서 반례를 알려드릴께요! 지금 b의 가장 큰 값을 찾은 후 0으로 만든 후 다음으로 큰 값을 계속 찾아주고 있는데요. 만약 b가 양수라면 해당 풀이로 항상 서로 다른 인덱스의 값에 참조할 수 있을 거예요! 그런데 그렇지 않은 경우엔 어떻게 될까요? 만약 b가 0이 가능하면 무슨 일이 벌어질까요? 문제에서 b가 가능한 범위를 다시 한 번 살펴볼까요! max_index가 항상 다르게 선택이 될지 디버깅해보시면 좋을 것 같아요 😊

Comment on lines +9 to +15
void reverse(int a, int b)
{
while (a < b)
{
swap(card[a++], card[b--]);
}
}
Copy link

Choose a reason for hiding this comment

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

배열을 역으로 바꾸는 원리를 잘 캐치해서 swap을 활용해 reverse함수를 직접 구현해주셨네요! 아주 좋아요! 샘플코드에선 STL함수를 사용한 풀이도 있으니 참고해보셔도 좋을 것 같아요~! 👍

Comment on lines +24 to +26
for (int i = 0; i<10 ; i++) {
cin >> a[i] >> b[i];
}
Copy link

Choose a reason for hiding this comment

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

p3. 배열에 입력 받아서 처리해주신 것도 좋지만, a와 b는 전의 정보를 저장하는 것보단 현재 a와 b가 무엇이고 그것에 따라 연산을 수행하기 때문에 여기서 더 메모리를 아껴도 좋을 것 같아요~!

Comment on lines +7 to +10
struct coor
{
int x, y;
};
Copy link

Choose a reason for hiding this comment

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

p3. 구조체 사용도 좋지만 인자가 2개일 경우엔 더 편하게 사용할 수 있는 방법이 있어요! 정렬 피피티에 "이것도 알아보세요" 부분을 참고해 보셔도 좋을 것 같아요 😎

Comment on lines +18 to +21
int h_ = total / 3600;
int m_ = total % 3600 / 60;
int s_ = total % 3600 % 60;
cout << h_ << " " << m_ << " " << s_ << "\n";
Copy link

Choose a reason for hiding this comment

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

p3. 자주 쓰는 60, 3600은 상수로 선언하고 사용해도 좋을 것 같아요~! 그럼 가독성도 높아지고 실수할 일이 줄어들 거예요 😊 더불어 출력은 되도록 main에서 해주시는 게 좋아요! 함수에서의 출력은 디버깅용이 아닌 이상, 나중에 함수가 많아졌을 때 헷갈리기 쉬워질 수 있어요. 함수를 만들어주신 것도 너무 좋지만, 출력이 필요하다면 모두 메인에서 처리해주는 것도 좋을 것 같아요~!

Comment on lines +13 to +19
t = tip[i] - i;
if (t < 0)
{
t = 0;
}

max += t;
Copy link

Choose a reason for hiding this comment

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

p3. tip은 이미 내림차순 정렬이 된 상태이네요! 한 번 t 값이 음수라면 그 이후는 어떻게 될까요? 연산을 더 줄일 수 있어 보여요~!

Comment on lines +35 to +36
//연산
sort(tip.begin(), tip.end(), greater<>());
Copy link

Choose a reason for hiding this comment

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

1등인 사람이 가장 팁이 많을수록 강호가 받는 팁이 많아진다는 걸 아주 잘 파악해주셨네요~! 좋아요 👍

Copy link

@bsa0322 bsa0322 left a comment

Choose a reason for hiding this comment

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

p1. 늦은 시간 죄송해요! ㅠㅠ 코드 확인을 제대로 못한 부분을 발견해서 추가 코멘트 드리게 되었습니다 😊 마지막으로 알바생 강호 문제는 입력 값을 최대로 하고 정답이 될 수 있는 최댓값이 무엇일지 계산해보면 어느 부분에서 틀린 건지 찾으실 수 있을 것 같습니다! 힌트 더 필요하면 언제든 말씀해주세요 :)

Comment on lines 12 to 17
bool cmp(const coor &a, const coor &b){
if (a.y == b.y) {
return a.x < b.y;
}
return a.y < b.y;
}
Copy link

Choose a reason for hiding this comment

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

p1. 오타가 있네요! 😉

Comment on lines 8 to 15
if (T == 1)
{
total = total + c;
}
else if (T == 2)
{
total = total - c;
}
Copy link

Choose a reason for hiding this comment

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

p1. 우선 문제의 기본 로직은 아주 잘 파악해 주셨어요! 혹시 리드미 힌트를 보셨을지 모르겠지만, 만약 시계가 한 없이 뒤로 간다면 시간은 어떻게 변할까요? 만약 오늘 오전 6시에서 9시간 전으로 돌아가면 어제 밤 9시가 될 거예요! 하지만 지금 코드라면 이런 경우를 잡아줄 수 있을까요?
힌트 더 필요하시면 언제든 말씀해주세요!

@btothey99 btothey99 requested a review from bsa0322 March 10, 2022 13:07
Copy link

@bsa0322 bsa0322 left a comment

Choose a reason for hiding this comment

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

보물 수정해주신 거 확인했어요~! 수고하셨습니다!!
남은 문제도 조금만 더 하면 해결 할 수 있어요! 힌트 더 필요하시면 언제든 말씀해주세요 🥰

Comment on lines +36 to +38
// b의 조건이 음수가 아닌 정수이므로 음수를 사용해 해당 원소를 사용했음을 알린다.
tmp2[max_index] = -1;
max_b = -1;
Copy link

Choose a reason for hiding this comment

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

좋아요~! 반례를 찾아 잘 수정해주셨어요! 🤛

사실 이 문제는 지금 보연님께서 생각해주신 아이디어 그대로 O(n)의 시간복잡도로 해결할 수 있어요! B를 재배열 할 순 없다고 했지만, A는 재배열이 가능하니 해당 아이디어 (A의 가장 작은 값 <=> B의 가장 큰 값 계속 매칭) 를 B를 재배열해서 구현할 수 있지 않을까요? 더 자세한 부분은 샘플코드를 참고해주셔도 좋을 것 같아요~!

Comment on lines +12 to +17
bool cmp(const coor &a, const coor &b){
if (a.y == b.y) {
return a.x < b.x;
}
return a.y < b.y;
}
Copy link

Choose a reason for hiding this comment

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

좋아요~~! 지금도 좋지만 만약 조건이 많아질 경우 계속 if문 안으로 들어가게 될 거예요! 따라서 같은지를 조건으로 보는 것보다 다른지를 봐주면 앞으로 비교함수 작성에서 코드를 더 깔끔하게 작성하실 수 있을 거예요 😉

Comment on lines 8 to 18
if (T == 1)
{
total = total + c;
}
else if (T == 2)
{
total = total - c;
if ( total < 0){
total = 0;
}
}
Copy link

@bsa0322 bsa0322 Mar 10, 2022

Choose a reason for hiding this comment

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

p1. 기본 로직은 잘 구현해주셨어요! 다음과 같은 경우 생각해주시면 좋을 것 같아요.

  1. total이 하루의 초를 넘기면 어떻게 될지
  2. total이 음수인 경우 전날로 돌아갔음을 의미해요! 이걸 어떻게 처리해주면 좋을까요! (지금처럼 0 으로 바꿔주시는 건 시간을 초기화 해버린 거예요! "전날"의 시간대로 표기될 수 있도록 해주셔야 합니다!)

힌트 더 필요하시면 언제든지 말씀해주시고, 되도록이면 직접 풀어서 해결해보시는 걸 추천드려요!!! 저희 할 수 있는 데까지 해봅시다 🥰🥰

@btothey99 btothey99 requested a review from bsa0322 March 11, 2022 10:59
Copy link

@bsa0322 bsa0322 left a comment

Choose a reason for hiding this comment

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

p1. 12840과 1758 정말 조금만 더 하면 풀 수 있어요!! 직접 풀어서 맞았습니다가 뜨면 엄청 뿌듯하실 거예요 지금 거의 다 왔어요! 😊 힌트 더 필요하시면 언제든 말씀해주시고, 너무 감이 안잡힌다면 샘플코드를 슬쩍 참고해보셔도 좋아요 🥰 지금 너무너무 잘 해주고 계신데 조금만 더 힘내봐요 우리!! 수고하셨습니다! 수정 하시면 리뷰어로 다시 호출 부탁드려요~!

Comment on lines 8 to 21
if (T == 1)
{
total = total + c;
if ( total >= 86400) { //하루가 넘어감
total -= 86400;
}
}
else if (T == 2)
{
total = total - c;
if ( total < 0){ //전날로 넘어감
total = 86400 + total;
}
}
Copy link

Choose a reason for hiding this comment

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

p1. 하루가 넘어가고, 전날로 간 경우 처리를 잘 접근해주셨어요!!! 하지만 한 번에 하루만 넘어간다는 보장이 있을까요? 만약 c의 값이 이틀, 삼일, 극단적으로 가장 최댓값인 10000000 으로 주어진다면 어떻게 될까요? 단순하게 하루를 더하고 빼주는 것이 아니라, 더 많은 날들이 한 번에 지났다 해도, 하루 안의 시간으로 표현할 수 있도록 해주어야 해요!

Comment on lines 7 to 9
int maxTip(int n, vector<int> &tip)
{
int t;
Copy link

Choose a reason for hiding this comment

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

p1. 해당 문제는 너무 잘 풀어주셨는데, 자료형 부분에 함정이 있는 문제였어요! 문제에서 가능한 정답의 최댓값이 과연 int 범위 이내일지 계산해보시면 좋을 것 같습니다! 🤗

@btothey99 btothey99 requested a review from bsa0322 March 12, 2022 12:44
Copy link

@bsa0322 bsa0322 left a comment

Choose a reason for hiding this comment

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

리뷰가 늦어서 죄송합니다! ㅜㅜ
우선, 보연님 너무너무 수고하셨습니다!! 1758 풀이 아주 잘 해주셨어요~! 12840도 진짜진짜 거의 다 왔어요! 힌트 더 필요하시거나 질문 있으시면 언제든 말씀해주세요~! 🥰

Comment on lines +10 to +11
//최댓값을 가정해보면 약 150억이 나온다. (맞나요..?)
//int형은 signed int형일 경우 20억(unsigned int는 40억)까지밖에 표현을 못하기 때문에 long long 타입을 사용해야 한다.
Copy link

Choose a reason for hiding this comment

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

맞아요~~!! 정확히는 최댓값을 가정해보면 1 ~ 100000 를 모두 더한 값으로 약 50억이 나와요!! 😉
11번째 줄에 써주신 주석은 정확히 맞습니다~! 아주 좋아요 😎

앞으로 항상 문제 풀어주실 때, 맞게 푼 거 같은데 안 풀린다면 자료형의 범위를 넘어가진 않는지 확인해주는 게 좋습니다!

Comment on lines +45 to +46
int T, c;
for (int i = 0; i < q; i++)
Copy link

Choose a reason for hiding this comment

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

p3. i의 값을 쓸 필요가 없고, q값을 다시 사용하지 않으므로 이럴 땐 while(q--)로 입력을 받으면 깔끔하게 받을 수 있어요~~!

Comment on lines +15 to +22
else if (T == 2)
{
total = total - c;
if ( total < 0){ //전날로 넘어감
total = total % 86400;
total = 86400 + total;
}
}
Copy link

@bsa0322 bsa0322 Mar 14, 2022

Choose a reason for hiding this comment

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

p1. 모듈러 연산을 사용해야 한다는 걸 아주 잘 파악해 주셨어요!!! 하루가 넘어간 부분에 대한 연산은 지금 아주 잘 이루어지고 있어요. 다만 전날로 넘어간 경우에 대해 반례가 하나 있는데요!
지금 0 이하인 경우에 모듈러 연산을 해주고, 무조건 하루를 더해주고 있죠! 기본 로직은 거의 맞아요! 하지만 만약, 정확히 하루 전으로 돌아간 경우엔 어떻게 될까요? 지금대로라면, 우선 18번째 조건에 걸려서 모듈러 연산을 해줄텐데 정확히 하루 전이라면 total 값이 -86400 인 거니까 ...!?
진짜 거의 다 왔어요!! 힌트 더 필요하다면 말씀해주세요~!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants