2018년 9월 20일 목요일

java 문자열 안에 문자2개이상 존재 할 경우 출력하기

이번시간에는 자바로 문자열안에 문자의 갯수가 2개이상인것에 대해서 살펴보자.

`문자열안에 문자가 2개 이상 존재하는 문자의 갯수를 출력하기` 이 문장을보면,
우리는 이에맞는 알고리즘이 어떤것들이 있는지 떠올릴 수 있는가?

나는 이러한 알고리즘이 생각났다.

1) 문자열의 갯수만큼 문자열의 맨앞 문자 하나를 문자열 전체를 순환하며 비교
2) 비교하여 갯수들이 몇개있는지 확인하고 이 과정을 반복함

물론 위의 방법이 좋긴하지만, 우리는 더 효율적인 방법이 어떠한 것들이 있는지 잘 생각해보면, 다음과 같다.

1) 문자열의 갯수만큼 문자열안에 존재하는 문자하나를 기준으로 삼는다.
2) 기준이되는 문자를 문자열안에서 전부 제거한다. 그리고 그 제거한 갯수를 센다.
3) 문자열의 갯수만큼 문자열안에 존재하는 문자를 제거했으면, 비교할 데이터들이 줄어들었다. 즉, 문자열안에 문자들끼리 비교가 끝난 것은 제거하여 더 빠르고 복잡하지 않게 계산을 해주어야한다.

다음의 코드들을 살펴보자


예제) 문자열에 문자가 2개이상있는 문자들의 갯수를 출력하시오.
  1. package org.java.project.subproject1;
  2.  
  3. import java.util.Scanner;
  4.  
  5. class StrOverlap{
  6.     public static void StrCounting(String s) {
  7.         System.out.println("\n\"" + s+"\"");
  8.         char str;  // 기준점이 되는 문자
  9.         int i = 0;
  10.         int strExist = 0; // 중복되는 문자가 있는경우 0, 없는경우 -1
  11.         int currentLen;  // 중복된 문자가 있는경우 제거하기 전 길이
  12.         int duplicateCount = 0; // 중복된 문자의 갯수
  13.         String delStr = null;
  14.         while(s.length() != 0)
  15.         {
  16.             str = s.charAt(0);
  17.             System.out.println("\n"+ +++") Search : " + str);
  18.             s = s.substring(1, s.length());
  19.             strExist = s.indexOf(str); // 존재한다면 배열 인덱스값, 존재하지 않는다면 -1
  20.  
  21.             if(strExist != -1)
  22.             {
  23.                 currentLen = s.length();
  24.                 delStr = ""+str;
  25.                 s = s.replaceAll(delStr, ""); // 탐색할 문자가 존재하는 위치를 빈공간 즉 제거함.
  26.                 duplicateCount = currentLen - s.length() + 1; // 중복제거된 name.length()값이 몇개인지 세줌.
  27.                 System.out.println("\""+str + "\" is a duplicate of : " + duplicateCount);
  28.             }
  29.             else {
  30.                 System.out.println("Only one exists");
  31.             }
  32.         }
  33.     }
  34. }
  35. public class Exam {
  36.     public static void main(String[] args) {
  37.  
  38.         Scanner sc = new Scanner(System.in);
  39.         System.out.print("Input String  :   ");
  40.         String s = sc.next();
  41.  
  42.         StrOverlap.StrCounting(s);
  43.     }
  44. }
 
▶실행결과

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를 입력받으면 다음과 같이 결과가 나온다.

그래서 문자열들을 출력하고 계산시간까지 효율적으로 하기위해서는
하나의 문자를 전부다 탐색하고 이에 겹치는 문자들은 전부 제거하고 그다음 값을 비교하면서 찾아갈 수 있다.

댓글 1개:

[Java] N-I/O(Non-Blocking) 파일 읽기 쓰기 - GatheringByteChannel, ScatteringByteChannel, ByteBuffer 사용.

우리는 지금까지 다음과 같이 살펴보았다. 1.  InputStream / OutputStream : 입, 출력 스트림을 바이트로 처리하여 읽기, 쓰기. 2.  FileInputStream / FileOutputStream : 입, 출력 스트림을 ...