본문 바로가기

Algorithm/SWEA

[SWEA] D3. 상호의 배틀필드

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

 

SW Expert Academy

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

swexpertacademy.com

 

 

1. 해결방법

로직 자체는 어렵지 않으나 조건이 많고 코드가 길어져서 시간을 꽤 소모했다. 1시간 30분정도 걸렸다,,,, (디버깅 40분)

1. 맵에서 탱크의 위치와 방향을 저장한다. (y, x, direct)
2. 커맨드를 For문 돌려서 대포 발사와 탱크 방향 이동 커맨드를 분리시켜 조건문을 단다.
3. S인 경우 각 방향에 맞는 다음 좌표를 확인하고, 벽돌과 강철일 경우 조건에 맞게 처리하고 break한다. (벽에 한번 부딪히면 멈춰야 함.)
4. UDLR이면 각 방향에 대해 범위에 벗어나지 않도록 조건문을 달고 평지일 경우 탱크의 위치를 이동한다.
5. 탱크의 위치가 이동하든 안하든 방향은 무조건 바뀌어야 한다.

 

 

2. 정답코드

T = int(input())
# T = 10
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
    H, W = map(int, input().split())
    maps = [list(map(str, input().strip())) for _ in range(H)]
    N = int(input())
    strings = list(map(str, input().strip()))

    tank = []
    for i in range(H):
        for j in range(W):
            if maps[i][j] == '<' or maps[i][j] == '>' or maps[i][j] == '^' or maps[i][j] == 'v':
                tank.append((i, j, maps[i][j]))
                break
        else: continue

    y, x, direct = tank[0][0], tank[0][1], tank[0][2]
    for s in strings:
        # 대포 발사 문자열 (S)
        if s == 'S':
            # 탱크 방향이 왼쪽
            if direct == '<':
                for k in range(x - 1, -1, -1): # 왼쪽 탐색
                    if maps[y][k] == '*':  # 벽돌 일때,
                        maps[y][k] = '.'
                        break
                    elif maps[y][k] == '#':    # 강철 일때,
                        break
            # 탱크 방향이 오른쪽
            elif direct == '>':
                for k in range(x + 1, W):
                    if maps[y][k] == '*':  # 벽돌 일때,
                        maps[y][k] = '.'
                        break
                    elif maps[y][k] == '#':
                        break
            # 탱크 방향이 위쪽
            elif direct == '^':
                for k in range(y - 1, -1, -1):
                    if maps[k][x] == '*':
                        maps[k][x] = '.'
                        break
                    elif maps[k][x] == '#':
                        break
            # 탱크 방향이 아래쪽
            elif direct == 'v':
                for k in range(y + 1, H):
                    if maps[k][x] == '*':
                        maps[k][x] = '.'
                        break
                    elif maps[k][x] == '#':
                        break

        # 이동 문자열 (U, D, L, R)
        # 위쪽 이동
        elif s == 'U':
            direct = '^'
            # 평지 일때
            if 0 <= y - 1 < H:
                if maps[y - 1][x] == '.':
                    maps[y][x] = '.'
                    y -= 1
            maps[y][x] = direct
        # 아래쪽 이동
        elif s == 'D':
            direct = 'v'
            # 평지 일때
            if 0 <= y + 1 < H:
                if maps[y + 1][x] == '.':
                    maps[y][x] = '.'
                    y += 1
            maps[y][x] = direct
        # 왼쪽 이동
        elif s == 'L':
            direct = '<'
            # 평지 일때
            if 0 <= x - 1 < W:
                if maps[y][x - 1] == '.':
                    maps[y][x] = '.'
                    x -= 1
            maps[y][x] = direct
        # 오른쪽 이동
        elif s == 'R':
            direct = '>'
            # 평지 일때
            if 0 <= x + 1 < W:
                if maps[y][x + 1] == '.':
                    maps[y][x] = '.'
                    x += 1
            maps[y][x] = direct

    for i in range(H):
        if i == 0:
            print(f'#{test_case} ' + ''.join(map(str, maps[i])))
        else:
            print(''.join(map(str, maps[i])))

'Algorithm > SWEA' 카테고리의 다른 글

[SWEA] D3. 최장 증가 부분 수열  (0) 2022.11.17
[SWEA] D3. 재미있는 오셀로 게임  (0) 2022.11.14
[SWEA] D3. 회문2  (0) 2022.11.11
[SWEA] D3. N-Queen  (0) 2022.11.11
[SWEA] D3. Magnetic  (0) 2022.11.11