IT/BaekJoon

[백준/JAVA] 3003번- 킹, 퀸, 룩, 비숍, 나이트, 폰 문제

Buang 2023. 1. 1. 21:00
반응형

1. 문제

 

동혁이는 오래된 창고를 뒤지다가 낡은 체스판과 피스를 발견했다.

체스판의 먼지를 털어내고 걸레로 닦으니 그럭저럭 쓸만한 체스판이 되었다. 하지만, 검정색 피스는 모두 있었으나, 흰색 피스는 개수가 올바르지 않았다.

 

체스는 총 16개의 피스를 사용하며,

킹 1개, 퀸 1개, 룩 2개, 비숍 2개, 나이트 2개, 폰 8개로 구성되어 있다.

동혁이가 발견한 흰색 피스의 개수가 주어졌을 때,

몇 개를 더하거나 빼야 올바른 세트가 되는지 구하는 프로그램을 작성하시오.

 

https://www.acmicpc.net/problem/3003

 

 


2. 코드

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        
        int chessPiece[] = {1, 1, 2, 2, 2, 8};
        int findChess[] = new int[chessPiece.length];

        Scanner scan = new Scanner(System.in);
       
        for(int i =0; i< chessPiece.length; i++){
            findChess[i] = scan.nextInt();
        }
        scan.close();

        for(int i =0; i < chessPiece.length; i++){
            System.out.printf("%d ", chessPiece[i]- findChess[i] );
        }
    }
}

 


3. 풀이

 

이 문제를 풀기 위해선 scanner를 알고 있어야 한다.

아직 scan에 대해 모른다면

아래 링크를 참고하면 좋을 거 같다.

 

'Scanner에 대해 궁금하시다면

이 글을 클릭해 주세요!'

 

 

Scanner를 알고 있다는 전제 하에 설명을 이어가고자 한다.

 

우선 이 프로그램을 만들 땐 총 3가지 조건을 잘 기억해둬야 한다.

 


1번 조건

 

'체스말은 킹 1개, 퀸 1개, 룩 2개, 비숍 2개, 나이트 2개, 폰 8개로 구성되어 있다.'

 

int king = 1;
int queen = 1;
int rook = 2;
int bishop = 2;
int knight = 2;
int pawn = 8;

 

1번 조건을 코드로 길게 늘려서 쓰면 위와 같을 것이다.

위와 같이 작성하면 줄이 긴 편인데 배열을 사용하면 더 짧게 줄일 수 있다.

 

 int chessPiece[] = {1, 1, 2, 2, 2, 8};

 

chessPiece란 이름의 정수형(int) 배열을 선언해서

킹, 퀸, 룩, 비숍, 나이트, 폰 순서대로 각각의 개수에 맞춰서 작성해줬다.

 


 

2번 조건

 

 

동혁이가 찾은 체스말을 입력할 수 있도록 scanner를 사용해야 한다.

그전에 동혁이가 체스말을 각각 몇 개 찾았는지 저장해 둘 공간이 필요하다.

 

우리가 장을 보러가기 전에 장바구니 리스트를 작성하는 것처럼

동혁이도 본인이 찾은 체스말이 몇 개인지 기록해 놓을 메모장이 필요하다.

그 메모장을 보면서 체스말이 몇 개가 더 많고 적은지를 판단하기 수월하기 때문이다.

 

그럼 이제 동혁이가 찾은 체스말 개수를 기록할 메모장을 생성해 보자.

 

int findChess[] = new int[6];

 

동혁이는 findeChess라는 메모장(배열)에 본인이 찾은 체스말의 개수를 기록할 거다.

new int[6] 이라고 마지막 부분에 써져있는데 이건 배열크기를 지정해 준 것이다.

 

 

 

우리가 단순히 int findChess[] 라고만 적으면 배열을 선언한 것이 된다.

int findChess[] = new int[6]  라고 작성해 놓으면 위의 그림처럼

'findChess란 배열의 크기가 6이다.'라고 지정한 것으로 이걸 배열을 생성했다고 한다.

 

int findChess[] = new int[chessPiece.length];

 

int findChess[] = new int[6] 

라고 작성할 수도 있지만 나중을 위해 위의 코드로 작성하면 더 좋다.

 

[6] 대신 [chessPiece.length]가 대신 들어갔다.

chessPiece 배열의 길이(length)란 뜻이다.

 

왜 length를 사용했는지 궁금하다면? 

아래 '더보기'를 클릭해 주세요!

 

더보기
 int chessPiece[] = {1, 1, 2, 2, 2, 8};

위의 코드를 보니 chessPiece의 배열의 길이는 6이었다.

chessPiece.length는 chessPiece 배열의 길이(6)를 나타낸다 했음으로 

 

new int[6]과 new int[chessPiece.length]는 똑같다.

 

여기서 length를 사용한 이유는 추후 번거로운 작업을 피하기 위함이다.

 

우리가 체스말의 킹부터 폰까지의 개수를 계산하고자 총 6개라고 선언했는데

나중에 가서는 폰을 제외한 체스말의 개수를 파악하고 싶어졌다고 하자.

 

int chessPiece[] = {1, 1, 2, 2, 2};
int findChess[] = new int[5]

 

 

그럼 위와같이 new int[6]을 new int[5]로 바꿔줘야 하는 불편함이 따른다.

여기선 한개만 바꾸면 끝나니 다행이지 상상력을 발휘해서 수정해야 할 게

10개, 50개, 100개가 넘었다면?

 

조용히 노트북을 덮거나 데스크탑 컴퓨터 전원을 끄고 싶었을 것이다.

 

int chessPiece[] = {1, 1, 2, 2, 2};
int findChess[] = new int[chessPiece.length];

 

그러니 new int [6] 보단 수정할 필요가 없는

new int[chessPiece.length]를 사용하길 권한다.

 

 


3번 조건

 

동혁이가 찾은 체스말의 개수를 기록할 메모장(findChess)를 만들어 줬다.

이제 만든 메모장에 동혁이가 찾은 체스말의 개수를 작성(입력)할 수 있도록 해줘야 한다.

자바에서 입력은 scanner를 이용하면 된다.

 

Scanner sc = new Scanner(System.in);
       
for(int i =0; i< chessPiece.length; i++){
	findChess[i] = sc.nextInt();
     }
     
 sc.close();

 

동혁이가 찾은 킹부터 폰까지의 개수를 입력해야 한다.

킹~폰까지의 개수가 6개니 총 6번 입력 해야 함으로 for문을 이용해서 6번 반복되도록 만들어 준다.

 

i < chessPiece.length에서 chessPiece.length는 chessPiece 배열의 길이, 즉 6을 나타낸다.

그러니 i < chessPiece.length는 곧 i < 6 과 같다.

 

for(int i =0; i < chessPiece.length; i++){
    System.out.printf("%d ", chessPiece[i]- findChess[i] );
}

 

원래 체스말의 개수에서 찾은 체스말의 개수를 빼줘야 한다.

 

그럼 프로그램의 결과값이 나온다.

 

 

반응형