1873 상호의 배틀필드 문제 링크
문제분석
- "배틀 필드"의 프로토타입 개발
- 게임 맵의 구성 요소
| 문자 | 의미 |
|---|
| . | 평지(전차가 들어갈 수 있다.) |
| * | 벽돌로 만들어진 벽 |
| # | 강철로 만들어진 벽 |
| - | 물(전차는 들어갈 수 없다.) |
| ^ | 위쪽을 바라보는 전차(아래는 평지이다.) |
| v | 아래쪽을 바라보는 전차(아래는 평지이다.) |
| < | 왼쪽을 바라보는 전차(아래는 평지이다.) |
| > | 오른쪽을 바라보는 전차(아래는 평지이다.) |
| 문자 | 동작 |
|---|
| U | Up : 전차가 바라보는 방향을 위쪽으로 바꾸고, 한 칸 위의 칸이 평지라면 위 그 칸으로 이동한다. |
| D | Down : 전차가 바라보는 방향을 아래쪽으로 바꾸고, 한 칸 아래의 칸이 평지라면 그 칸으로 이동한다. |
| L | Left : 전차가 바라보는 방향을 왼쪽으로 바꾸고, 한 칸 왼쪽의 칸이 평지라면 그 칸으로 이동한다. |
| R | Right : 전차가 바라보는 방향을 오른쪽으로 바꾸고, 한 칸 오른쪽의 칸이 평지라면 그 칸으로 이동한다. |
| S | Shoot : 전차가 현재 바라보고 있는 방향으로 포탄을 발사한다. |
제약 사항
- 전차가 이동을 하려는 곳이 게임 맵 밖이라면 전차는 이동하지 않음
- 전차가 포탄을 발사하면,
- 포탄은 벽에 충돌하여 소멸하거나
- 게임 맵 밖으로 나가 소멸함
- 만약 포탄이 벽돌 벽(*)에 부딪히면 이 벽은 파괴되어 칸은 평지가 됨
- 만약 포탄이 강철 벽(#)에 부딪히면 아무 일도 일어나지 않음
- 만약 포탄이 게임 맵 밖으로 나가면 아무 일도 일어나지 않음
- 모든 입력을 처리하고 난 후, 게임 맵의 상태를 구하는 프로그램을 작성
입력 조건
- 테스트 케이스 수 ( 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이지
#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 후에 공백이 있어야함..
이걸로 한참 고민함.. 바보인게 틀림없음..
