[Java] SWEA 1873 상호의 배틀필드

Lee GaEun·2024년 11월 7일

[Java] 알고리즘

목록 보기
13/93

1873 상호의 배틀필드 문제 링크

문제분석

  • "배틀 필드"의 프로토타입 개발
  • 게임 맵의 구성 요소
문자의미
.평지(전차가 들어갈 수 있다.)
*벽돌로 만들어진 벽
#강철로 만들어진 벽
-물(전차는 들어갈 수 없다.)
^위쪽을 바라보는 전차(아래는 평지이다.)
v아래쪽을 바라보는 전차(아래는 평지이다.)
<왼쪽을 바라보는 전차(아래는 평지이다.)
>오른쪽을 바라보는 전차(아래는 평지이다.)
  • 사용자가 넣을 수 있는 입력의 종류
문자동작
UUp : 전차가 바라보는 방향을 위쪽으로 바꾸고, 한 칸 위의 칸이 평지라면 위 그 칸으로 이동한다.
DDown : 전차가 바라보는 방향을 아래쪽으로 바꾸고, 한 칸 아래의 칸이 평지라면 그 칸으로 이동한다.
LLeft : 전차가 바라보는 방향을 왼쪽으로 바꾸고, 한 칸 왼쪽의 칸이 평지라면 그 칸으로 이동한다.
RRight : 전차가 바라보는 방향을 오른쪽으로 바꾸고, 한 칸 오른쪽의 칸이 평지라면 그 칸으로 이동한다.
SShoot : 전차가 현재 바라보고 있는 방향으로 포탄을 발사한다.

제약 사항

  • 전차가 이동을 하려는 곳이 게임 맵 밖이라면 전차는 이동하지 않음
  • 전차가 포탄을 발사하면,
    • 포탄은 벽에 충돌하여 소멸하거나
    • 게임 맵 밖으로 나가 소멸함
  • 만약 포탄이 벽돌 벽(*)에 부딪히면 이 벽은 파괴되어 칸은 평지가 됨
  • 만약 포탄이 강철 벽(#)에 부딪히면 아무 일도 일어나지 않음
  • 만약 포탄이 게임 맵 밖으로 나가면 아무 일도 일어나지 않음
  • 모든 입력을 처리하고 난 후, 게임 맵의 상태를 구하는 프로그램을 작성

입력 조건

  • 테스트 케이스 수 ( T <= 10 )
  • 첫째 줄 : 두 정수 H(2≤H), W(W≤20)
    • 공백으로 구분함
    • 맵의 높이(H)와 너비(W)임 (게임 맵은 H x W크기의 격자판임)
  • 둘째 줄 : H개의 각각의 줄에는 길이가 W인 문자열
  • 셋째 줄 : 사용자가 넣을 입력의 개수 N(0 < N ≤ 100)
  • 넷째 줄 : 사용자의 입력 (길이가 N인 문자열)

출력 조건

  • #부호 + 테스트 케이스 번호 + " "
  • 사용자 입력 처리 후 게임 맵 상태 출력

#1

  • map을 구성하며 전차의 위치를 구해 user에 넣음
  • 사용자의 입력을 N만큼 반복하여 수행함

  • up(), down(), left(), right(), shoot() 함수를 따로 구현
  • shoot() 함수는 user의 모양이 "^", "v", "<", ">"일 때를 나눠서 구현
import java.util.Scanner;
import java.io.FileInputStream;

class Solution
{
    static int[] user = new int[2];

    public static void main(String args[]) throws Exception
    {
        Scanner sc = new Scanner(System.in);
        int T;
        T=sc.nextInt();

        for(int test_case = 1; test_case <= T; test_case++)
        {
            int H = sc.nextInt();
            int W = sc.nextInt();
            String[][] map = new String[H][W];

            for(int i=0; i<H; i++){
                String a = sc.next();
                for(int j=0; j<W; j++){
                    map[i][j] = String.valueOf(a.charAt(j));
                    if(map[i][j].equals("<") || map[i][j].equals(">") || map[i][j].equals("^") || map[i][j].equals("v")) {
                        user[0] = i;
                        user[1] = j;
                    }
                }
            }

            int N = sc.nextInt();
            String act = sc.next();

            for(int i=0; i<N; i++) {
                if(act.charAt(i) == 'U') map = up(map);
                else if(act.charAt(i) == 'D') map = down(map, H);
                else if(act.charAt(i) == 'L') map = left(map);
                else if(act.charAt(i) == 'R') map = right(map, W);
                else if(act.charAt(i) == 'S') map = shoot(map, map[user[0]][user[1]], H, W);
            }

            System.out.print("#"+test_case);
            for(int i=0; i<H; i++) {
                for(int j=0; j<W; j++) {
                    System.out.print(map[i][j]);
                }
                System.out.println();
            }
        }
    }
    static String[][] up(String[][] map) {
        map[user[0]][user[1]] = "^";
        if(user[0]==0) return map;
        if(map[user[0]-1][user[1]].equals(".")) {
            map[user[0]][user[1]] = ".";
            map[user[0]-1][user[1]] = "^";
            user[0]--;
        }
        return map;
    }

    static String[][] down(String[][] map, int H) {
        map[user[0]][user[1]] = "v";
        if(user[0]==H) return map;
        if(map[user[0]+1][user[1]].equals(".")) {
            map[user[0]][user[1]] = ".";
            map[user[0]+1][user[1]] = "v";
            user[0]++;
        }
        return map;
    }

    static String[][] left(String[][] map) {
        map[user[0]][user[1]] = "<";
        if(user[1]==0) return map;
        if(map[user[0]][user[1]-1].equals(".")) {
            map[user[0]][user[1]] = ".";
            map[user[0]][user[1]-1] = "<";
            user[1]--;
        }
        return map;
    }

    static String[][] right(String[][] map, int W) {
        map[user[0]][user[1]] = ">";
        if(user[1]==W) return map;
        if(map[user[0]][user[1]+1].equals(".")) {
            map[user[0]][user[1]] = ".";
            map[user[0]][user[1]+1] = ">";
            user[1]++;
        }
        return map;
    }

    static String[][] shoot(String[][] map, String userShape, int H, int W) {
        if(userShape.equals("^")) {
            for(int i=user[0]-1; i>=0; i--) {
                if(map[i][user[1]].equals("#")) return map;
                if(map[i][user[1]].equals("*")) {
                    map[i][user[1]] = ".";
                    return map;
                }
            }
            return map;
        }
        if(userShape.equals("v")) {
            for(int i=user[0]+1; i<=H; i++) {
                if(map[i][user[1]].equals("#")) return map;
                if(map[i][user[1]].equals("*")) {
                    map[i][user[1]] = ".";
                    return map;
                }
            }
            return map;
        }
        if(userShape.equals("<")) {
            for(int i=user[1]-1; i>=0; i--) {
                if(map[user[0]][i].equals("#")) return map;
                if(map[user[0]][i].equals("*")) {
                    map[user[0]][i] = ".";
                    return map;
                }
            }
            return map;
        }
        if(userShape.equals(">")) {
            for(int i=user[1]+1; i<=W; i++) {
                if(map[user[0]][i].equals("#")) return map;
                if(map[user[0]][i].equals("*")) {
                    map[user[0]][i] = ".";
                    return map;
                }
            }
            return map;
        }
        return map;
    }
}

  • 런타임 에러 발생

#2

  • 맵의 범위를 벗어났는지 확인할 때 사용하는 H, W -> H-1, W-1 변경

import java.util.Scanner;
import java.io.FileInputStream;

class Solution
{
    static int[] user = new int[2];

    public static void main(String args[]) throws Exception
    {
        Scanner sc = new Scanner(System.in);
        int T;
        T=sc.nextInt();

        for(int test_case = 1; test_case <= T; test_case++)
        {
            int H = sc.nextInt();
            int W = sc.nextInt();
            String[][] map = new String[H][W];

            for(int i=0; i<H; i++){
                String a = sc.next();
                for(int j=0; j<W; j++){
                    map[i][j] = String.valueOf(a.charAt(j));
                    if(map[i][j].equals("<") || map[i][j].equals(">") || map[i][j].equals("^") || map[i][j].equals("v")) {
                        user[0] = i;
                        user[1] = j;
                    }
                }
            }

            int N = sc.nextInt();
            String act = sc.next();

            for(int i=0; i<N; i++) {
                if(act.charAt(i) == 'U') map = up(map);
                else if(act.charAt(i) == 'D') map = down(map, H-1);
                else if(act.charAt(i) == 'L') map = left(map);
                else if(act.charAt(i) == 'R') map = right(map, W-1);
                else if(act.charAt(i) == 'S') map = shoot(map, map[user[0]][user[1]], H-1, W-1);
            }

            System.out.print("#"+test_case);
            for(int i=0; i<H; i++) {
                for(int j=0; j<W; j++) {
                    System.out.print(map[i][j]);
                }
                System.out.println();
            }
        }
    }
    static String[][] up(String[][] map) {
        map[user[0]][user[1]] = "^";
        if(user[0]==0) return map;
        if(map[user[0]-1][user[1]].equals(".")) {
            map[user[0]][user[1]] = ".";
            map[user[0]-1][user[1]] = "^";
            user[0]--;
        }
        return map;
    }

    static String[][] down(String[][] map, int H) {
        map[user[0]][user[1]] = "v";
        if(user[0]==H) return map;
        if(map[user[0]+1][user[1]].equals(".")) {
            map[user[0]][user[1]] = ".";
            map[user[0]+1][user[1]] = "v";
            user[0]++;
        }
        return map;
    }

    static String[][] left(String[][] map) {
        map[user[0]][user[1]] = "<";
        if(user[1]==0) return map;
        if(map[user[0]][user[1]-1].equals(".")) {
            map[user[0]][user[1]] = ".";
            map[user[0]][user[1]-1] = "<";
            user[1]--;
        }
        return map;
    }

    static String[][] right(String[][] map, int W) {
        map[user[0]][user[1]] = ">";
        if(user[1]==W) return map;
        if(map[user[0]][user[1]+1].equals(".")) {
            map[user[0]][user[1]] = ".";
            map[user[0]][user[1]+1] = ">";
            user[1]++;
        }
        return map;
    }

    static String[][] shoot(String[][] map, String userShape, int H, int W) {
        if(userShape.equals("^")) {
            for(int i=user[0]-1; i>=0; i--) {
                if(map[i][user[1]].equals("#")) return map;
                if(map[i][user[1]].equals("*")) {
                    map[i][user[1]] = ".";
                    return map;
                }
            }
            return map;
        }
        if(userShape.equals("v")) {
            for(int i=user[0]+1; i<=H; i++) {
                if(map[i][user[1]].equals("#")) return map;
                if(map[i][user[1]].equals("*")) {
                    map[i][user[1]] = ".";
                    return map;
                }
            }
            return map;
        }
        if(userShape.equals("<")) {
            for(int i=user[1]-1; i>=0; i--) {
                if(map[user[0]][i].equals("#")) return map;
                if(map[user[0]][i].equals("*")) {
                    map[user[0]][i] = ".";
                    return map;
                }
            }
            return map;
        }
        if(userShape.equals(">")) {
            for(int i=user[1]+1; i<=W; i++) {
                if(map[user[0]][i].equals("#")) return map;
                if(map[user[0]][i].equals("*")) {
                    map[user[0]][i] = ".";
                    return map;
                }
            }
            return map;
        }
        return map;
    }
}
  • 런타임 에러 수정
  • H, W는 길이 그대로니까 하나씩 줄여줘야 되는데 그거 안 해서 index가 커서 에러난 거임

  • ㅋㅋ.. 근데 fail임

  • 인텔리제이로 돌리면 결과가 똑같게 나오는 것 같은데 왜 fail이지

#3

  • 출력 조건 잘 보기..
import java.util.Scanner;
import java.io.FileInputStream;

class Solution
{
    static int[] user = new int[2];

    public static void main(String args[]) throws Exception
    {
        Scanner sc = new Scanner(System.in);
        int T;
        T=sc.nextInt();

        for(int test_case = 1; test_case <= T; test_case++)
        {
            int H = sc.nextInt();
            int W = sc.nextInt();
            String[][] map = new String[H][W];

            for(int i=0; i<H; i++){
                String a = sc.next();
                for(int j=0; j<W; j++){
                    map[i][j] = String.valueOf(a.charAt(j));
                    if(map[i][j].equals("<") || map[i][j].equals(">") || map[i][j].equals("^") || map[i][j].equals("v")) {
                        user[0] = i;
                        user[1] = j;
                    }
                }
            }

            int N = sc.nextInt();
            String act = sc.next();

            for(int i=0; i<N; i++) {
                if(act.charAt(i) == 'U') map = up(map);
                else if(act.charAt(i) == 'D') map = down(map, H-1);
                else if(act.charAt(i) == 'L') map = left(map);
                else if(act.charAt(i) == 'R') map = right(map, W-1);
                else if(act.charAt(i) == 'S') map = shoot(map, map[user[0]][user[1]], H-1, W-1);
            }

            System.out.print("#"+test_case+" ");
            for(int i=0; i<H; i++) {
                for(int j=0; j<W; j++) {
                    System.out.print(map[i][j]);
                }
                System.out.println();
            }
        }
    }
    static String[][] up(String[][] map) {
        map[user[0]][user[1]] = "^";
        if(user[0]==0) return map;
        if(map[user[0]-1][user[1]].equals(".")) {
            map[user[0]][user[1]] = ".";
            map[user[0]-1][user[1]] = "^";
            user[0]--;
        }
        return map;
    }

    static String[][] down(String[][] map, int H) {
        map[user[0]][user[1]] = "v";
        if(user[0]==H) return map;
        if(map[user[0]+1][user[1]].equals(".")) {
            map[user[0]][user[1]] = ".";
            map[user[0]+1][user[1]] = "v";
            user[0]++;
        }
        return map;
    }

    static String[][] left(String[][] map) {
        map[user[0]][user[1]] = "<";
        if(user[1]==0) return map;
        if(map[user[0]][user[1]-1].equals(".")) {
            map[user[0]][user[1]] = ".";
            map[user[0]][user[1]-1] = "<";
            user[1]--;
        }
        return map;
    }

    static String[][] right(String[][] map, int W) {
        map[user[0]][user[1]] = ">";
        if(user[1]==W) return map;
        if(map[user[0]][user[1]+1].equals(".")) {
            map[user[0]][user[1]] = ".";
            map[user[0]][user[1]+1] = ">";
            user[1]++;
        }
        return map;
    }

    static String[][] shoot(String[][] map, String userShape, int H, int W) {
        if(userShape.equals("^")) {
            for(int i=user[0]-1; i>=0; i--) {
                if(map[i][user[1]].equals("#")) return map;
                if(map[i][user[1]].equals("*")) {
                    map[i][user[1]] = ".";
                    return map;
                }
            }
            return map;
        }
        if(userShape.equals("v")) {
            for(int i=user[0]+1; i<=H; i++) {
                if(map[i][user[1]].equals("#")) return map;
                if(map[i][user[1]].equals("*")) {
                    map[i][user[1]] = ".";
                    return map;
                }
            }
            return map;
        }
        if(userShape.equals("<")) {
            for(int i=user[1]-1; i>=0; i--) {
                if(map[user[0]][i].equals("#")) return map;
                if(map[user[0]][i].equals("*")) {
                    map[user[0]][i] = ".";
                    return map;
                }
            }
            return map;
        }
        if(userShape.equals(">")) {
            for(int i=user[1]+1; i<=W; i++) {
                if(map[user[0]][i].equals("#")) return map;
                if(map[user[0]][i].equals("*")) {
                    map[user[0]][i] = ".";
                    return map;
                }
            }
            return map;
        }
        return map;
    }
}
  • 하하.. 아무리 생각해봐도 결과가 같아서 계속 비교해보다가 찾았다..
  • #test_case 후에 공백이 있어야함..
  • 이걸로 한참 고민함.. 바보인게 틀림없음..

  • 성공! (1H20M)
profile
I will give it my all (๑•̀o•́๑)ง

0개의 댓글