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

2023. 5. 19. 15:18·Problem Solving/SWEA
반응형
문제

https://tinyurl.com/2zo7gzgf

 

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
'Problem Solving/SWEA' 카테고리의 다른 글
  • [SWEA|파이썬] 5356. 의석이의 세로로 말해요 (D3)
  • [SWEA|파이썬] 1230. [S/W 문제해결 기본] 8일차 - 암호문3 (D3)
  • [SWEA|파이썬] 13428. 숫자 조작 (D3)
  • [SWEA|파이썬] 3131. 100만 이하의 모든 소수 (D3)-에라토스테네스의 체
청량리 물냉면
청량리 물냉면
프로그래밍 공부를 하고 있습니다. 공부 내용 정리 겸 정보 공유를 목적으로 합니다.
    반응형
  • 청량리 물냉면
    노력중인 블로그
    청량리 물냉면
  • 전체
    오늘
    어제
    • 분류 전체보기 (505)
      • 프로그래밍 (41)
        • Programming (1)
        • C | C++ (6)
        • Java (28)
        • Python (5)
      • 웹 프로그래밍 (108)
        • HTML | CSS (5)
        • JavaScript | TypeScript (41)
        • React (25)
        • Vue.js (0)
        • Next.js (18)
        • Spring & Spring Boot (13)
        • JSP & Servlet (1)
        • DB (4)
      • 웹 프로젝트 (77)
        • 웹 프로젝트 (22)
        • 🥨스낵몰 (3)
        • 👨‍👨‍👧‍👧소셜 가계부 (26)
        • 🌜꿈 일기장 (11)
        • 🔮포트폴리오 사이트 (11)
        • 🏃‍♂️팀 프로젝트: 일정관리 프로그램 (0)
        • 📈팀 프로젝트: AI기반 주식 분석 플랫폼 (0)
        • 😺Just Meow It: 조언 사이트 (2)
        • 📕Workly: 교대근무 다이어리 (1)
      • 앱 프로그래밍 (26)
        • Flutter (24)
        • Kotlin (2)
      • Problem Solving (166)
        • 백준 (52)
        • 프로그래머스 (79)
        • SWEA (29)
      • Computer Science (40)
        • 알고리즘 (14)
        • 컴퓨터 네트워크 (18)
        • 이산수학 (8)
      • Developer (47)
        • 후기 (4)
        • 자료정리 (4)
        • 취업 | 취준 (9)
        • SSAFY (1)
        • 웹개발 교육 프로그램 (9)
        • TIL (20)
  • 블로그 메뉴

    • 홈
    • Github
  • 공지사항

    • 프로그래밍 공부 중😊
  • 인기 글

  • 태그

    프로그래머스
    d3
    자바
    파이썬
    Jiraynor Programming
    bfs
    React
    포트폴리오
    클론 프로젝트
    강의내용정리
    프로젝트
    자바스크립트
    Next.js
    리액트
    뉴렉처
    알고리즘
    블로그 제작
    타입스크립트
    구현
    Til
    웹사이트
    백준
    컴퓨터네트워크
    mysql
    AWS
    SWEA
    공식문서
    spring boot
    플러터
    ZeroCho
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
청량리 물냉면
[SWEA|파이썬] 1873. 상호의 배틀필드 (D3)
상단으로

티스토리툴바