본문 바로가기
기타/알고리즘

Leetcode - 꽃 심기 / 문자열의 역모음

by 개발짜 2024. 10. 29.

 

 

 

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. 문자열의 역모음

https://leetcode.com/problems/reverse-vowels-of-a-string/description/?envType=study-plan-v2&envId=leetcode-75

문제

주어진 문자열 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(''));
}

댓글