본문 바로가기
개발일지/JAVA

JAVA 사용자가 입력한 문자열 횟수 세기

by 세 미 콜 론 2021. 5. 18.
728x90
반응형

Q. 사용자로부터 문자열을 받아서 서로 다른 단어가 몇 번이나 등장하였는지를 세는 프로그램을 작성하라. 대소문자 구별하지 않도록 한다.

[실행 예]
문장을 입력하세요 : Easy come, easy go.
easy 2
come 1
go 1

package test.edu.semicolon;

import java.util.HashMap;
import java.util.Scanner;

public class main {

	public static void main(String[] args) {
		
		//1. 사용자로부터 문장 입력받기 
		Scanner scan = new Scanner(System.in);
		System.out.print("문장을 입력하세요 : ");
        String str = scan.nextLine();
        
        //2. String 배열에 특수문자 제거하기, String 모두 소문자로 변경
        str = str.replaceAll("[-+.^:,]","");
        str = str.toLowerCase();
        
        //3. String 배열에 split하여 넣어주기
        String[] strList = str.split(" ");
        
        //4. 맵 선언(키 : 문자, 값 : 횟수)
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        
        //5. 맵에 모든 문자열 횟수 0회로 넣기
        for (int i = 0; i < strList.length; i++) {
			map.put(strList[i], 0);
		}
        
        //6. for문으로 String 배열 반복
        for (int i = 0; i < strList.length; i++) {
        	
        	//배열에서 첫번째 문자열의 횟수 가져오기
        	int cnt = map.get(strList[i]);
        	//횟수 증가
        	cnt += 1;
        	//값 다시 넣어주기
        	map.put(strList[i], cnt);
        	
		}
        
        System.out.println(map.toString());
		
	}

}

로직은 크게 6단계로 나눌 수 있습니다. 한 단계 한 단계 설명해보겠습니다. 

728x90

1. 사용자로부터 문장 입력받기
사용자에게 syso로 문장을 입력하라는 안내를 합니다. 같은 줄에 문장을 받을 예정이기 때문에 println이 아닌 print를 이용하였습니다.

2. String 배열에 특수문자 제거하기, String 모두 소문자로 변경
특수문자는 검색 대상이 아니기 때문에 특수문자를 제거합니다. 이 때 replaceAll 메소드를 사용하였으며, 정규식을 이용해서 -+^:,에 대해서 빈값으로 치환하였습니다. 추가하고 싶은 특수문자가 있다면 대괄호 안에 추가하면 됩니다. 또한 toLowerCase()를 이용해서 String을 모두 소문자로 변경하였습니다. 취향에 따라 toUpperCase()를 이용할 수 있으나 예시에서 easy를 소문자로 표시하였기 때문에 소문자로 변경하였습니다.

3. String 배열에 split하여 넣어주기
공백 문자를 기준으로 단어를 구분하기 때문에 split(" ")을 이용하여 배열에 넣어주었습니다.

4. 맵 선언(키 : 문자, 값: 횟수)
몇 개의 단어가 등장할지 모르기 때문에 키와 값을 관리할 수 있는 HashMap을 선언하였습니다. 키로는 문자, 즉 단어가 들어갈 것이고 횟수는 값으로 들어갈 예정입니다.

5. 맵에 모든 문자열 횟수 0회로 넣기
위에서 선언한 맵에 모든 문자열 횟수 0으로 셋팅해줍니다. easy가 2번 들어가지만 map의 특성 상 중복 키는 발생하지 않으며, 뒤에 넣은 키와 값으로 셋팅 됩니다.

6. for문으로 String 배열 반복
for문으로 String 배열을 반복하면서 기존에 map에 들어있는 횟수를 먼저 가져온 뒤 횟수를 증가 시키고 다시 map에 넣어주도록 하였습니다. 예시였던 Easy come, easy go. 를 이용해 디버그 해보자면 아래와 같습니다.

i strList[i] cnt
0 easy 1
1 come 1
2 easy 2
3 go 1

 

실행결과 

 

좋은 답변이 되었길 기대합니다. 

728x90
반응형

댓글