☕Java practice: 문자열/숫자 판별하기

yoondgu·2022년 4월 4일
0

Java practice

목록 보기
7/8

자바 연습문제 (문자열, 숫자 관련 API 활용)

1. 나열된 숫자에서 특정 조건에 부합하는 숫자찾기

  • 3의 배수면 Fizz, 5의 배수면 Buzz, 3과 5의 배수면 PizzBuzz를 출력하시오.

나의 풀이

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");
        }
      }
    }

2. 특정 문자열의 대칭여부 판별하기

예) 오디오, 기러기 등

나의 풀이

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는 정수이기 때문에,

  • len이 짝수일 때: 정수인 len/2 보다 1 작은 값까지 대입
  • len이 홀수일 때: 실수인 len/2에서 소수점을 절삭한 그 정수값까지 대입
    하기 때문에 굳이 내 풀이에서 홀/짝을 복잡하게 경우의 수를 나눠서 중앙을 설정한 것과 같은 결과가 나오기 때문이다.

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);
      }

3. 단어의 가운데 글자 출력하기

  • 단어의 길이가 홀수면 한글자, 단어의 길이가 짝수라면 가운데 2글자를 출력해야 한다.

나의 풀이

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);
    }
  }

0개의 댓글