본문 바로가기

백준

1252 이진수 덧셈

전에 이렇게 풀다가 졸리다고 그만 둔 문제.. 오늘 다시 풀었다. 

이 위의 로직은 전에 세웠는데 그 때 결국 잘못 세웠다로 결론이 나서 다시 세웠음ㅎㅎ


 

문제 이렇게 정의해서 

 

이이이ㅣ이이렇게 풀었다.

 

이 문제의 까다로운 점이라면 80자리 이진수라 문자열로 덧셈을 구현해야 한다는 점이랑 앞에 0이 붙는거.. 이것때문에 어려웠다. 

 

먼저 앞에 0이 있기 떄문에 계산할 구간을 따로 구했다. 처음에 1이 나오는 부분을 시작으로 잡아서 맨 뒤에서 이까지 젓셈을 했다. 다음으로 두 문자열의 길이가 다르므로 길이가 짧은 문자열을 기준으로 덧셈을 한 뒤 나머지 부분을 따로 더해서 붙였다. 

 

아 그런데 조건에서 자꾸 문제가 생겨서 힘들었음ㅜ 처음에 for문 조건으로 (start1 == end1+1) || (start2 == end2+1) 이렇게 했는데 자꾸 무한루프에 빠지거나 아예 안 돌아가서 결국 while문 안에 조건을 넣었다. 

 

        if(end1+1 == start1)
            break;
        if(end2+1 == start2)
            break;

 

#include <iostream>
#include <string>
#include <bits/stdc++.h> 
using namespace std;

int main() {
    string s1, s2, result;
    cin >> s1 >> s2;
    //cout << s1 << " " << s2;
    
    int start1, start2;
    for(int i = 0; i < s1.length(); i++){
        if(s1[i] == '1'){
            start1 = i;
            break;
        }
    }
    for(int i = 0; i < s2.length(); i++){
        if(s2[i] == '1'){
            start2 = i;
            break;
        }
    }
    //cout << start1 << " " << start2 << endl;
    
    int end1 = s1.length() - 1;
    int end2 = s2.length() - 1;
    int carry = 0;
    while(true) {
        int tmp = (s1[end1]-'0') + (s2[end2]-'0') + carry;
        carry = tmp/2;
        result += (tmp%2) + '0';
        
        end1--; end2--;
        
        if(end1+1 == start1)
            break;
        if(end2+1 == start2)
            break;
            
        
    }
    
    //cout << end1 << " " << end2 << endl;
    //cout << result << endl;
    for(; (start1 != end1+1); end1--){
        //cout << "s1에 들어옴" << endl;
        int tmp = (s1[end1]-'0') + carry;
        carry = tmp/2;
        result += (tmp%2) + '0';
    }
    for(; (start2 != end2+1); end2--){
        //cout << "s2에 들어옴" << endl;
        int tmp = (s2[end2]-'0') + carry;
        carry = tmp/2;
        result += (tmp%2) + '0';
    }
    
    if(carry == 1){
        result += (carry + '0');
        //cout << "캐리 있음\n";
    }
        
    reverse(result.begin(), result.end());
        
    cout << result;
    
    return 0;
}

이진수 넣어서 돌렸는데 잘 나오길래 백준에 제출했다. 하지만 런타임 에러..

ㅠㅠㅠㅠㅠㅠ

배열 인덱스에서 터진 것 같다

 

찾아보니 인덱스가 원인은 아니고 전부 0000인 경우를 생각 못했다. 맨 처음에 1을 만날 때 시작지점으로 잡았는데 그럼 0일 때는 초기화를 못 한다. 그래서 변수 선언 할 때 기본값으로 배열의 마지막 인덱스를 줬다. 

 

#include <iostream>
#include <string>
#include <bits/stdc++.h> 
using namespace std;

int main() {
    string s1, s2, result;
    cin >> s1 >> s2;
    
    int start1 = s1.length() - 1;
    int start2 = s2.length() - 1;
    for(int i = 0; i < s1.length(); i++){
        if(s1[i] == '1'){
            start1 = i;
            break;
        }
    }
    for(int i = 0; i < s2.length(); i++){
        if(s2[i] == '1'){
            start2 = i;
            break;
        }
    }
    
    int end1 = s1.length() - 1;
    int end2 = s2.length() - 1;
    int carry = 0;
    while(true) {
        int tmp = (s1[end1]-'0') + (s2[end2]-'0') + carry;
        carry = tmp/2;
        result += (tmp%2) + '0';
        
        end1--; end2--;
        
        if(end1+1 == start1)
            break;
        if(end2+1 == start2)
            break;
            
        
    }
    
    for(; (start1 != end1+1); end1--){
        int tmp = (s1[end1]-'0') + carry;
        carry = tmp/2;
        result += (tmp%2) + '0';
    }
    for(; (start2 != end2+1); end2--){
        int tmp = (s2[end2]-'0') + carry;
        carry = tmp/2;
        result += (tmp%2) + '0';
    }
    
    if(carry == 1){
        result += (carry + '0');
    }
        
    reverse(result.begin(), result.end());
        
    cout << result;
    
    return 0;
}

맞았다!

'백준' 카테고리의 다른 글

10815 숫자 카드  (0) 2019.11.25
15885 고장난 시계  (0) 2019.11.23
1790 수 이어 쓰기2 (미완)  (0) 2019.11.20
1059 수2  (0) 2019.11.17
7795 먹을 것인가 먹힐 것인가  (0) 2019.11.17