605. 꽃 심기
https://leetcode.com/problems/can-place-flowers/description/?envType=study-plan-v2&envId=leetcode-75
문제
당신은 꽃을 심으려고 합니다. 꽃은 서로 인접한 땅에 심을 수 없습니다.
꽃밭은 이진 배열 flowerbed로 표현되며, 0은 빈 자리, 1은 이미 꽃이 심어진 자리를 나타냅니다.
당신은 추가로 n개의 꽃을 심고 싶습니다.
주어진 규칙에 따라 새로운 꽃을 심을 수 있는지 여부를 반환하세요.
풀이
1. n = 0 즉, 심어야 할 꽃의 개수가 없다면 조건에 만족하기 때문에 바로 true 로 반환한다.
2. flowerbed 길이가 1 일때와 2 이상일 때 구분을 짓는다.
3. flowerbed 길이가 2 이상일 때 첫 번째, 중간, 마지막으로 나눠서 진행한다.
4. flowerbed 를 순회하면서 꽃이 심어져 있지 않다면(0) 양 옆에 꽃의 유무를 확인하고 꽃을 심고(1) 심은 꽃의 개수를 올린다.
5. 심은 꽃의 개수가 n 보다 크다면 조건에 만족하기 때문에 바로 true 로 반환한다.
void main() {
List<int> flowerbed = [1, 0, 0, 0, 1];
int n = 1;
print(canPlaceFlowers(flowerbed, n));
}
bool canPlaceFlowers(List<int> flowerbed, int n) {
// 심어야 할 꽃의 개수가 없다면 바로 true 반환
if (n == 0) {
return true;
}
// 꽃이 심어진 개수
int flowerCount = 0;
int length = flowerbed.length;
// flowerbed 가 1개일 때
if (length == 1) {
if (flowerbed[0] == 0) {
flowerbed[0] = 1;
flowerCount++;
}
return flowerCount >= n ? true : false;
}
// flowerbed 가 2개 이상일 때
// 첫번째 인덱스
// 첫번째 인덱스와 두번째 인덱스에 꽃이 심어져 있지 않으면 첫번째에 꽃을 심는다.
if (flowerbed[0] == 0 && flowerbed[1] == 0) {
flowerbed[0] = 1; // 꽃 심기
flowerCount++;
if (flowerCount >= n) {
// flowerCount 가 심어야할 꽃 개수(n) 보다 크면 true 반환
return true;
}
}
// 두번째 인덱스부터 마지막 - 1 인덱스까지
for (int i = 1; i < length - 2; i++) {
// i 와 양 옆을 확인하여 꽃이 심어져 있지 않으면 i 번째에 꽃을 심는다.
if (flowerbed[i] == 0 && flowerbed[i - 1] == 0 && flowerbed[i + 1] == 0) {
flowerbed[i] = 1;
flowerCount++;
if (flowerCount >= n) {
return true;
}
}
}
// 마지막 인덱스
// 마지막 인덱스와 이 전 인덱스에 꽃이 심어져 있지 않으면 마지막 인덱스에 꽃을 심는다.
if (flowerbed[length - 1] == 0 && flowerbed[length - 2] == 0) {
flowerbed[length - 1] == 1;
flowerCount++;
if (flowerCount >= n) {
return true;
}
}
return false;
}
345. 문자열의 역모음
문제
주어진 문자열 s에서 모음(‘a’, ‘e’, ‘i’, ‘o’, ‘u’, 대소문자 구분 없음)들만 뒤집어서 문자열을 반환하세요.
다른 문자는 원래 위치에 그대로 남아 있어야 합니다.
풀이
1. String s 를 리스트로 변환한다.
2. 모음 집합을 선언한다.
3. 왼쪽에서부터 이동할 left 와 오른쪽에서부터 이동할 right 를 선언한다.
4. left 가 right 보다 커질 경우 종료한다.
5. left 와 right 가 모음을 만날 때까지 이동한다.
6. left, right 가 모음을 찾으면 서로의 값을 교환한다.
void main() {
String s = 'leetcode';
List<String> strList = s.split('');
Set<String> moem = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};
int left = 0;
int right = strList.length - 1;
// 왼쪽 포인터가 오른쪽 포인터보다 작을 때까지만
while (left < right) {
// 왼쪽 포인터에 모음이 없으면 계속 오른쪽으로 이동
if (moem.contains(strList[left])) {
// 오른쪽 포인터에 모음이 없으면 계속 왼쪽으로 이동
while (!moem.contains(strList[right])) {
right--;
}
// 왼쪽 오른쪽 둘 다 모음을 찾았을 때 서로의 값 교환
if (moem.contains(strList[right])) {
String temp = strList[left];
strList[left] = strList[right];
strList[right] = temp;
// 교환 후 오른쪽 포인터 이동
right--;
}
}
left++;
}
// 문자열로 다시 조합
print(strList.join(''));
}
'기타 > 알고리즘' 카테고리의 다른 글
LeetCode - 1207 고유한 빈도 횟수 (0) | 2024.11.05 |
---|---|
LeetCode - 643 최대 평균 하위 배열1 (0) | 2024.10.31 |
LeetCode - 문자열의 최대 공약수/가장 많은 사탕을 가지고 있는 아이들 (0) | 2024.10.28 |
프로그래머스 코딩테스트 연습 - 문자열 밀기 with Kotlin (0) | 2022.12.11 |
프로그래머스 코딩테스트 연습 - 연속된 수의 합 with Kotlin (0) | 2022.12.10 |
댓글