chyam

[백준] 1730번,python - 판화 본문

백준

[백준] 1730번,python - 판화

chyam_eun 2025. 8. 26. 11:15

https://www.acmicpc.net/problem/1730

n = int(input())
m = input()

# 세로, 가로 흔적을 따로 기록
vert = [[False] * n for _ in range(n)]
horiz = [[False] * n for _ in range(n)]

x, y = 0, 0
move = {'U': (-1, 0), 'D': (1, 0), 'L': (0, -1), 'R': (0, 1)}

for d in m:
    dx, dy = move[d]
    nx, ny = x + dx, y + dy

    # 범위를 벗어나면 이동/표시 모두 무시
    if not (0 <= nx < n and 0 <= ny < n):
        continue

    if d in 'UD':
        vert[x][y] = True
        vert[nx][ny] = True
    else:
        horiz[x][y] = True
        horiz[nx][ny] = True

    x, y = nx, ny # 위치 업데이트 

# 결과 출력
for i in range(n):
    row = []
    for j in range(n):
        if vert[i][j] and horiz[i][j]: # 세로, 가로 둘다 진행됐을때
            row.append('+')
        elif vert[i][j]:
            row.append('|')
        elif horiz[i][j]:
            row.append('-')
        else:
            row.append('.')
    print(''.join(row))

 

처음 틀린 풀이는 아래와같다. 따로 가로 세로 지난걸 저장하지 않고, 바로 이전에 지난것만 생각을 하였다.

n = int(input()) 
li = [["."]* n for _ in range(n)] 
m = input() 
move = { "U":[-1,0], "D":[1,0], "L":[0,-1], "R":[0,1] } 
# 처음 행동 
prev = m[0] li[0][0] = "|" if prev == "U" or prev == "D" else "-" 
x, y = move[prev][0],move[prev][1] 
for i in range(1,len(m)): 
    dx, dy = move[m[i]] 
    tmp_x, tmp_y = dx + x, dy + y 
    if 0 <= tmp_x < n and 0 <= tmp_y < n: # 범위 내일 때 
        if prev == "U" or prev == "D": 
            if m[i] == "R" or m[i] == "L": 
            	li[x][y] = "+" 
            else: 
            	li[x][y] = "|" 
        else: 
        	if m[i] == "U" or m[i] == "D": 
        		li[x][y] = "+" 
           	else:
                li[x][y] = "-" 
    x, y = tmp_x,tmp_y 
    prev = m[i] 
    
if prev == "U" or prev == "D": 
	li[x][y] = "|" 
else: 
	li[x][y] = "-" 
    
# 출력
for row in li:
    print("".join(row))