코딩테스트/SWExpertAcademy

상호의 배틀필드 Python(SW Expert Academy)

멍토 2020. 3. 21.

난이도 : D3

문제번호 : 1873

※ 저의 풀이가 무조건적인 정답은 아닙니다.

다른 코드가 좀더 효율적이고 좋을 수 있습니다.

다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.

문제 주소 및 출처입니다.

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LyE7KD2ADFAXc&categoryId=AV5LyE7KD2ADFAXc&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


목차

1. 문제 설명

2. 문제 해석

3. 소스 코드


1. 문제 설명

상호는 전차로 시가전을 하는 것을 테마로 한 새로운 게임 “배틀 필드”를 개발하기로 했다.

그래서 먼저 간단하게 프로토 타입 게임을 만들었다.

이 프로토 타입에서 등장하는 전차는 사용자의 전차 하나뿐이며, 적이나 아군으로 만들어진 전차는 등장하지 않는다.

사용자의 전차는 사용자의 입력에 따라 격자판으로 이루어진 게임 맵에서 다양한 동작을 한다.

그림1은 게임 맵의 구성 요소를 나타낸다.
 


그림2는 사용자가 넣을 수 있는 입력의 종류를 나타낸다.
 
전차가 이동을 하려고 할 때, 만약 게임 맵 밖이라면 전차는 당연히 이동하지 않는다.

전차가 포탄을 발사하면, 포탄은 벽돌로 만들어진 벽 또는 강철로 만들어진 벽에 충돌하거나 게임 맵 밖으로 나갈 때까지 직진한다.

만약 포탄이 벽에 부딪히면 포탄은 소멸하고, 부딪힌 벽이 벽돌로 만들어진 벽이라면 이 벽은 파괴되어 칸은 평지가 된다.

강철로 만들어진 벽에 포탄이 부딪히면 아무 일도 일어나지 않는다.

게임 맵 밖으로 포탄이 나가면 아무런 일도 일어나지 않는다.

초기 게임 맵의 상태와 사용자가 넣을 입력이 순서대로 주어질 때, 모든 입력을 처리하고 나면 게임 맵의 상태가 어떻게 되는지 구하는 프로그램을 작성하라.

그림 1
그림 2

입력

첫 번째 줄에 테스트 케이스의 수 T가 주어진다.

각 테스트 케이스의 첫 번째 줄에는 두 정수 H, W (2 ≤ H, W ≤ 20) 이 공백으로 구분되어 주어진다.

이는 게임 맵의 높이가 H, 너비가 W임을 나타낸다.

즉, 게임 맵은 H x W크기의 격자판이다.

다음 H개의 각각의 줄에는 길이가 W인 문자열이 주어진다.

각각의 문자는 위의 게임 맵 구성 요소 표에 있는 문자들만 포함하며, 전차는 단 하나만 있다.

다음 줄에는 사용자가 넣을 입력의 개수를 나타내는 정수 N(0 < N ≤ 100) 이 주어진다.

다음 줄에는 길이가 N인 문자열이 주어진다.

각각의 문자는 위의 사용자가 넣을 수 있는 입력의 종류를 나타내는 표에 있는 문자들만 포함된다.

출력

각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고 한 칸을 띄운 후, 모든 입력을 처리하고 난 후의 게임 맵을 H개의 줄에 걸쳐 출력한다.

예시

입력 출력
1
3 7
***....
*-..#**
#<.****
23
SURSSSSUSLSRSSSURRDSRDS
#1 **....v
.-..#..
#......

2. 문제풀이

딱히 큰어려움이 없는 문제였다.

단지 코드가 길어서 그렇지...

명령을 반복문을 통해 가져오는데

명령에 따라 다른 상황을 하도록 만들었다

기본적으로 본것은 이동과 슛팅이다.

슛팅일 경우와 이동일 경우로 분리했다.

 

이동일 경우 먼저 방향을 바꾼뒤에 이동을 했다.

이동을 못하더라도 방향은 그쪽을 봐야하기 때문이다.

슛일 경우 보는 방향을 기점으로 범위를 나가거나 철벽 혹은 돌벽인지 판단하고

돌벽일경우 평지로 바꿔주면 끝이었다.

 


3. 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#D3 1873 상호의 배틀필드
 
move_list = [(-10), (10), (0-1), (01)]
 
command_dict = {'U' : 0'D' : 1'L' : 2'R' : 3'S' :4,
'^' : 0'v' : 1'<'2'>'30'^'1'v'2:'<'3:'>'}
 
serch_list = ['<''>''^''v']
 
for t in range(1int(input()) + 1):
    H, W = map(int, input().split())
    map_list = [list(input()) for _ in range(H)]
    #탱크의 위치를 찾는다.
    for i in range(H):
        for j in range(W):
           if map_list[i][j] in serch_list:
                tank_pos = (i, j, command_dict[map_list[i][j]])
                break
        #브레이크에 안걸렸다면 진행한다.
        else: continue
        #브레이크가 걸렸다면 모든 반복문을 나온다.
        break
    #N값은 안쓰니까 버린다.
    input()
    #명령어 저장
    commands = input()
    #명령어를 순회하면서 처리
    for command in commands:
        temp = command_dict[command]
        #포탄 발싸라면
        if temp == 4:
            #탱크 위치에서 탱크가 바라보는 방향의 위치를 얻는다.
            dy = tank_pos[0
            dx = tank_pos[1]
            #포탄은 계속 전진한다.
            while True:
                dy += move_list[tank_pos[2]][0]
                dx +=move_list[tank_pos[2]][1]
                #포탄이 밖으로 벋어나거나 강철벽을 만나면 아무처리도 안한다.
                if 0 > dy or dy >= H or 0 > dx or dx >= W or map_list[dy][dx] == '#':
                    break
                #돌벽을 만나게 된다면
                if map_list[dy][dx] == '*':
                    #평지로 바꿔준다.
                    map_list[dy][dx] = '.'
                    break
        #이동 명령이라면
        else:
            y = tank_pos[0]
            x = tank_pos[1]
            dy = y + move_list[temp][0]
            dx = x + move_list[temp][1]
            map_list[y][x] = command_dict[temp]
            tank_pos = (y, x, temp)
            #맵 범위 안에있고 평지여야함.
            if 0 <= dy < H and 0 <= dx < W and map_list[dy][dx] == '.':
                #기존위치를 평지로 바꾸고
                map_list[y][x] = '.'
                #가야하는 위치에 탱크 표시
                map_list[dy][dx] = command_dict[temp]
                #탱크위치 갱신
                tank_pos = (dy, dx, temp)
    print('#{}'.format(t), end=' ')
    for m in map_list:
        print(''.join(m))

댓글

💲 광고입니다.