상세 컨텐츠

본문 제목

[SWEA] #1873 상호의 배틀필드.python(파이썬)

문제풀이/SWEA

by jer0618 2021. 8. 21. 01:50

본문

마치 게임을 개발하는 듯한 기분이 들어서 재밌었다.

 

문제 링크 / 출처

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LyE7KD2ADFAXc

 

SW Expert Academy

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

swexpertacademy.com

 

문제 요약

주어진 맵에서 입력받은 명령을 수행했을 때, 변경된 맵을 출력하는 문제

[제약사항]

두 정수 H, W (2 ≤ H, W ≤ 20)

  • 정수 N(0 < N ≤ 100)

 

풀이

  1. index를 사용해 다른 리스트에 접근할 수 있도록 방향과 관련된 요소들을 세개의 리스트를 생성했다.
  2.  
  3. 문자열은 변경이 불가능하므로, field를 입력 받을 때 문자열이 낱개로 분리된 리스트로 입력받아 변경을 용이하게 만들었다. findme함수를 사용해 현재의 위치와 보고있는 방향을 받아왔다.
  4. 포탄의 좌표를 따로 생성하고 보고있는 방향의 인덱스를 활용해 1에서 좌표이동에 관한 정보(drc_list)를 가져왔다. 해당 방향으로 진행하며, 포탄이 범위밖으로 벗어날 때까지 while문을 돌렸다.
    • 중간에 벽을 만나는경우, 강철벽의 경우 바로 while문 탈출
    • 벽돌벽의 경우 벽돌벽 삭제 후 탈출
  5. 3과 마찬가지로 1에서 인덱스를 활용해 이동정보를 가져왔다. 이동할 좌표가 범위내에 있는지 확인하고,
    • 그곳이 평지('.')라면, 현재 위치를 평지로 바꾼후 좌표를 이동, 이동 후 좌표에 탱크의 모습을 표시한다.
    • 평지가 아니라면, 이동하지 않고 방향만 전환해준다.

 

코드

def findme():
    for r in range(H):
        for c in range(W):
            for i in range(4):
                if field[r][c] == direction_list[i]:
                    return (r, c, direction_list[i])
# 1. 상하좌우
cmd_dir_list = ['U', 'D', 'L', 'R']
drc_list = [(-1, 0), (1, 0), (0, -1), (0, 1)]
direction_list = ['^', 'v', '<', '>']

# 2. input
T = int(input())
for tc in range(1, T+1):
    H, W = map(int, input().split())
    field = [list(input()) for _ in range(H)]
    N = int(input())
    cmd_list = input()
    me_r, me_c, me = findme()

    for cmd in cmd_list:
        if cmd == 'S':  # 3. 포탄 발사
            bomb_idx = direction_list.index(me)
            b_r, b_c = drc_list[bomb_idx]
            bomb_r, bomb_c = me_r, me_c

            while 0 <= bomb_r < H and 0 <= bomb_c < W:
                if field[bomb_r][bomb_c] == '#':
                    break

                if field[bomb_r][bomb_c] == '*':
                    field[bomb_r][bomb_c] = '.'
                    break

                bomb_r += b_r
                bomb_c += b_c

        else:   # 4. move
            me_idx = cmd_dir_list.index(cmd)
            r, c = drc_list[me_idx]
            me = direction_list[me_idx]

            if 0 <= me_r + r < H and 0 <= me_c + c < W and field[me_r + r][me_c + c] == '.':
                field[me_r][me_c] = '.'
                me_r += r
                me_c += c

            field[me_r][me_c] = me

    print('#', tc, sep='', end=' ')
    for f in field:
        print(*f, sep='')
반응형

관련글 더보기