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