【Java 알고리즘 수행③】 분기 처리 ~FizzBuzz와 윤년~

FizzBuzz



분기 처리의 명문, FizzBuzz
1~입력된 값까지의 수열로, 하기 조건에 따라 출력을 할 수 있다고 하는 것
(실무에서는 확실하지 않은 요건입니다만, 렛츠 알고리즘!)
  • 3의 배수이고 5의 배수일 때는 "FizzBuzz"
  • 3의 배수일 때는 "Fizz"
  • 5의 배수일 때 "Buzz"

  • 사고 방식으로서는 매우 간단하고, 배수이면 즉 그 수로 나눌 수 있다는 것이기 때문에
    3의 배수라면, 3으로 나눈 때의 나머지가 0이면 된다고 합니다.

    algo.java
    import java.util.*;
    
    public class Main {
            public static void main(String[] args) {
                    Scanner sc = new Scanner(System.in);
                    int number = sc.nextInt();
                    //iは1からスタートして、入力値まで繰り返し処理を行う
                    for(int i = 1; i <= number; i++){
                            if(i % 15 == 0){
                                    System.out.println("FizzBuzz");
                            }else if (i % 3 == 0){
                                    System.out.println("Fizz");
                            }else if (i % 5 == 0){
                                    System.out.println("Buzz");
                            }else{
                                    System.out.println(i);
                            }
                    }
            }
    }
    
    

    질리지 않을 것이며 해설 할 정도가 아니지만,
    개인적으로 갱신문에 수열의 수를 제어시키는 것으로, 비교적 깨끗하게 한 것이 아닐까 생각하고 있습니다. (어느 아마추어 도어를 받아 들여주세요)
    初期化文 → 条件文 → 繰り返し処理 → 更新文라고 하는 Java의 반복 문법을 사용하면 정리해 가는 것이 편리하네요. . !

    i를 1부터 시작시켜 조건분을 i <= 入力値로 하면 i만으로 갈 수 있었네요 땀
    (@ 후지타 노조무 씨, 지적 해 주셔서 감사합니다!)

    사고방식으로는 아래의 이미지와 같은 조건분기를 else-if문을 사용하여 표현했습니다.
    3에서도 5에서도 깨지는 것 = 15의 배수이므로, 이것을 최초의 조건식에 가져오지 않으면 기대대로 갈 수 없기 때문에 주의입니다.



    윤년



    입력된 해가 윤년인지 판정하라고 하는 것
    윤년의 조건은 아래와 같습니다만, 죄송합니다 여기까지는 구구했습니다. .
  • 4로 나누지 않으면 평년
  • 4로 나눌 수 있지만 100으로 나눌 수없는 경우 윤년
  • 4와 100으로 나누어도 400으로 나누어지는 경우는 윤년


  • 위의 조건이 갖추면 이제 무적이다! 그리고 상태를 타고있는 그대로 쓴 코드가 여기

    algo.java
    
    import java.util.*;
    
    public class Main {
            public static void main(String[] args) {
                    Scanner sc = new Scanner(System.in);
                    int year = sc.nextInt();
                    if(year % 4 == 0){
                            if (year % 100 == 0 ){
                                    if (year % 400 == 0){
                                     System.out.println("閏年です");
                                     }else{
                                            System.out.println("閏年ではありません");
                                            }
                            }else{
                                    System.out.println("閏年です");
                                    }
                    }else{
                            System.out.println("閏年ではありません");
                    }
            }
    }
    
    

    무심하고 조건에 따라 if문을 나눈 결과 이런 식으로 되어 버렸습니다. .
    이것이 중첩 코드라는 아무도 행복하지 않은 코드입니다.
    무철포에 쓰는 것으로 어떻게 추워져 버리는지 알았더니, 이것을 개선하기 위해 추가된 else-if문을 사용해 봅시다.

    중첩 개선하기



    algo.java
    import java.util.*;
    
    public class Main {
            public static void main(String[] args) {
                    Scanner sc = new Scanner(System.in);
                    int year = sc.nextInt();
                    if(year % 4 != 0){
                            System.out.println("閏年ではありません");
                    }else if (year % 100 != 0 ){
                            System.out.println("閏年です");
                    }else if (year % 400 == 0){
                            System.out.println("閏年です");
                    }else{
                            System.out.println("閏年ではありません");
                    }
    
            }
    }
    

    먼저 4로 나누지 않으면 그대로 평년 판정합니다.
    4로 나누어져도 100으로 나누지 않으면 윤년 판정.
    4 100 400으로 나누어진 경우는 윤년 판정.
    4 또한 100으로 나누어도 400으로 나누지 않으면 평년 판정.

    라고 하는 흐름으로 논리도 코드의 외관도 상당히 깨끗이 합니다.

    배운 것


  • 조건이 복수 있는 경우에서도, true/false로 조건 분기시키면서, 마지막 else 부분의 결과가 공통으로 체결되도록 하면 정리하기 쉽다.
  • 로직이 위에서 아래로 일관되는 ​​형태까지 정리할 수 있으면, else-if문으로 정리해 쓰는 것으로 중첩을 회피하면서, 깔끔한 코드를 쓸 수 있다.

  • 역시 우선은 움직이는 코드를 써보고, 거기에서 더 깨끗이 쓸 수 없는 것인가? 라는 사고 흐름은 나쁘지 않다. .
    라고 생각하면서도, 자신의 첫 손이 매번 너무 밀어도 조금 스마트하게 할 수 없는 것이라고도 생각해 버리는군요 땀
    계속 노력해 갑니다!

    좋은 웹페이지 즐겨찾기