복소수를 나타내는 두 개의 문자열이 주어졌을 때, 이를 파싱하여 복소수 곱셈을 수행한 뒤 그 결과를 문자열 형태로 반환하는 문제를 생각해 봅시다.
예를 들어 입력이 "1+-1i"와 "1+-1i"라면, 결과는 "0+-2i"가 됩니다.
문제 해결 접근 방법
복소수 곱셈은 다음과 같은 수학적 공식에 기반합니다.
(a + bi) × (c + di) = (ac − bd) + (ad + bc)i
즉, 실수부와 허수부를 분리한 후 위 공식을 적용하면 됩니다. 이를 단계별로 정리하면 다음과 같습니다.
- aa := 첫 번째 복소수의 실수부와 허수부로 이루어진 쌍(pair)
- bb := 두 번째 복소수의 실수부와 허수부로 이루어진 쌍(pair)
- x := aa.real × bb.real − aa.img × bb.img (결과의 실수부)
- y := aa.real × bb.img + aa.img × bb.real (결과의 허수부)
- 최종 결과를 "x+yi" 형식의 문자열로 반환
문자열 파싱은 '+' 기호와 'i' 문자의 위치를 찾아 실수부와 허수부를 각각 분리하는 방식으로 처리할 수 있습니다.
예제 코드
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string complexNumberMultiply(string a, string b) {
pair <int, int> aa = parse(a);
pair <int, int> bb = parse(b);
int x = aa.first * bb.first - aa.second * bb.second;
int y = aa.first * bb.second + aa.second * bb.first;
return to_string(x) + "+" + to_string(y) + "i";
}
pair <int, int> parse(string s){
pair <int, int> ret;
int plus = find(s.begin(), s.end(), '+') - s.begin();
int i = find(s.begin(), s.end(), 'i') - s.begin();
ret.first = stoi(s.substr(0, plus));
ret.second = stoi(s.substr(plus + 1, i - plus));
return ret;
}
};
main(){
Solution ob;
cout << (ob.complexNumberMultiply("1+-1i", "1+-1i"));
}입력
"1+-1i" "1+-1i"
출력
0+-2i
코드 설명
위 코드에서 parse() 함수는 입력 문자열에서 '+'와 'i'의 위치를 찾아 실수부와 허수부를 stoi()로 정수형으로 변환합니다. 이후 complexNumberMultiply() 함수에서 복소수 곱셈 공식을 적용해 결과의 실수부 x와 허수부 y를 계산하고, 이를 문자열로 조합하여 반환합니다.
시간 복잡도는 문자열 길이에 비례하여 O(n)이며, 공간 복잡도 역시 O(n)입니다. 이 풀이는 LeetCode 537번 'Complex Number Multiplication' 문제와 동일한 접근 방식입니다.