TIL 2022-01-09

그린·2022년 2월 2일
0

TIL

목록 보기
6/47

1. 오늘 학습한 내용

코드업 기초 100제 1071 ~ 1083번

사용 언어 : 자바

2. 오늘 알게 된 내용

  • 1071번

    • goto 명령문 (자바에는 없는 기능)

      • goto 이름 :

        "이름 :" 이 작성된 곳으로 프로그램의 실행 흐름을 바꾸어준다. 
        
        :(콜론)이 붙어있는 부분을 label, 레이블이라고 한다. 레이블은 특별한 선언 없이 사용할 수 있으며 언더바(_)나 영문자로 시작하면 된다.
        레이블은 한 단어처럼 공백없이 모두 붙여 써야 한다.
        int n;
        reload: //레이블은 콜론(:)으로 끝내고, 일반적으로 들여쓰기를 하지 않는다.
        scanf("%d", &n);
        printf("%d", n);
        if(n!=0) goto reload; //reload라고 적혀있는 레이블로 실행 이동

        +) 나의 풀이

        문제에 반복문을 사용하지 말고 풀라고 써있는데 자바에는 goto 문이 없어서 고민이 되었다. 질의응답게시판에서 어떤 분께서 재귀함수를 쓰면 반복문 없이도 풀 수 있다고 하셔서 재귀함수를 이용해 해결하였다.

        import java.util.Scanner;
        
        public class Main {
            static Scanner scanner = new Scanner(System.in);
            static int num;
            public static void main(String[] args) {
                print();
            }
        
            public static void print() {
                num = scanner.nextInt();
                if (num == 0) return;
                else {
                    System.out.println(num);
                    print();
                }
            }
        }
  • 1072번

    • ExceptionInInitializerError

      • 원인 : static으로 선언된 변수 중 초기화가 안 되어 있는 것이 있는 경우

      • 조언 : 알맞은 초기화를 시켜주거나 변수의 위치를 자동 초기화가 가능한 메소드 밖의 클래스 변수로서 사용한다.

        (출처 : https://hulbo.tistory.com/8)

    • NumberFormatException

      static int count = Integer.parseInt(scanner.nextLine());

      처음에는 위와 같이 직접 line 단위로 받으려고 했는데 소스를 제출하면 "15 "에 대해 NumberFormatException 가 발생한다고 떴다. 따라서 위의 nextLine()을 next()로 변경시켜서 스페이스 공백들을 받지 않도록 설정했더니 잘 해결되었다.

  • 1078번

    • while문에서 break;는 아예 while문 자체를 탈출하는 것이다!
  • 1082번

    • 16진수 입력받기

      처음에 나는 먼저 문자로 입력받고 이를 16진수 숫자로 변환시킨 후 16진수 문자로 변환시켜서 출력하는 방식으로 해결했다.

      import java.util.Scanner;
      
          public class Main {
              public static void main(String[] args) {
                  Scanner scanner = new Scanner(System.in);
                  String input = scanner.next();
                  int num1 = Integer.parseInt(input, 16);
                  String input2 = Integer.toHexString(num1).toUpperCase();
      
                  for (int i = 1; i <= Integer.parseInt("F", 16); i++){
                      System.out.println(input2 + "*" + Integer.toHexString(i).toUpperCase() + "="+ Integer.toHexString(num1*i).toUpperCase());
                  }
              }
          }

      풀면서도 너무 비효율적인 방법인 것 같아서 검색해보았는데 그냥 간단하게

      scanner.nextInt(16);

      을 하면 16진수로 입력받을 수 있다는 것을 알게 되었다.(충격이였다)

      문제 풀 때는 구글링했을 때 이 방법을 발견하지 못했는데 이렇게나 간단하게 해결할 수 있었다니 조금 허무하긴 하다. 그래도 이 방법 머리 속에 잘 각인시켜야겠다!

      scanner.nextInt(진법)

      기억하자!

  • 16진수 대문자로 출력하기

    나는 직접 toUpperCase()를 썼는데, 찾아본 효율적인 풀이에서는 printf를 쓰고 %X를 이용해서 바로 간단하게 16진수를 대문자로도 표현하고 있었다.(충격..)

    너무 비효율적인 방법으로만 코딩하고 있었다.

    printf 적극적으로 이용하고, %X를 사용하면 16진수를 대문자로 바로 간단하게 나타낼 수 있다는 사실 기억하자!

  • 효율적인 풀이 방법

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt(16);
    
            for (int i = 1; i < 16; i++){
                System.out.printf("%X*%X=%X\n", n, i, n*i);
            }
        }
    }

    (출처 : https://yongku.tistory.com/entry/%EC%BD%94%EB%93%9C%EC%97%85-%EA%B8%B0%EC%B4%88-100%EC%A0%9C-1082%EB%B2%88-16%EC%A7%84%EC%88%98-%EA%B5%AC%EA%B5%AC%EB%8B%A8-%EC%9E%90%EB%B0%94JAVA)

3. 느낀 점

반복에 관한 내용들을 평소에 자주 쓰던 반복문을 사용하지 않고 해결하는 방법이 조금 어려웠다. 재귀 등등의 방법으로 풀어보면서 조금 더 문제해결력이 커진 것 같은 느낌이 들었다. 기본적인 부분에서 막혀서 오래 걸릴 때가 있었는데 오류가 난 부분을 명확히 잘 보고 원인을 잘 파악해야겠다.

profile
기록하자

0개의 댓글

Powered by GraphCDN, the GraphQL CDN