# 11. Container With Most Water
일렬로 세워진 n 개의 기둥들의 높이가 주어졌을 때, 두 기둥 사이에 받을 수 있는 물의 최대양을 구하는 문제
* 두 기둥 사이에 받을 수 있는 물은 (두 기둥 사이 거리 * 두 기둥 중 낮은 기둥의 높이) 로 정의
처음 이 문제를 봤을 때는, O(n^2) 으로 경우를 다 탐색해야 하나 생각을 했는데 이렇게 할 경우에 n 이 최대 3만이고 n^2 은 9억이니 불가능할 것이라고 생각했다. 그래서 생각한 점은, 기둥 사이 거리의 최대는 양 끝점이고, 양 끝점부터 하나씩 좁혀나가며 탐색을 하면 n 번만 탐색을 할 수 있을 것이라고 생각이 들었다.
#define _MIN_(X, Y) ((X) < (Y) ? (X) : (Y))
int maxArea(vector<int> &height) {
int l = 0, r = height.size() - 1;
int max = 0;
while (l < r) {
int area = _MIN_(height[l], height[r]) * (r - l);
max = max > area ? max : area;
if (height[l] < height[r])
l++;
else
r--;
}
}
# 12. Integer to Roman
정수 N 이 주어졌을 때, 이를 Roma 표기법으로 변경하는 문제
* I = 1, V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000
이 문제는 풀이가 떠오르지 않아서 Solution 을 참고해 풀이를 작성했다.
나는 1, 5, 10, 50, ... 각 숫자 앞자리가 1 / 5 로 달라서 이를 어떻게 처리할 지 고민을 했는데, 솔루션은 이를 가볍게 해결할 수 있는 방법을 사용했다. 10 의 승수 기준으로만 숫자를 처리하는 것이 그 방법이었는데, 4 / 9 등의 숫자가 나오면 별도의 처리가 필요하지만 그 외는 일정하게 처리가 가능한 방식이었다.
여기서 Map 은 각 숫자가 어떤 문자로 변환될 지를 저장하기 위해 사용되었다.
string intToRoman(int num) {
map<int, char> m = {{1, 'I'}, {5, 'V'}, ..., {1000, 'M'}};
string ans = "";
for (int i = 1000; i > 0; i /= 10) {
int firstNum = num / i;
if (firstNum == 4) {
ans += m[i];
ans += m[i * 5];
}
else if (firstNum == 9) {
ans += m[i];
ans += m[i * 10];
}
else {
if (firstNum > 4) {
ans += m[i * 5];
}
for (int k = 0; k < (firstNum % 5); k++) {
ans += m[i];
}
}
num %= i;
}
return ans;
}
# 13. Roman to Integer
이 문제는 위의 # 12. 문제를 거꾸로 만드는 문제이다.
위의 문제는 각 자리수별로 어떤 수가 저장되어있는 지를 확인해서 그 값을 로마자로 바꿔줬는데, 이번 문제는 로마자를 보고 수로 바꿔주었다.
차이점은, 로마자의 경우 현재의 값이 하나의 독립적인 값이 아니라 다음에 나올 값의 전치 값으로 사용될 수 있기 때문에 이를 조건에 추가해서 계산하도록 만들었다.
마찬가지로 map 을 사용했는데 이번에는, 각 문자가 어떤 숫자로 변환될 것인지 그 값을 저장하기 위해 사용되었다.
int romanToInt(string s) {
map<char, int> m = {{'M', 1000}, {'D', 500}, ..., {'I', 1}};
int ans = 0;
for (int i = 0; i < s.length(); i++) {
if (m[s[i + 1]] > m[s[i]]) {
ans -= m[s[i]];
ans += m[s[i + 1]];
}
else {
ans += m[s[i]];
}
}
return ans;
}
'Algorithm > LeetCode' 카테고리의 다른 글
[LeetCode # 17 ~ 19] 문제 풀이 (0) | 2021.03.18 |
---|---|
[LeetCode # 14 ~ 16] 문제 풀이 (0) | 2021.03.09 |
[LeetCode # 7 ~ 9] 문제 풀이 (0) | 2021.02.26 |
<LeetCode # 4 ~ 6> 문제 풀이 (0) | 2021.02.23 |
<LeetCode # 1 ~ 3> 문제 풀이 (0) | 2021.02.21 |