전에 이렇게 풀다가 졸리다고 그만 둔 문제.. 오늘 다시 풀었다.
이 위의 로직은 전에 세웠는데 그 때 결국 잘못 세웠다로 결론이 나서 다시 세웠음ㅎㅎ
문제 이렇게 정의해서
이이이ㅣ이이렇게 풀었다.
이 문제의 까다로운 점이라면 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 |