본문 바로가기
Programming/Cos Pro 1급

Cos Pro 1급 - 샘플 문제 풀이 3차 3번 (ArrayList 활용)

by 우공80 2022. 10. 18.
728x90

체스 - 비숍을 피해 말을 놓을 수 있는 빈칸 찾기

 

문제 지문 #3


체스에서 비숍(Bishop)은 아래 그림과 같이 대각선 방향으로 몇 칸이든 한 번에 이동할 수 있습니다. 만약, 한 번에 이동 가능한 칸에 체스 말이 놓여있다면 그 체스 말을 잡을 수 있습니다.

bishop1.png

8 x 8 크기의 체스판 위에 여러 개의 비숍(Bishop)이 놓여있습니다. 이때, 비숍(Bishop)들에게 한 번에 잡히지 않도록 새로운 말을 놓을 수 있는 빈칸의 개수를 구하려고 합니다.

위 그림에서 원이 그려진 칸은 비숍에게 한 번에 잡히는 칸들이며, 따라서 체스 말을 놓을 수 있는 빈칸 개수는 50개입니다.

8 x 8 체스판에 놓인 비숍의 위치 bishops가 매개변수로 주어질 때, 비숍에게 한 번에 잡히지 않도록 새로운 체스 말을 놓을 수 있는 빈칸 개수를 return 하도록 solution 메서드를 완성해주세요.


매개변수 설명

체스판에 놓인 비숍의 위치 bishops가 solution 메소드의 매개변수로 주어집니다.

  • bishops는 비숍의 위치가 문자열 형태로 들어있는 배열입니다.
  • bishops의 길이는 1 이상 64 이하입니다.
  • 비숍이 놓인 위치는 알파벳 대문자와 숫자로 표기합니다.
    • 알파벳 대문자는 가로 방향, 숫자는 세로 방향 좌표를 나타냅니다.
    • 예를 들어 위 그림에서 비숍이 있는 칸은 "D5"라고 표현합니다.
  • 한 칸에 여러 비숍이 놓이거나, 잘못된 위치가 주어지는 경우는 없습니다.

return 값 설명

비숍에게 한 번에 잡히지 않도록 새로운 체스 말을 놓을 수 있는 빈칸의 개수를 return 해주세요.


예시

bishops return
["D5"] 50
["D5", "E8", "G2"] 42

 

예시 설명

예시 #1
문제에 나온 예시와 같습니다.

예시 #2

bishop2.png

그림과 같이 원이 그려진 칸은 비숍에게 한 번에 잡히는 칸들이며, 따라서 체스 말을 놓을 수 있는 빈칸 개수는 42개입니다.

728x90

 

혼자 풀이


메서드 전체를 완성하는 문제입니다. 1차 3번 문제처럼 체스판 이동하는 문제입니다.
비슷한 문제라고 생각했는데, 1차 3번을 어떻게 풀었는지 그새 까먹어서..
처음부터 다시 짰습니다. 
체스판 위에서 말의 움직임은 1차 3번 문제와 비슷하게 했는데, 체스 말 여러 개를 고려해야 해서, ArrayList를 사용했습니다. 각 비숍이 이동가능한 칸의 좌표가 ArrayList에 있으면 넘어가고, 없으면 추가하였습니다.

상세한 풀이는 아래에 주석으로 달았습니다.

/********************************************************
    3차 3번 비숍에 잡히지 않는 칸 수 구하기
 *******************************************************/
// 다음과 같이 import를 사용할 수 있습니다.
import java.util.ArrayList;

class MySolution {
    public int solution(String[] bishops) {
        // 여기에 코드를 작성해주세요.
        int answer = 0;
        char x; //비숍의 x좌표
        char y; //비숍의 y좌표
        int[] dx={1,1,-1,-1}; //비숍의 이동 방향
        int[] dy={1,-1,1,-1}; //비숍의 이동 방향
        int cnt=0;
        ArrayList<String> bishop_range = new ArrayList<>(); //비숍이 이동할 수 있는 칸을 모두 저장
        for(int i=0;i<bishops.length;i++){ //비숍의 첫 위치를 bishop_range에 저장
            bishop_range.add(bishops[i]);
        }
        for(int i=0;i<bishops.length;i++){ //비숏의 개수
            for(int j=0;j<4;j++){  //방향은 네 방향
                x=bishops[i].charAt(0);
                y=bishops[i].charAt(1);
                while(true){
                    x=(char)(x+dx[j]);
                    y=(char)(y+dy[j]);
                    if(x >= 'A' & x<='H'& y>='1' & y<='8') {  //체스판 범위를 벗어나면 안됨
                        //이미 bishop_range에 존재하면 continue
                        if(bishop_range.contains((char)(x) + "" + (char) (y))) 
                            continue;  
                        else //bishop_range에 없으면 추가
                            bishop_range.add((char) (x) + "" + (char) (y));
                    }else break;  //체스판 범위를 벗어나면 break;
                }
            }
        }

        answer = 64-bishop_range.size();  //64에서 비숍의 이동 가능한 칸수를 빼서 리턴
        return answer;
    }

    // 아래는 테스트케이스 출력을 해보기 위한 main 메소드입니다.
    public static void main(String[] args) {
        MySolution sol = new MySolution();
        String[] bishops1 = {new String("D5")};
        int ret1 = sol.solution(bishops1);
        
        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        System.out.println("solution 메소드의 반환 값은 " + ret1 + " 입니다.");

        String[] bishops2 = {new String("D5"), new String("E8"), new String("G2")};
        int ret2 = sol.solution(bishops2);

        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        System.out.println("solution 메소드의 반환 값은 " + ret2 + " 입니다.");
    }
}

ArrayList 사용법에 대해 정리해보았습니다.
2022.11.01 - [Programming/Java] - Class ArrayList 사용법 정리

 

Class ArrayList<E> 사용법 정리

ArrayList 란? ArrayList는 Java에서 제공하는 컬렉션 프레임워크입니다. 컬렉션 프레임워크는 Java의 자료구조를 표현하고 조작하기 위한 구조를 정의한 것입니다. LIst, Set, Map 등의 Interface가 정의되어

woogong80.tistory.com

 

정답


YBM에서 다운로드 받은 정답 파일이 내용이 없어서 확인 못했습니다.

첨부 파일


프로젝트 파일 전체를 첨부합니다.

Solution 이 문제, CorrectSolution 이 정답, MySolution이 제가 푼 것입니다.
"Project from existing sources..." 메뉴에서 불러다 쓰시면 됩니다.

ThirdQuestion3.zip
0.01MB

출처: https://www.ybmit.com/cos_pro/cos_pro_r_test.jsp

728x90

댓글