[백준] 3003번: 킹, 퀸, 룩, 비숍, 나이트, 폰 - JAVA [자바]
https://www.acmicpc.net/problem/3003
- 문제
기본 조건문만 안다면 그리 어렵지 않은 문제다.
- 알고리즘 [접근 방법]
체스.. 예전에 진짜 자주 두었었던 게임이다..
킹 1, 퀸 1, 룩 2, 비숍 2, 나이트 2, 폰 8로 총 16개의 말을 활용하여 상대 말들을 하나씩 따내면서 체크메이트를 만들거나 스테일메이트 등 기본적으로 왕이 움직일 수 없게 만들거나 잡힐 수 밖에 없는 상황을 만들어 이기면 된다.
아무튼.. 위 본문에도 나와있듯 각 체스말들의 개수는 고정되어있고, 입력으로는 현재 갖고 있는 말의 개수가 된다.
그래서 실제 필요한 체스말의 개수에 맞추어 그 차를 구하면 되는 것이다.
그러면 푸는 방법은 간단하다.
각 킹, 퀸, 룩, 비숍, 나이트, 폰 변수를 선언하여 초기값으로 원래 정상적인 말의 개수로 초기화 한다음, 입력받은 각 수들을 각 체스말에 맞추어 해당 변수에서 빼면 된다.
자세한 것은 코드를 보도록 하자.
- 2가지 방법을 사용하여 풀이한다.
이전 포스팅과 여타 다를 바 없이 Scanner와 BufferedReader를 활용하여 성능을 비교해보려한다.
BufferedReader의 경우 앞선 포스팅에서도 언급했으니 만약 쓰는 방법을 모른다면 아래 링크를 통해 읽어보는 것을 추천한다.
- 풀이
- 방법 1 : [Scanner]
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int king = 1;
int queen = 1;
int rook = 2;
int bishop = 2;
int knight = 2;
int pawn = 8;
king = king - in.nextInt();
queen = queen - in.nextInt();
rook = rook - in.nextInt();
bishop = bishop - in.nextInt();
knight = knight - in.nextInt();
pawn = pawn - in.nextInt();
// 참고로 출력형식을 보면 각 변수들사이에 공백으로 구분 된한 줄로 출력해야한다.
// 즉, 개행(줄바꿈)이 발생하는 println을 쓰면 안된다.
System.out.print(king + " ");
System.out.print(queen + " ");
System.out.print(rook + " ");
System.out.print(bishop + " ");
System.out.print(knight + " ");
System.out.print(pawn);
}
}
가장 기본적인 방법이라 할 수 있겠다.
주석으로도 써놓았지만, 한 줄로 출력해야 하고 그 변수들은 각 공백을 기준으로 구분되기 때문에 각 변수 뒤에 공백을 넣어 출력해주어야 한다.
- 방법 2 : [BufferedReader]
입력 방법을 Scanner 대신 BufferedReader 을 사용하여 풀이하는 방법이다. 단, BufferedReader 는 문자열을 한 줄로 읽기 때문에 입력받은 문자열을 공백으로 분리해주어야하니 StringTokenizer 을 사용하여 풀도록 하겠다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int king = 1;
int queen = 1;
int rook = 2;
int bishop = 2;
int knight = 2;
int pawn = 8;
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
king = king - Integer.parseInt(st.nextToken());
queen = queen - Integer.parseInt(st.nextToken());
rook = rook - Integer.parseInt(st.nextToken());
bishop = bishop - Integer.parseInt(st.nextToken());
knight = knight - Integer.parseInt(st.nextToken());
pawn = pawn - Integer.parseInt(st.nextToken());
System.out.print(king + " ");
System.out.print(queen + " ");
System.out.print(rook + " ");
System.out.print(bishop + " ");
System.out.print(knight + " ");
System.out.print(pawn + " ");
}
}
입력과 StringTokenizer를 쓸 줄 안다면 크게 어려울 것은 없을 것이다.
- 성능
채점 번호 : 48822200 - 방법 2 : BufferedReader
채점 번호 : 48822197 - 방법 1 : Scanner
입력의 경우는 확실히 Scanner 보다는 BufferedReader 가 빠른 걸 볼 수 있다.
- 정리
간단한 입출력 문제라 크게 어렵지는 않았을 것이다.
특히, 자바의 경우 '숫자 + 문자열' 형식으로 출력문에 넣어주면 자연스레 숫자는 String으로 변환되어 출력해주기 때문에 출력에 있어 매우 용이한 점이 있다.
혹여 어렵거나 이해가 되지 않는 부분이 있다면 언제든 댓글을 남겨주시면 감사하겠다.
'JAVA - 백준 [BAEK JOON] > 입출력과 사칙연산' 카테고리의 다른 글
[백준] 18108번 : 1998년생인 내가 태국에서는 2541년생?! - JAVA [자바] (4) | 2022.06.21 |
---|---|
[백준] 10926번 : ??! - JAVA [자바] (0) | 2022.06.17 |
[백준] 25083번 : 새싹 - JAVA [자바] (2) | 2022.05.07 |
[백준] 2588번 : 곱셈 - JAVA [자바] (15) | 2020.02.09 |
[백준] 10430 번 : 나머지 - JAVA [자바] (6) | 2020.02.09 |