public class Quiz1 {
public static void main(String[] args) {
int[] numbers = new int[30];
int number = 0;
for (int i=0; i<30; i++) {
number++;
numbers[i] = number;
}
fizzBuzz(numbers);
}
public static void fizzBuzz(int[] numbers) {
// TODO 3의 배수면 Fizz, 5의 배수면 Buzz, 3과 5의 배수면 PizzBuzz를 출력하시오.
for (int number : numbers) {
if (number%3 == 0 && number%5 != 0) {
System.out.println(number + " Fizz");
}
if (number%3 != 0 && number%5 == 0) {
System.out.println(number + " Buzz");
}
if (number%15 == 0) {
System.out.println(number + " PizzBuzz");
}
}
}
}
15의 배수인지를 먼저 체크하면, if문 내의 조건문을 더 간단하게 작성할 수 있다.
public static void fizzBuzz(final int[] numbers) {
for (int number : numbers) {
// 15의 배수는 3과 5의 배수이기도 하기 때문에 먼저 15의 배수인지부터 체크해야 합니다.
// 15의 배수인 경우 "FizzBuzz"만 출력하고 3의 배수인지, 5의 배수인지는 체크하지 않는다.
if (number%15 == 0) {
System.out.println(number + " FizzBuzz");
} else if (number%3 == 0) {
System.out.println(number + " Fizz");
} else if (number%5 == 0) {
System.out.println(number + " Buzz");
}
}
}
예) 오디오, 기러기 등
public class Quiz2 {
public static void main(String[] args) {
phrasePalindrom("홍길동");
phrasePalindrom("오디오");
phrasePalindrom("기러기");
}
public static void phrasePalindrom(String word) {
// 문자열을 앞으로 뒤로부터 읽어도 똑같은 문자면 true를 출력한다.
// 길이가 3인 문자열이라면 첫글자, 마지막 글자만 비교하면 되지만 그 이상일 경우도 고려해야 한다.
// 대칭 여부를 확인하는 것이므로 문자열의 중앙을 기준으로 절반만 검사하면 된다.
// 이 때 문자열 길이의 홀짝에 따라 수식이 달라진다.
int endNum;
if (word.length()%2 == 0) {
endNum = word.length()/2;
} else {
endNum = (word.length()+1)/2;
}
for (int i=0; i<endNum ; i++) {
int symmetricIndex = word.length()-(i+1);
if (word.charAt(i) != word.charAt(symmetricIndex)) {
System.out.println(false);
return;
}
}
System.out.println(true);
}
}
단어 길이의 홀수/짝수 여부는 고려하지 않아도 된다.
어차피 for문의 i는 정수이기 때문에,
word.length()는 변경하지 않을 값이므로 final을 붙여준다.
단어의 대칭 여부를 boolean 변수에 담아 더 깔끔하게 작성할 수 있다.
public static void phrasePalindrom(final String[] words) {
for (String word : words) {
final int len = word.length();
// 정반대의 위치의 문자가 같은 문자인지 여부를 저장하는 변수
// 반복문을 수행하면서 한번이라도 정반대위치의 문자가 서로 다르면 isEquals는 false가 된다.
boolean isEquals = true;
for (int i = 0; i < len/2; i++) {
if (word.charAt(i) != word.charAt(len - 1 - i)) {
isEquals = false;
}
}
System.out.println(word + " : " + isEquals);
}
public class Quiz4 {
public static void main(String[] args) {
middleCharacter("서울특별시");
middleCharacter("중앙HTA학원");
middleCharacter("대용량데이터베이스솔루션");
}
public static void middleCharacter(String word) {
// 단어의 가운데 글자를 출력하기
String middle = "";
if (word.length()%2 == 0) {
int middleIndex = word.length()/2;
middle = word.substring(middleIndex-1,middleIndex+1);
} else {
int middleIndex = (word.length()-1)/2;
middle = word.substring(middleIndex, middleIndex+1);
}
System.out.println(middle);
}
}
나의 풀이에서는 짝수 길이 글자의 가운데 2글자를 구할 때
int middleIndex = word.length()/2;
middle = word.substring(middleIndex-1,middleIndex+1)
이렇게 썼는데, 아래와 같이 매개변수에 쓰이는 값에 이름을 부여하는 것이 의미가 더 정확하게 전달된다.
문자의 길이가 홀수인 경우 중간위치를 구할 때는
Math.ceil
메소드를 활용할 수 있다.
double Math.ceil(double value) 는 실수의 천정값을 반환하는 정적 메소드이다.
public static void middleCharacter(final String word) {
final int len = word.length();
String value = null;
if (len%2 == 0) {
// 문자열의 갯수가 짝수개면
// 중간값을 기준으로 앞뒤 문자를 조회한다.
int begin = len/2 - 1;
int end = len/2 + 1;
value = word.substring(begin, end);
} else {
// 문자열의 갯수가 홀수개면 중간위치에 있는 문자를 조회한다.
// double Math.ceil(double value)는 천정값을 반환하는 정적메소드다.
// 2.0 < x <= 3.0, 실수 x의 범위가 보기와 같을 때 항상 3.0을 반환한다. (반올림값과 차이가 있다.)
int position = (int) Math.ceil(len/2.) - 1;
value = String.valueOf(word.charAt(position));
}
System.out.println("가운데 글자: " + value);
}
}