코딩 테스트

[Python] SWEA 1873. 상호의 배틀필드

위시리 2025. 1. 23. 22:04

1차 - 실패..

import sys
input = sys.stdin.readline
from collections import deque

tc = int(input())
for t in range(1, tc+1) :
    h, w = map(int, input().split())
    ground = [list(input().strip()) for _ in range(h)]
    current = deque()

    n = int(input())
    user_input = input().strip()

    # 전차의 현재 위치 찾기
    for i in range(h):
        for j in range(w) :
            if ground[i][j] == '^' or ground[i][j] == 'v' or ground[i][j] == '<' or ground[i][j] == '>' :
                current.append((ground[i][j], i, j)) # 현재 위치와 모양
                break

    for move in user_input :
        if len(current) == 0 :
            print('안에 암것도 없음')
            exit(0)

        cur, r, c = current.popleft()
        ground[r][c] = '.'
        if move == 'U' : # up
            change_cur = "^"
            nr = r-1
            nc = c
            if nr <= 0 or nr >h or nc <= 0 or nc >w : # 범위를 넘어서면 제자리
                current.append((change_cur, r, c))
                ground[r][c] = '^'
            elif ground[nr][nc] != '.' : # 그 다음 이동하려는 위치가 평지가 아니면
                current.append((change_cur, r, c))
                ground[r][c] = '^'
            else : # 이동할 수 있다면
                print('nr : ', nr, 'nc ; ', nc)
                current.append((change_cur, nr-1, nc))
                ground[r-1][nc] = '^'


        elif move == 'D' : # down
            change_cur = "v"
            nr = r+1
            nc = c
            if nr <= 0 or nr > h or nc <= 0 or nc > c:  # 범위를 넘어서면 제자리
                current.append((change_cur, r, c))
                ground[r][c] = 'v'
            elif ground[nr][nc] != '.':  # 그 다음 이동하려는 위치가 평지가 아니면
                current.append((change_cur, r, c))
                ground[r][c] = 'v'
            else :
                current.append((change_cur, nr+1, nc))
                ground[r + 1][nc] = 'v'
                ground[r][c] = '.'

        elif move == 'L' : # left
            change_cur = "<"
            nr = r
            nc = c-1
            if nr <= 0 or nr > h or nc <= 0 or nc > c:  # 범위를 넘어서면 제자리
                current.append((change_cur, r, c))
                ground[r][c] = '<'
            elif ground[nr][nc] != '.':  # 그 다음 이동하려는 위치가 평지가 아니면
                current.append((change_cur, r, c))
                ground[r][c] = '<'
            else :
                current.append((change_cur, nr, nc-1))
                ground[r][c-1] = '<'
                ground[r][c] = '.'

        elif move == 'R' : # right
            change_cur = ">"
            nr = r
            nc = c+1
            if nr <= 0 or nr > h or nc <= 0 or nc > c:  # 범위를 넘어서면 제자리
                current.append((change_cur, nr, nc))
                ground[r][c] = '>'
            elif ground[nr][nc] != '.':  # 그 다음 이동하려는 위치가 평지가 아니면
                current.append((change_cur, nr, c))
                ground[r][c]= '>'
            else :
                current.append((change_cur, nr, nc+1))
                ground[nr][nc+1] = '>'
                ground[r][c] = '.'

        else : # shoot
            current.append([cur, r, c])
            if cur == '^' :
                while(r >= 0) :
                    r -= 1
                    if ground[r][c] == '#':
                        break
                    if ground[r][c] == '*' :
                        ground[r][c] = '.'

            elif cur == 'v' :
                while(r < h-1) :
                    r += 1
                    if ground[r][c] == '#':
                        break
                    if ground[r][c] == '*':
                        ground[r][c] = '.'

            elif cur == '<' : # left
                while (c >= 0):
                    c -= 1
                    if ground[r][c] == '#':
                        break
                    if ground[r][c] == '*':
                        ground[r][c] = '.'

            else :
                while (c<w-1) :
                    c+=1
                    if ground[r][c] == '#':
                        break
                    if ground[r][c] == '*':
                        ground[r][c] = '.'
        print('move : ', move)
        print('current : ', cur)
        print('ground : ', ground)

    print(f'#{tc}', end=' ')
    for i in range(h) :
        print(''.join(map(str,ground[i])))

 

전차가 움직이고 나서 지워지지 않음

 

2차

  1. 현재 전차의 위치 찾기
  2. 명령어 순서대로 실행
  3. 전차가 움직여야 하는 경우 현재 위치에서 전차가 움직일 수 있는지 확인
    1. 현재 위치는 잔디로 바꾸고 
    2. 움직일 수 있다면 전차의 방향과 위치 바꾸기
      1. 전차가 움직일 수 있는 경우는 : 평지 & 맵 안
  4. 전차가 포탄을 쏠 경우
    1. 충돌 : 벽에 부딪히면 소멸
      1. 벽돌에 부딪히면 파괴되어 평지
      2. 강철에 부딪히면 아무일도 일어나지 x
    2. 평지나 물을 지나 게임 맵 밖으로 나감
tc = int(input())
for t in range(1, tc+1) :
    row, col = map(int, input().split())
    g = [list(input().strip()) for _ in range(row)]
    n = int(input())
    com = input()

    def isRange(h, w):
        if h < 0 or h >= row or w < 0 or w >= col :
            return False
        return True

    def shoot(h, w, dh, dw) :
        nh = h + dh
        nw = w + dw
        while isRange(nh, nw) :
            # 벽돌 벽에 충돌하면 평지로 바뀌고 소멸
            if g[nh][nw] == '*' :
                g[nh][nw] = '.'
                break
            # 강철 벽에 부딪히면 그냥 소멸
            elif g[nh][nw] == '#' :
                break

            nh += dh
            nw += dw

    # 1. 현재 전차의 위치 찾기
    current = None
    for i in range(row) :
        for j in range(col) :
            if g[i][j] == '^' or g[i][j] == 'v' or g[i][j] == '<' or g[i][j] == '>' :
            # if g[i][j] in '^v<>':
                current = (i,j)
                break
        if current :
            break

    # 2. 현재 명령어 확인 - 명령어 수 만큼 반복
    for c in com :
        h,w = current

        # 2-1. 만약 전차를 이동해야 한다면 -> 1) 전차가 다음 위치로 이동할 수 있는지 2) 명령어에 대한 방향 적용
        if c == 'U' : # up
            g[h][w] = '.'
            nh = h-1
            if isRange(nh, w) and g[nh][w] == '.': # 다음 위치로 이동할 수 있다면
                g[nh][w] = '^'
                # current.append((nh,w))
                h = nh
            else : # 이동할 수 없다면
                g[h][w] = '^'
                # current.append((h,w))
            current = (h,w)

        elif c == 'D' :
            g[h][w] = '.'
            nh = h + 1
            if isRange(nh, w) and g[nh][w] == '.':  # 다음 위치로 이동할 수 있다면
                g[nh][w] = 'v'
                # current.append((nh, w))
                h = nh
            else:  # 이동할 수 없다면
                g[h][w] = 'v'
                # current.append((h, w))
            current = (h, w)

        elif c == 'L' :
            g[h][w] = '.'
            nw = w - 1
            if isRange(h, nw) and g[h][nw] == '.':  # 다음 위치로 이동할 수 있다면
                g[h][nw] = '<'
                # current.append((h, nw))
                w = nw
            else:  # 이동할 수 없다면
                g[h][w] = '<'
                # current.append((h, w))
            current = (h, w)

        elif c == 'R':
            g[h][w] = '.'
            nw = w + 1
            if isRange(h, nw) and g[h][nw] == '.':  # 다음 위치로 이동할 수 있다면
                g[h][nw] = '>'
                # current.append((h, nw))
                w = nw
            else:  # 이동할 수 없다면
                g[h][w] = '>'
                # current.append((h, w))
            current = (h, w)

        else : # shoot
            # 현재 위치 h, w
            if g[h][w] == '^' :
                shoot(h,w,-1,0)

            elif g[h][w] == 'v' :
                shoot(h,w,+1,0)

            elif g[h][w] == '<' :
                shoot(h,w,0,-1)

            else :
                shoot(h, w, 0, 1)

            # current.append((h,w))
            current = (h, w)

    print(f'#{t}', end=' ')
    for line in g:
        print(''.join(line))

 

gpt

import sys
sys.stdin = open("input.txt", "r")

def isRange(h, w, row, col):
    return 0 <= h < row and 0 <= w < col

def shoot(g, h, w, dh, dw, row, col):
    nh, nw = h + dh, w + dw
    while isRange(nh, nw, row, col):
        if g[nh][nw] == '*':  # 벽돌 벽
            g[nh][nw] = '.'
            break
        elif g[nh][nw] == '#':  # 강철 벽
            break
        nh += dh
        nw += dw

tc = int(input())
for t in range(1, tc+1):
    row, col = map(int, input().split())
    g = [list(input().strip()) for _ in range(row)]
    n = int(input())
    commands = input().strip()

    # 전차 위치 및 방향 찾기
    tank_pos = None
    for i in range(row):
        for j in range(col):
            if g[i][j] in '^v<>':
                tank_pos = (i, j)
                break
        if tank_pos:
            break

    h, w = tank_pos
    direction_map = {
        'U': (-1, 0, '^'),
        'D': (1, 0, 'v'),
        'L': (0, -1, '<'),
        'R': (0, 1, '>'),
    }

    # 명령 처리
    for c in commands:
        if c in 'UDLR':  # 이동 명령
            dh, dw, new_dir = direction_map[c]
            g[h][w] = new_dir
            nh, nw = h + dh, w + dw
            if isRange(nh, nw, row, col) and g[nh][nw] == '.':
                g[nh][nw] = new_dir
                g[h][w] = '.'
                h, w = nh, nw
        elif c == 'S':  # 포탄 발사
            if g[h][w] == '^':
                shoot(g, h, w, -1, 0, row, col)
            elif g[h][w] == 'v':
                shoot(g, h, w, 1, 0, row, col)
            elif g[h][w] == '<':
                shoot(g, h, w, 0, -1, row, col)
            elif g[h][w] == '>':
                shoot(g, h, w, 0, 1, row, col)

    # 결과 출력
    print(f'#{t}')
    for line in g:
        print(''.join(line))