본문 바로가기
👋국비 후기 모음👋 (이력도 확인 가능!)
개발/자바

자바 문자열에 특정문자 개수 구하기 / 영문자만 입력받기 (ASCII 코드활용) / 스캐너에서 char값 입력받기 (charAt())

by 킴뎁 2021. 1. 16.
728x90
반응형
Q. 문자열 값을 입력받고, 그다음 문자 하나를 입력받아 문자열 값 안에 입력문자가 몇 개 존재하는지 구해보자. (단, 영문자 사용) 

ex)

문자열 입력 : abbcccddddeeeee

문자 입력 : d

포함된 개수 : 4개

-------------------------------

문자열 입력 : abbcccdddd_123

영문자가 아닙니다.

 

처음 내가 작성한 코드 

Scanner sc = new Scanner(System.in);
System.out.print("문자열 입력 : ");
String str = sc.nextLine(); 

boolean isEng = false; // 영문자 여부 확인용 flag변수
  • 스캐너를 이용한 문자열 입력받기
  • 영문자인지 아닌지 저장하기 위한 flag변수 선언

- 영문자여부 확인용 코드

  * 영문자만 따로 입력받기 위해 찾아보다가 정규식? 그런것도 있던데 이해가 안가서 아스키코드를 활용함.

for(int i=0; i<str.length(); i++) {
	if(str.charAt(i)>64 && str.charAt(i)<91) {
		isEng = true;
	} else if(str.charAt(i)>96 && str.charAt(i)<123) {
		isEng = true;
	} else {
		isEng = false;
	}
}
if(isEng==false) {
	System.out.println("영문자가 아닙니다.");
} else {
  • str.length()를 이용해 입력받은 문자열 길이만큼 반복문을 반복.
  • str.charAt(i) - 입력받은 문자열의 i번째 char를 뜻함.
  • 영대문자는 char 숫자 65~90 // 영소문자 char 숫자 97~122.
  • Line 2 - 문자열의 i번째 char가 64보다 크고 91보다 작으면 영소문자. (isEng = true)
  • Line 4 - 문자열의 i번째 char가 96보다 크로 123보다 작으면 영대문자. (isEng = true)
  • 나머지는 영문자가 아님.

- 문자 개수 확인용 코드

} else {
	System.out.print("문자 입력 : ");
	char ch = sc.next().charAt(0);
			
	int count = 0;
			
	for(int i=0; i<str.length(); i++) {
		if(str.charAt(i)==ch) {
			count++;
		}
	}
	System.out.println("포함된 개수: " + count);
}
  • 영문자일 경우 찾고자하는 문자 하나를 입력받기.
  • Line 3 - 스캐너에서 char를 입력받기 위해선 charAt(0)를 사용. (nextChar()가 없음)
  • Line 5 - 문자 개수 확인용 변수 선언
  • 문자열 길이만큼 for문 반복.
  • if 문자열의 i번째 char가 입력받은 char ch와 같다면 count 1증가.
  • count 출력.

전체 코드

import java.util.Scanner;

public class Q {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("문자열 입력 : ");
		String str = sc.nextLine();
		
		boolean isEng = false;
		
		for(int i=0; i<str.length(); i++) {
			if(str.charAt(i)>96 && str.charAt(i)<123) {
				isEng = true;
			} else if(str.charAt(i)>64 && str.charAt(i)<91) {
				isEng = true;
			} else {
				isEng = false;
			}
		}
		if(isEng==false) {
			
			System.out.println("영문자가 아닙니다.");
			
		} else {
			
			System.out.print("문자 입력 : ");
			char ch = sc.next().charAt(0);
			
			int count = 0;
			
			for(int i=0; i<str.length(); i++) {
				if(str.charAt(i)==ch) {
					count++;
				}
			}
			System.out.println("포함된 개수: " + count);
		}
	}	
}
--------------
결과 1
문자열 입력 : abbcccdddd
문자 입력 : d
포함된 개수: 4
--------------
결과 2
문자열 입력 : abc123
영문자가 아닙니다.
--------------
결과 3 ----------오류 발생.
문자열 입력 : abc_test
문자 입력 : t
포함된 개수: 2
--------------
결과 4
문자열 입력 : _
영문자가 아닙니다.

결과 3을 보면 오류가 난다. 분명 '_'가 포함되어있으므로 결과 "영문자가 아닙니다"가 도출되고 실행이 종료되어야 하는데 계속 실행이 된다. 그래서 결과 4처럼 '_'만 입력해봤는데 문제없이 잘 출력되었다. 이 부분이 이해가 안 돼서 강사님께 질문을 남겼다.

피드백 확인! 이제 코드 수정할 차례.


코드 수정

for(int i=0; i<str.length(); i++) {			
	// 영문자가 아닐때
	if(!(str.charAt(i)>96 && str.charAt(i)<123) //소문자가 아닐때
	    && !(str.charAt(i)>64 && str.charAt(i)<91)) { //대문자가 아닐때
		isNotAlpha = true;
		break;
	}
}
if(isNotAlpha==true) {
	System.out.println("영문자가 아닙니다.");
} else {			
  • 영문자일 때 그냥 넘어갈 것.
  • 소문자와 대문자를 구하는 조건에 각각 !를 붙여 소문자가 아닐 때와 대문자 아닐때를 동시에 만족시키는(&&) 조건
  • 소문자가 아니고 대문자도 아닐때 isNotAlpha = true (영문자가 아닙니다 true) // break; for문 종료.

최종본

import java.util.Scanner;

public class Q {
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		System.out.print("문자열 입력 : ");
		String str = sc.nextLine();
		
		boolean isNotAlpha = false;
		
		for(int i=0; i<str.length(); i++) {
			
			// 영문자가 아닐때
			if(!(str.charAt(i)>96 && str.charAt(i)<123) //소문자가 아닐때
				&& !(str.charAt(i)>64 && str.charAt(i)<91)) { //대문자가 아닐때
				isNotAlpha = true;
				break;
			}
		}
		if(isNotAlpha==true) {
			
			System.out.println("영문자가 아닙니다.");
			
		} else {
			
			System.out.print("문자 입력 : ");
			char ch = sc.next().charAt(0);
			
			int count = 0;
			
			for(int i=0; i<str.length(); i++) {
				if(str.charAt(i)==ch) {
					count++;
				}
			}
			System.out.println("포함된 개수: " + count);
		}
	}	
}
-----------------
결과값
문자열 입력 : apple
문자 입력 : p
포함된 개수: 2
-----------------
결과값
문자열 입력 : _
영문자가 아닙니다.
-----------------
문자열 입력 : abc_test
영문자가 아닙니다.

 

오류 없이 결과가 잘 도출되었다. 아직 강사님이 이 문제 해설은 안 해주셨고 주말 동안 한 번 풀어보라고 해서 풀었는데 이러면서 점점 느는 거 같아 기분이 좋다. 아직 의문인 건 왜 내가 작성한 코드가 그런 오류가 나는지 모르겠다는 점이다. 이 부분에 대해서 질문을 했지만 주말이라 바쁘신 것 같다. 이 부분도 정확히 분석하고 알아야 되는데 얼른 답변을 주셨으면 좋겠다~~. 

 

kimdevel.tistory.com/40?category=909475

 

자바 국비 7일차. for문의 기본 중 기본 별찍기!!

21.01.15.금 드디어 별찍기 문제를 내셨다. 뭔가 악몽이랄까...? 저번 모 학원에 무료특강 때 별찍기를 나갔었는데 멘붕의 연속이었다. 아주 기본적인 것도 못 짰었던.. 그로부터 두달정도가 지난

kimdevel.tistory.com

 

반응형
👋국비 후기 모음👋 (이력도 확인 가능!)

댓글