ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SWEA] 1954: 달팽이
    코딩테스트/SWEA 2024. 11. 13. 08:02

    https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5PobmqAPoDFAUq&categoryId=AV5PobmqAPoDFAUq&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=PYTHON&select-1=2&pageSize=10&pageIndex=2

    요구사항

    • 시간 제한 10개 테스트 케이스 합쳐서 30초? 테스트 케이스당 3초니깐 무제한 시간제한임 거의
    • 메모리 제한도 256MB, 스택 메모리 1MB는 뭔지 모르겠다. 
    • 10이하 자연수를 입력하면 n x n 행렬을 출력해라. 시계 방향으로 돈다. 방문한 곳은 재방문하지 않는다. 

    설계

    • 우선 2차원 빈 배열을 만들어야 한다. 예를 들어 [[0, 0] [0, 0]] 과 같이 0으로 초기화한 2차원 배열. 그 이유는 만약 가봤는 데 0이 아니라면 방문했다는 소리니깐..
    • 방향 전환을 해야한다. 
      • dx = [0, 1, 0 -1]
      • dy = [1, 0 ,-1 ,0]
      • 그 이유는 처음에는 오른쪽으로 쭉.... 그다음에는 아래로 쭉... 왼쪽으로 쭉.... 위로 ... 반복
    • 초기 좌표를 초기화한다. x = y = 0
    • dx, dy 하나씩 증가시켜야 되고 배열의 범위를 넘어가는 경우 상하좌우로 4 주기마다 반복되기 때문에 %4를 이용한다. 
      • move = 0 초기화
    • for문을 돌려 출력할 수 있도록 한다. for k in range(1, k+1)
      • 초기좌표: 2차원배열[x][y] = k  -> 2차원배열[0][0] = 1 
      • nx = x + dx[move] -> nx = 0 + 0 
      • ny = y + dy[move] -> ny = 0 + 1 : 오른쪽으로 이동... 
      • nx, ny 가 배열의 범위 안에 있는 지 확인 and 이동하려는 좌표의 값이 0인지 확인(방문여부)
      • 만약 위 조건을 만족한다면, x와 y를 아래 값으로 업데이트 
        • x = nx  -> x = 0
        • y = ny  -> y = 1 
      • 그렇지 않다면 (배열의 범위를 벗어나거나 방문했다면)
        • move = (move + 1) % 4
        • x += dx[move] -> x = 0 + 1
        • y += dy[move] -> y = 0 + 0

    구현

    t = int(input())
    
    for i in range(1, t + 1):
        
        n = int(input())
        matrix = [[0]*n for _ in range(n)]
    
        dx = [0, 1, 0, -1]
        dy = [1, 0, -1, 0]
    
        x = y = 0
        move = 0
    
        for k in range(1, n*n + 1):
            matrix[x][y] = k
    
            nx = x + dx[move]
            ny = y + dy[move]
    
            if 0 <= nx < n and 0 <= ny < n and matrix[nx][ny] == 0:
                x = nx
                y = ny
            else:
                move = (move + 1) % 4
                x += dx[move]
                y += dy[move]
        
        print(f"#{i}")
    
        for a in matrix:
            print(*a)

    '코딩테스트 > SWEA' 카테고리의 다른 글

    [Python] 1926: 간단한 369게임  (2) 2024.11.14
    [SWEA] 1859. 백만 장자 프로젝트  (5) 2024.11.12
Designed by Tistory.