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
반응형
'개발 > 자바' 카테고리의 다른 글
자바 if문과 switch문을 비교해보자. (0) | 2021.01.17 |
---|---|
자바 별찍기 - 무서워하지 말자. 차근차근 이해해보자 (1) | 2021.01.17 |
자바 반복문 예제들 (최소공배수, 최대공약수, 1~n 사이의 소수 구하기) (0) | 2021.01.14 |
자바 반복문 (for문 / while문 / do-while문), 구구단 표현하기. (0) | 2021.01.14 |
맥에서 자바 openjdk8 (jdk 1.8) or 최신버전 jdk 설치하기 (0) | 2021.01.10 |
댓글