728x90
반응형
SMALL

문제 설명

문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.

  • 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
  • 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
  • s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
  • 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.

문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.


제한사항

  • 1 ≤ s의 길이 ≤ 10,000
  • s는 영어 소문자로만 이루어져 있습니다.

입출력 예

s result

"banana" 3
"abracadabra" 6
"aaabbaccccabba" 3

입출력 예 설명

입출력 예 #1

s="banana"인 경우 ba - na - na와 같이 분해됩니다.

입출력 예 #2

s="abracadabra"인 경우 ab - ra - ca - da - br - a와 같이 분해됩니다.

입출력 예 #3

s="aaabbaccccabba"인 경우 aaabbacc - ccab - ba와 같이 분해됩니다.

package LV1;

public class H140108 {
    public int solution(String s) {
        int answer = 0; // 분해된 문자열의 개수를 저장할 변수
        int i = 0; // 문자열 s를 탐색할 인덱스

        // 문자열의 끝까지 탐색
        while (i < s.length()) {
            char x = s.charAt(i); // 첫 번째 문자를 x라고 함
            int xCount = 0; // x와 같은 문자의 개수를 저장할 변수
            int notXCount = 0; // x와 다른 문자의 개수를 저장할 변수

            // 문자열의 끝까지 혹은 x와 x가 아닌 문자의 개수가 같아질 때까지 탐색
            while (i < s.length()) {
                char currentChar = s.charAt(i); // 현재 문자

                // 현재 문자가 x와 같은지, 다른지에 따라 카운트를 증가
                if (currentChar == x) {
                    xCount++;
                } else {
                    notXCount++;
                }

                // x와 x가 아닌 문자의 개수가 같아지면 문자열 분해 완료, 카운트를 증가시키고 루프 종료
                if (xCount == notXCount) {
                    answer++;
                    break;
                }
                i++;
            }
            // 문자열의 끝까지 탐색했지만 x와 x가 아닌 문자의 개수가 같지 않으면 그대로 문자열을 분해하고 카운트 증가
            if(i == s.length() && xCount != notXCount) {
                answer++;
            }
            // 다음 문자열 분석을 위해 인덱스를 증가시킴
            i++;
        }
        return answer; // 분해된 문자열의 개수를 반환
    }
}

각 문자열을 분석하면서 첫 글자와 같은 글자의 수와 첫 글자와 다른 글자의 수가 같아지는 시점을 찾고

이러한 시점이 발생하면 해당 문자열을 분리하고 카운트를 증가시킨다.

만약 모든 문자를 검토한 후에도 두 카운트가 같지 않다면, 해당 문자열을 그대로 분리하고 카운트를 증가시킨다.

이 과정을 문자열의 끝까지 반복하며, 최종적으로 분리된 문자열의 수를 반환한다.

728x90
반응형
LIST

'알고리즘 > 프로그래머스 JAVA LV.1' 카테고리의 다른 글

둘만의 암호  (0) 2023.06.07
옹알이 (2)  (0) 2023.06.05
[카카오 인턴] 키패드 누르기  (0) 2023.05.30
대충 만든 자판  (0) 2023.05.29
신규 아이디 추천  (0) 2023.05.24
728x90
반응형
SMALL

To do

  • [x] 아침운동하기
  • [x] 코테5문제풀기
  • [x] 지원하기 5곳
  • [x] 알고리즘 검색 - 선형, 이진, 해싱, 이진트리 정리하기
  • [ ] 면접 연습하기

외부일정

  • [x] 집안일

코딩테스트를 푸면서 느꼈지만.. 한 문제에 여러 방법으로 푸는 방법이 있는 것과 같이 풀이 방법이 여러 개 있어, 이에 대해 더 깊이 이해하는 것이 필요하다고 느꼈습니다!

그래서 오늘은 알고리즘에대해 정리하고 예시 만들었습니다.

어렵습니당...

https://aihtnyc-h.tistory.com/entry/%EC%84%A0%ED%98%95-%EA%B2%80%EC%83%89Linear-Search

 

선형 검색(Linear Search)

선형 검색(Linear Search)은 가장 간단한 형태의 검색 알고리즘이다. 이 알고리즘은 주어진 데이터 집합에서 특정 값을 찾기 위해 처음부터 끝까지 순차적으로 검색하는 방식을 사용한다. 순차적으

aihtnyc-h.tistory.com

https://aihtnyc-h.tistory.com/entry/%EC%9D%B4%EC%A7%84-%EA%B2%80%EC%83%89Binary-Search

 

이진 검색(Binary Search)

이진 검색(Binary Search)은 정렬된 배열에서 특정 값을 효율적으로 찾는 검색 알고리즘이다. 이진 검색의 작동 원리는 다음과 같다: 먼저, 배열의 중간 인덱스에 위치한 값을 확인한다. 이 값이 찾

aihtnyc-h.tistory.com

https://aihtnyc-h.tistory.com/entry/%ED%95%B4%EC%8B%B1Hashing

 

해싱(Hashing)

해싱(Hashing)은 키-값 쌍을 저장하고 검색하는 데 사용되는 방법이다. 해싱은 데이터 구조인 해시 테이블을 사용하여 데이터를 저장하고 검색한다. 해싱의 핵심 개념은 해시 함수이다. 해시 함수

aihtnyc-h.tistory.com

https://aihtnyc-h.tistory.com/entry/%EC%9D%B4%EC%A7%84-%EA%B2%80%EC%83%89-%ED%8A%B8%EB%A6%ACBinary-Search-Tree-BST

 

이진 검색 트리(Binary Search Tree, BST)

이진 검색 트리(Binary Search Tree, BST)는 이진 트리의 한 종류로, 각 노드의 왼쪽 서브트리에는 해당 노드의 값보다 작은 값들을, 오른쪽 서브트리에는 해당 노드의 값보다 큰 값들을 저장하는 특징

aihtnyc-h.tistory.com

 

728x90
반응형
LIST

'일상 > TIL' 카테고리의 다른 글

JVM과 메모리 구조  (0) 2023.06.05
WOMEN WHO CODE Seoul  (0) 2023.06.03
컴퓨터 프로그래밍 언어  (0) 2023.05.29
L1, L2 및 L3 캐시의 차이점 : CPU 캐시는 어떻게 작동합니까?  (0) 2023.05.25
hackerrank  (0) 2023.05.24
728x90
반응형
SMALL

이진 검색 트리(Binary Search Tree, BST)는 이진 트리의 한 종류로, 각 노드의 왼쪽 서브트리에는 해당 노드의 값보다 작은 값들을, 오른쪽 서브트리에는 해당 노드의 값보다 큰 값들을 저장하는 특징을 가진다.

다음은 이진 검색 트리의 특징이다:

  1. 각 노드는 하나의 키(데이터)를 가지며, 이 키는 고유한 값을 가진다.
  2. 왼쪽 서브트리 (하위 트리)의 모든 키는 루트의 키보다 작다.
  3. 오른쪽 서브트리의 모든 키는 루트의 키보다 크다.
  4. 왼쪽과 오른쪽 서브트리 각각이 이진 검색 트리여야 한다.

이러한 속성 덕분에 이진 검색 트리에서는 데이터 검색, 삽입, 삭제 등의 연산을 효율적으로 처리할 수 있다. 이진 검색 트리에서의 검색 연산은 트리의 높이에 비례하는 시간 복잡도를 가지므로, 균형 잡힌 트리에서는 로그 시간 복잡도를 가지게 된다. 하지만 트리가 한쪽으로 치우쳐져 있는 경우(즉, 균형이 잘 잡혀있지 않은 경우) 검색 성능이 저하될 수 있다. 이런 문제를 해결하기 위해 AVL 트리, 레드-블랙 트리 등의 자가 균형 이진 검색 트리가 개발되었다.

예를 들어, 아래의 숫자들을 이진 검색 트리에 넣으면, 8, 3, 10, 1, 6, 14, 4, 7, 13

이것을 이진 검색 트리로 구성하면 다음과 같다.

        8
       / \\
      3  10
     / \\   \\
    1   6   14
       / \\  /
      4   7 13

이 트리는 다음의 성질을 만족한다:

  • 모든 노드는 유일한 값이다.
  • 왼쪽 서브트리의 모든 노드의 값은 루트의 값보다 작다.
  • 오른쪽 서브트리의 모든 노드의 값은 루트의 값보다 크다.
  • 모든 서브트리도 이진 검색 트리이다.

이 이진 검색 트리에서 어떤 노드를 찾으려면 어떻게 해야 할까? 예를 들어 7을 찾는다고 가정해 보면.

  • 먼저 루트에서 시작한다. 현재 노드가 8이고, 7은 8보다 작으므로 왼쪽 자식으로 이동한다.
  • 현재 노드는 3이다. 7은 3보다 크므로 오른쪽 자식으로 이동한다.
  • 현재 노드는 6이다. 7은 6보다 크므로 다시 오른쪽 자식으로 이동한다.
  • 이제 현재 노드는 7입니다. 원하는 값을 찾았으므로 검색을 종료한다.

이진 검색 트리는 데이터를 효율적으로 관리하고 검색하는 데 매우 유용하다. 그러나 트리가 균형을 잃어버릴 경우 검색 성능이 떨어질 수 있으므로 이를 보완하기 위한 다양한 이진 검색 트리(예: AVL 트리, 레드-블랙 트리)가 존재한다.

728x90
반응형
LIST

'CS > 알고리즘' 카테고리의 다른 글

큐(Queue)  (0) 2023.06.07
스택(Stack)  (0) 2023.06.07
해싱(Hashing)  (0) 2023.05.30
이진 검색(Binary Search)  (0) 2023.05.30
선형 검색(Linear Search)  (0) 2023.05.30

+ Recent posts