백준 구현 대비 소용돌이 예쁘게 출력하기

yjkim·2023년 8월 7일
0

알고리즘

목록 보기
38/59

문제 : https://www.acmicpc.net/problem/1022

첫번째 접근

세가지 단계로 도식화하여 접근하였다.
1. 소용돌이 형태로 전체 그래프 초기화
2. 그래프에서 가장 긴 숫자 (가장 큰 숫자)의 길이 만큼 나머지 숫자의 길이도 맞춰줌

graph[i][j] = " " * (maxlenth - len(graph[i][j])) + graph[i][j]
  1. 문제에서 요구한 범위만큼 그래프 출력

결과 -> 메모리 초과

문제 발생 원인 : r1과 r2의 범위가 -5000~5000 이기 때문에 전체 배열을 초기화하는 방식을 선택하게 되면 배열의 최대 원소 갯수는 100,000,000개 가 됨. 이때 필요한 메모리의 크기는 400mb. 하지만 문제에서 제한한 메모리의 크기가 128mb기 때문에 메모리 범위를 한참 초과함. 즉 전체 배열을 초기화 하는 방식을 쓰면 안됨.

두번째 접근

아예 처음부터 문제에서 요구한 범위 만큼 그래프를 초기화 하는식으로 진행. 메모리 초과는 벗어났으나, 이번엔 출력 형식 에러가 뜸...
원인은 최댓값을 선택하는 과정에 있었음. 그래프의 범위는 조정하여 설정을 하였으나 최댓값을 정하는 기준은 이전 단계와 변하지 않았기 때문에 출력하는 과정에서 에러가 발생한 것. 최댓값을 문제 요구 범위 내에서 찾아야함.

전체 코드

r1, c1, r2, c2 = map(int, input().split())

movelist = [[0, 1], [-1, 0], [0, -1], [1, 0]]
maxlen = max(map(abs, (r1, c1, r2, c2)))

graph = [[0 for i in range(c2-c1+1)] for j in range(r2-r1+1)]


count = 1  # 진행되어야할 횟수
num = 1  # 들어갈 숫자
cd = 0  # 방향
si, sj = maxlen, maxlen  # 초기좌표
cut = 1  # 진행되어야 할 횟수
maxnum=0
while 0 <= si < 2 * maxlen + 1 and 0 <= sj < 2 * maxlen + 1:
    while count > 0:
        if r1+maxlen <=si < r2+ maxlen+1  and c1+maxlen <= sj < c2+maxlen+1:    
          graph[si-maxlen-r1][sj-maxlen-c1] = num
          maxnum=num
        num += 1
        si, sj = si + movelist[cd][0], sj + movelist[cd][1]
        count -= 1

    if cd % 2 == 1:
        cut += 1
    count = cut
    cd = (cd + 1) % 4


maxlenth = 0
while maxnum > 0:
    maxnum = maxnum // 10
    maxlenth += 1
# maxlenth는 숫자 길이


for i in range(r2-r1+1):
    for j in range(c2-c1+1):
        graph[i][j] = str(graph[i][j])
        graph[i][j] = " " * (maxlenth - len(graph[i][j])) + graph[i][j]
        print(graph[i][j], end=" ")
    print()
profile
컴퓨터 공부 / 백엔드 개발

0개의 댓글