반응형
문제
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
🐍파이썬
T = int(input()) for test_case in range(1, T + 1): h, w = map(int, input().split()) board = [] for _ in range(h): board.append(list(input())) input() str_arr = input() px, py = 0, 0 #현재 전차의 위치 좌표 head = "" #현재 전차의 머리 방향 for i in range(h): for j in range(w): if board[i][j] in ["^", "v", "<", ">"]: px = j #현재 전차의 위치 저장 py = i head = board[i][j] #현재 전차의 머리방향 저장 board[i][j] = "." #전차가 존재했던 곳은 .으로 처리(마지막에 전차의 위치만 찾아서 전차 모양으로 바꾸어줄 예정) break dic = {"U":"^", "D":"v", "L":"<", "R":">"} for k in str_arr: if k == "U": head = dic[k] #전차의 방향 바꾸기 # 배열의 범위를 벗어난 경우 건너뜀 if py-1 >= h or px >= w or py-1 < 0 or px < 0: continue if board[py-1][px] == ".": #이동하고자 하는 곳이 평지라면 py -= 1 #이동하고 좌표값 변경 elif k == "D": head = dic[k] if py+1 >= h or px >= w or py+1 < 0 or px < 0: continue if board[py+1][px] == ".": py += 1 elif k == "L": head = dic[k] if py >= h or px-1 >= w or py < 0 or px-1 < 0: continue if board[py][px-1] == ".": px -= 1 elif k == "R": head = dic[k] if py >= h or px+1 >= w or py < 0 or px+1 < 0: continue if board[py][px+1] == ".": px += 1 elif k == "S": #전차의 방향에 따라 이동할 위치 달라짐 if head == "^": for a in range(py, -1, -1): #현재 y좌표->0까지 탐색 if board[a][px] == "#": #포탄 튕겨져나감 break if board[a][px] == "*": #포탄으로 벽 뚫음 board[a][px] = "." break elif head == "v": for a in range(py, h): #현재 y좌표->h까지 탐색 if board[a][px] == "#": break if board[a][px] == "*": board[a][px] = "." break elif head == "<": for b in range(px, -1, -1): #현재 x좌표->0까지 탐색 if board[py][b] == "#": break if board[py][b] == "*": board[py][b] = "." break elif head == ">": for b in range(px, w): #현재 x좌표->w까지 탐색 if board[py][b] == "#": break if board[py][b] == "*": board[py][b] = "." break board[py][px] = head #최종 py, px 좌표에 head방향으로 전차표시 print("#{}".format(test_case), end=" ") for i in range(h): for j in range(w): print(board[i][j], end="") print()
다른 풀이 방법
move_list = [(-1, 0), (1, 0), (0, -1), (0, 1)] command_dict = {'U' : 0, 'D' : 1, 'L' : 2, 'R' : 3, 'S' :4, '^' : 0, 'v' : 1, '<': 2, '>': 3, 0: '^', 1: 'v', 2:'<', 3:'>'} serch_list = ['<', '>', '^', 'v'] for t in range(1, int(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))
풀이 출처: https://mungto.tistory.com/156
상호의 배틀필드 Python(SW Expert Academy)
난이도 : D3 문제번호 : 1873 ※ 저의 풀이가 무조건적인 정답은 아닙니다. 다른 코드가 좀더 효율적이고 좋을 수 있습니다. 다른사람들의 풀이는 언제나 참고만 하시기 바랍니다. 문제 주소 및 출
mungto.tistory.com
반응형
'Problem Solving > SWEA' 카테고리의 다른 글
[SWEA|파이썬] 3499. 퍼펙트 셔플 (D3) (0) | 2023.05.20 |
---|---|
[SWEA|파이썬] 5356. 의석이의 세로로 말해요 (D3) (0) | 2023.05.20 |
[SWEA|파이썬] 1230. [S/W 문제해결 기본] 8일차 - 암호문3 (D3) (0) | 2023.05.19 |
[SWEA|파이썬] 13428. 숫자 조작 (D3) (0) | 2023.05.18 |
[SWEA|파이썬] 3131. 100만 이하의 모든 소수 (D3)-에라토스테네스의 체 (1) | 2023.05.16 |
[SWEA|파이썬] 5948. 새샘이의 7-3-5 게임 (D3) (0) | 2023.05.16 |