구현이 잘 안풀려서 코드업 기초 100제를 다시 풀어보기로 했다.
자주 쓰지 않아서 헷갈렸던 개념에 대해서 리뷰하고자 한다.
해당 문제는 if문으로 구현할 수 있지만 if문의 조건식 결과는 참, 거짓 두 가지밖에 없기 때문에 경우의 수가 많아질 경우 코드가 길어지고 처리시간도 많이 걸린다는 단점이 있다. 참고에 나와있듯이 switch-case문으로 구현하여 풀었는데 개인적으로 if문을 자주 써서 switch문의 제약조건이 헷갈렸다.
switch문은 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있어서 코드가 간결해지는 장점이 있다. 단, 제약조건이 있는데 switch문의 조건식 결과는 정수, 문자, 문자열이어야 한다. 또한, 조건식의 결과가 일치하는 값이 case문으로 이동하는데 case문의 값은 정수 상수만 가능하기 때문에 변수나 실수 리터럴을 쓸 수 없으며 중복되지 않아야 한다. (JDK1.7 이후 문자열이 허용됨)
import java.util.Scanner;
// 평가 입력받아 다르게 출력
public class c1069 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char c = sc.next().charAt(0);
switch (c) { // 조건식의 결과는 정수, 문자, 문자열만 가능
case 'A': // 정수 상수, 문자열 가능
System.out.println("best!!!");
break;
case 'B':
System.out.println("good!!");
break;
case 'C':
System.out.println("run!");
break;
case 'D':
System.out.println("slowly");
break;
default: // case를 제외한 나머지 모든 경우에 실행
System.out.println("what?");
}
}
}
16진수로 입력받고 16진수로 출력하는 문제이다. 값을 다른 형식으로 출력할 때는 형식화된 출력 printf() 메소드를 사용하면 된다.
Scanner의 nextInt() 메소드의 매개변수로 radix를 받을 수 있는데 매개변수로 받은 진법으로 변환해준다. (이 문제 풀면서 처음 안 사실) printf()에 지시자를 %x로 지정해서 16진 정수의 형식으로 출력하면 된다.
println()과 printf()에 성능차이가 있는지 궁금해서 찾아봤는데 관련 글이 없는 걸 보니 성능차이가 있는 것 같지는 않다. 값을 그대로 출력할 때는 println(), 다른 형식으로 변환해서 출력할 때는 printf()를 사용하자.
import java.util.Scanner;
// 16진수 구구단?
public class c1082 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(16); // 16진수로 입력받음
for (int i = 1; i < 16; i++) {
System.out.printf("%X*%X=%X%n", n, i, n * i); // %x : 16진 정수의 형식으로 출력
}
}
}
십자뒤집기가 도대체 뭐지? 하면서 문제 이해하는데만 30분 걸렸다. ㅎㅎ 다른 블로그 글을 봐도 설명이 없길래 유튜브 찾아보고 바로 이해했다.
해당 문제는 좌표로 주어진 가로 번호와 세로 번호의 바둑돌을 흰 -> 검 / 검 -> 흰으로 바꾸는 문제이다.
2차원 배열의 길이를 19*19로 선언하여 좌표를 -1 해주었고 가로 줄과 세로 줄의 바둑돌의 색을 바꿔주었다. 이 때, 가로 줄의 바둑돌이 흰색에서 검정으로 바뀌고 (1 -> 0) 또 한 번 세로 줄의 바둑돌이 바뀐다. (0 -> 1)
import java.util.Scanner;
// 바둑알 십자 뒤집기
public class c1097 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[][] board = new int[19][19];
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board.length; j++) {
board[i][j] = sc.nextInt(); // 바둑판
}
}
int n = sc.nextInt(); // 뒤집기 횟수
for (int i = 0; i < n; i++) {
// 뒤집기 좌표
int x = sc.nextInt() - 1;
int y = sc.nextInt() - 1;
for (int j = 0; j < board.length; j++) {
if (board[x][j] == 0) { // 가로
board[x][j] = 1;
} else {
board[x][j] = 0;
}
}
for (int j = 0; j < board.length; j++) {
if (board[j][y] == 0) { // 세로
board[j][y] = 1;
} else {
board[j][y] = 0;
}
}
}
for (int[] bb : board) {
for (int b : bb) {
System.out.printf("%d ", b);
}
System.out.println();
}
}
}