`문자열안에 문자가 2개 이상 존재하는 문자의 갯수를 출력하기` 이 문장을보면,
우리는 이에맞는 알고리즘이 어떤것들이 있는지 떠올릴 수 있는가?
나는 이러한 알고리즘이 생각났다.
1) 문자열의 갯수만큼 문자열의 맨앞 문자 하나를 문자열 전체를 순환하며 비교
2) 비교하여 갯수들이 몇개있는지 확인하고 이 과정을 반복함
물론 위의 방법이 좋긴하지만, 우리는 더 효율적인 방법이 어떠한 것들이 있는지 잘 생각해보면, 다음과 같다.
1) 문자열의 갯수만큼 문자열안에 존재하는 문자하나를 기준으로 삼는다.
2) 기준이되는 문자를 문자열안에서 전부 제거한다. 그리고 그 제거한 갯수를 센다.
3) 문자열의 갯수만큼 문자열안에 존재하는 문자를 제거했으면, 비교할 데이터들이 줄어들었다. 즉, 문자열안에 문자들끼리 비교가 끝난 것은 제거하여 더 빠르고 복잡하지 않게 계산을 해주어야한다.
다음의 코드들을 살펴보자
예제) 문자열에 문자가 2개이상있는 문자들의 갯수를 출력하시오.
- package org.java.project.subproject1;
- import java.util.Scanner;
- class StrOverlap{
- public static void StrCounting(String s) {
- System.out.println("\n\"" + s+"\"");
- char str; // 기준점이 되는 문자
- int i = 0;
- int strExist = 0; // 중복되는 문자가 있는경우 0, 없는경우 -1
- int currentLen; // 중복된 문자가 있는경우 제거하기 전 길이
- int duplicateCount = 0; // 중복된 문자의 갯수
- String delStr = null;
- while(s.length() != 0)
- {
- str = s.charAt(0);
- System.out.println("\n"+ ++i +") Search : " + str);
- s = s.substring(1, s.length());
- strExist = s.indexOf(str); // 존재한다면 배열 인덱스값, 존재하지 않는다면 -1
- if(strExist != -1)
- {
- currentLen = s.length();
- delStr = ""+str;
- s = s.replaceAll(delStr, ""); // 탐색할 문자가 존재하는 위치를 빈공간 즉 제거함.
- duplicateCount = currentLen - s.length() + 1; // 중복제거된 name.length()값이 몇개인지 세줌.
- System.out.println("\""+str + "\" is a duplicate of : " + duplicateCount);
- }
- else {
- System.out.println("Only one exists");
- }
- }
- }
- }
- public class Exam {
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- System.out.print("Input String : ");
- String s = sc.next();
- StrOverlap.StrCounting(s);
- }
- }
▶실행결과
Input String : Bananajoke
"Bananajoke"
1) Search : B
Only one exists
2) Search : a
"a" is a duplicate of : 3
3) Search : n
"n" is a duplicate of : 2
4) Search : j
Only one exists
5) Search : o
Only one exists
6) Search : k
Only one exists
7) Search : e
Only one exists
위 처럼 문자열 Bananajoke를 입력받으면 다음과 같이 결과가 나온다.
그래서 문자열들을 출력하고 계산시간까지 효율적으로 하기위해서는
하나의 문자를 전부다 탐색하고 이에 겹치는 문자들은 전부 제거하고 그다음 값을 비교하면서 찾아갈 수 있다.
천재 ㅜ ㅜ
답글삭제