dakyommii/AlgorithmReview

[Week 4] #1541 self review - yujungee

Opened this issue · 0 comments

#1541 self review

  • 파일명: algo_2022/#1541.cpp, algo_2022/#1541.ipynb (branch - yujungee) 코드 비교 추천
  • 수행시간: cpp - 0ms, py - 68ms
  • 메모리: cpp - 2024KB, py - 30864KB

1. 문제 해결 과정

c++로 풀다가 너무 오랜만에 쓰는 함수들이라 검색해보느라 시간이 오래걸렸다. (이럼 안되는데..)
일단 문제의 핵심은 파악하기 쉬웠다. 사실 예전에 풀었던 문제라 금방 생각이 났을 수도..

문제의 핵심은 - 를 기준으로 쭉 빼주는 방법이다.
-를 기준으로 그룹을 만들어서 그룹 안에 있는 애들은 다 더하기거나 숫자 하나인 경우니까 다 더해준다.
그리고 첫번째 그룹에서 나머지 그룹을 쭉 빼주면 된다.

c++ 로 풀었을 때,

  1. 문자열을 strtok을 이용해 -를 기준으로 먼저 나누어 vector에 집어넣는다.
  2. vector 안의 문자들을 다시 +를 기준으로 나누어야 하는데
    • vector 안의 문자들은 string 이고 strtok을 적용하려면 char이어야 한다.
    • 따라서 strcpy 함수를 이용해 stringchar로 변환한다.
    • +를 기준으로 나눈다.
  3. +를 기준으로 나누어준 숫자는 모두 더해준다. 이때 첫번째 그룹이면 temp에 먼저 저장을 하고 나머지 그룹들은 temp에서 빼서 다시 temp로 저장한다.

마냥 strtok로 쪼개면 된다고 생각했는데 데이터 타입을 간과해서 시간이 오래 걸렸다. 그리고 함수 사용법이 너무 서툴렀다.

그래서 데이터 타입을 좀 무시해보자 해서 python으로 풀어봤는데 정말 푸는데 5분도 안걸린 것 같다. 10줄 정도 썼나..
split 함수를 사용해서 바로바로 잘라주고 값을 구하는 건 c++ 3번과 똑같이 풀어줬다.

2. 아이디어

c++ : strtok, strcpy
python : split

3. 코드 설명

cpp

#include <iostream>
#include <cstring>
#include <vector>

using namespace std;

int main(){
    
    char expression[51] = "";    // 식을 받아줄 문자열 
    cin >> expression;
        
    vector<string> expre;    // -를 기준으로 잘라서 넣어줄 벡터 
    
    char *ptr = strtok(expression, "-");    //첫번째 strtok 사용.

    while (ptr != NULL)              //ptr이 NULL일때까지 (= strtok 함수가 NULL을 반환할때까지)
    {
        expre.push_back(ptr);
        ptr = strtok(NULL, "-");     //자른 문자 다음부터 구분자 또 찾기
    }
    // 여기까지가 -로 자르기 
   
    int cnt=0;    // +그룹을 더할 변수  
    int temp=0;    // 최종 값을 나타내는 변수

    char ch[51];
    for (int i=0; i<expre.size(); i++) {
        cnt = 0;    // 그룹마다 cnt를 구해줘야 하므로 for문 마다 초기화
        strcpy(ch, expre[i].c_str());
        char *ptr2 = strtok(ch, "+");    //첫번째 strtok 사용.
        
        while (ptr2 != NULL) {
            cnt += stoi(ptr2);
            ptr2 = strtok(NULL, "+");
        }    // 한 - 그룹을 다시 + 로 나눠서 더함.
        
        if (i==0) {    // 첫번째 - 그룹이면 temp를 cnt로 정해줌
            temp = cnt;
        }
        else temp = temp - cnt;    // 그 다음부터는 temp에서 계속 빼준다.

    }
    cout << temp<< endl;
    
    return 0;
}

py

minus = expression.split('-')    # - 를 기준으로 나눈다.

for i in range(len(minus)):    # -의 길이만큼
    plus = minus[i].split('+')    # minus[i]번 째를 다시 + 로 나눠서 더해준다.
    cnt = 0    # 그룹마다 초기화

    for j in plus:
        cnt += int(j)    # cnt 구하기

    if i == 0:    # 처음 -그룹이면 cnt가 temp
        temp = cnt

    else: temp = temp-cnt  # 그 다음부턴 temp에서 계속 빼준다.

print(temp)