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

[1주차] 해바라기반 - 조현창 #3

Merged

Conversation

vcho1958
Copy link
Contributor

@vcho1958 vcho1958 commented Apr 7, 2022

😀 PR을 올리기 전 준비

  • assignee를 지정해주셨나요?
  • reviewer(그룹원)를 지정해주셨나요?
  • PR 제목 등 컨벤션을 확인하셨나요?

💡 소속 그룹

해바라기반 (@CBNU-Nnet/team)

🤩 이번주 문제

문제

세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.

그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.

괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.

입력

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다.

🧑‍💻 어떻게 푸셨나요?

최소가 되려면 양수인 부분을 모두 괄호로 묶으면 된다.
따라서 수식의 특성상 수식의 -를 마주치기 전 모든 수를 sum변수에 더한 후에
-가 나오는 순간부터 있는 수들은 모두 빼는 변수 sub에 덧셈시키고
최종적으로 sum에서 sub를 빼서 결과값을 도출한다.
예시
1+2+3 => (1+2+3)
1-2+3-6 => 1-(2+3)-(6) 이처럼 - 이후는 +가 섞여있어도 결국 모두 뺴는 값에 포함된다.

✍️ 질문을 적어주세요.

질문할 부분이 있으면 알려주세요.(선택사항)

📖 참고 사항

문제를 해결할 때 참고하셨던 것을 첨부해주세요.(선택사항)

@vcho1958
Copy link
Contributor Author

vcho1958 commented Apr 9, 2022

  for (int i = 0; i < input.length(); i++)
  {
    int tmp = 0;
    if (input[i] >= '0' && input[i] <= '9')
    {
      while (input[i] >= '0' && input[i] <= '9')
      {
        tmp *= 10;
        tmp += input[i] - '0';
        i++;
      }
    }
    res += tmp * sign;
    if (i < input.length() && input[i] == '-')
      sign = -1;
  }
  cout << res;

기존 방법은 배열에 먼저 숫자와 부호를 insert후 순회하여 비효율적이었지만
배열과 해당 변수를 지우고 res변수에 바로바로 반영하게하여 코드를 단축하고 효율성을 개선함

cout.tie(NULL);
string input;
int a, res = 0, tmp = 0, minus = 0, sum = 0, sub = 0;
vector<int> A;
Copy link
Contributor

@sarah2234 sarah2234 Apr 9, 2022

Choose a reason for hiding this comment

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

14번째 줄 - 변수명이 (짧더라도) 좀 더 명확하면 좋겠습니다.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

아하! 2번째 커밋에 반영했습니다!

@vcho1958 vcho1958 changed the title [1주차 해바라기반]: 조현창 - 1541 잃어버린 괄호 Silver2(#2) [1주차 해바라기반] : 조현창 - 1541 잃어버린 괄호 Silver2(#2) Apr 9, 2022
@alirz-pixel
Copy link
Collaborator

1주차 참여해 주셔서 감사드립니다. :)
적어주신 풀이 말고도 스택으로도 가능하니 시간 되실 때 도전해 보세요!

Copy link
Collaborator

@alirz-pixel alirz-pixel left a comment

Choose a reason for hiding this comment

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

PR title은Collaboration Guide에 나와있는 것과 같이 [{주차}] {그룹} - {이름} 으로 적어주세요!

int tmp = 0;
if (input[i] >= '0' && input[i] <= '9')
{
while (input[i] >= '0' && input[i] <= '9')
Copy link
Collaborator

@alirz-pixel alirz-pixel Apr 10, 2022

Choose a reason for hiding this comment

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

현창님이 작성하신 코드를 보다가 이 부분에서 out of range가 발생하지 않은 것을 보고 신기하여 좀 찾아보았습니다.
C++의 string의 경우, string의 length에 해당하는 index를 참조해도 exception을 발생않는다고 합니다.
참고한 사이트
out of range가 발생하는 경우

그래서 visual studio 2019 환경에서 문제가 발생할 만한 코드를 작성한 후에 디버깅을 해보았는데,
정말로 string의 length에 해당하는 index에 대해선 out of range가 발생하지 않더라고요.

덕분에 하나 알아갑니다.

직접 테스트해 본 코드
> 출력
> a
> abc

Copy link
Collaborator

Choose a reason for hiding this comment

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

@sarah2234 님의 풀이(#4) 처럼 저도 한 글자마다 숫자를 parsing 했었는데,
while 문으로 숫자를 parsing 하신 점이 굉장히 인상 깊었습니다.

@vcho1958 vcho1958 changed the title [1주차 해바라기반] : 조현창 - 1541 잃어버린 괄호 Silver2(#2) [1주차] 해바라기반 - 조현창 Apr 10, 2022
@vcho1958
Copy link
Contributor Author

@alirz-pixel 스택으로 풀어본 풀이도 추가했습니다!

@vcho1958
Copy link
Contributor Author

vcho1958 commented Apr 10, 2022

@alirz-pixel
로직은 이렇습니다.

  1. 1글자씩 char 스택에 넣는다.
  2. 모두 넣은 후 한개씩 팝시키면서 int로 형변환한 후 res에 더한다.
  3. 만약 -를 마주치면 지금까지의 res를 sub변수에 대입하고 res를 0으로 초기화 시킨다.
  4. 반복 후 스택이 비면 res-sub를 출력한다.
    stoi를 활용한 이유는 문제에서 최대 숫자문자열의 길이가 5라고 지정되어있어 시간복잡도가 O(1)이 되기 때문입니다.
    마찬가지로 string 연결 역시 시간복잡도가 O(1)입니다.

Copy link
Collaborator

@alirz-pixel alirz-pixel left a comment

Choose a reason for hiding this comment

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

재풀이에 대한 commit 메시지는
[{주차} {반이름}] : {이름} - {번호 / 이름 / 티어} ({문제집issue번호}) - {추가내용}
으로 작성 부탁드립니다.

@vcho1958
Copy link
Contributor Author

재풀이에 대한 commit 메시지는 [{주차} {반이름}] : {이름} - {번호 / 이름 / 티어} ({문제집issue번호}) - {추가내용} 으로 작성 부탁드립니다.

@vcho1958 vcho1958 force-pushed the 1주차/해바라기반/조현창 branch from b5fca4a to d06c129 Compare April 10, 2022 11:39
Copy link
Collaborator

@alirz-pixel alirz-pixel left a comment

Choose a reason for hiding this comment

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

요 커밋들도 collaboration 맞춰서 수정해 주세요

image

Copy link
Collaborator

@alirz-pixel alirz-pixel left a comment

Choose a reason for hiding this comment

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

다른 커밋이 올라온 상태에서
수정해버리면 꼬여버리는군요 ㅎㅎ

다음부터는 컨벤션 잘 작성해서 올려주세요

@alirz-pixel alirz-pixel added the 📖 Assignment 주차별 과제를 공유합니다. label Apr 12, 2022
@alirz-pixel alirz-pixel merged commit 6e746ed into CBNU-Nnet:main Apr 16, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
📖 Assignment 주차별 과제를 공유합니다.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants