반응형
모음의 개수를 구하는 백준 알고리즘 문제이다.
거의 다 풀었는데 계속 아래와 같이 나왔다 ..
1. sum 값은 결국 나옴,
2. 디버깅 모드로 확인해보니 How / are / you 이런식으로 따로따로 단어별로 값을 확인하고 있었다.
그럼 line 으로 문장을 scan 해오도록 수정해야한다.
import java.util.Scanner;
public class B1264 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char ch;
char[] array = {'a','e','i','o','u'};
int sum = 0;
while(true){
String line = sc.next();
int cnt = 0;
if (line.equals("#")){
break;
}
for (int i = 0; i<line.length(); i++){
line = line.toLowerCase();
ch = line.charAt(i);
for(char element : array){
if(element == ch){
cnt ++;
}
}
}
sum += cnt;
if (sum == 0){
System.out.println(0);
} else {
System.out.println(sum);
}
}
}
}
풀이 해설
sc.next(); sc.nextline();
sc.next(); 는 스페이스바를 기준으로 단어 하나씩 받아온다.
sc.nextline(); 는 엔터를 기준으로 한 문장을 받아온다.
아래와 같이 입력해주니 의도한대로 출력되었다.
char[] array = {'a','e','i' ... };
ch == 'a' || ch == 'e' 이런식으로 작성하면 가독성도 안좋고, 한끝 차이지만 유지보수에 어려움도 있을 것 같다. (물론 유지보수할 코드는 아니지만)
그래서 하나의 문장 안에 a,e,i,o,u 가 있는지 확인할 방법을 고민했다. Okky 에서 String 배열 하나 선언을 해서 해당 내용과 비교하라는 힌트를 얻었다. 그런데 문제가 발생했다. 나는 char 이고 .. asList 를 사용할 수 없는데?
그래서 for-each 루프를 사용했다. for-each 루프 사용법 보러가기
line.toLowerCase();
대문자로 입력되면 array 의 내용과 맞지 않으니 char 타입으로 쪼개기 전에 toLowerCase 로 소문자로 변경해주었다.
line.charAt(i);
모음인지 아닌지 확인하기 위해 line 의 단어를 한글자씩 쪼개 char 로 변경하였다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char ch;
char[] array = {'a','e','i','o','u'};
while(true){
String line = sc.nextLine();
int cnt = 0;
if (line.equals("#")){
break;
}
for (int i = 0; i<line.length(); i++){
line = line.toLowerCase();
ch = line.charAt(i);
for(char element : array){
if(element == ch){
cnt ++;
}
}
}
System.out.println(cnt);
}
}
}
참고
반응형