[백준] 1913. 달팽이 (Python)

yuuforest·2023년 9월 25일

구현

목록 보기
7/9
post-thumbnail

백준 문제 풀이 - 구현

📰 문제


문제 확인 🏃


💡 입출력 예제


7
35

>> 49 26 27 28 29 30 31
48 25 10 11 12 13 32
47 24 9 2 3 14 33
46 23 8 1 4 15 34
45 22 7 6 5 16 35
44 21 20 19 18 17 36
43 42 41 40 39 38 37
5 7
5
1

>> 25 10 11 12 13
24 9 2 3 14
23 8 1 4 15
22 7 6 5 16
21 20 19 18 17
3 3

💬 풀이


🎵 첫번째 풀이

N = int(input())        # 달팽이의 크기
answer = int(input())   # 찾아야 하는 수


def solution():
    graph = [[0] * N for _ in range(N)]
    
    r, c = N//2, N//2
    flag = True             # True면 위로 오른쪽으로 / False면 아래로 왼쪽으로
    flag_answer = True      # 좌표를 찾은 경우 False / 좌표를 찾지 못한 경우 True

    dr = [-1, 0, 1, 0]             # 위 오른 아래 왼
    dc = [0, 1, 0, -1]

    dir1, dir2, number = 0, 0, 2
    ansr, ansc = 0, 0

    graph[r][c] = 1
    if answer == 1: 
        flag_answer = False
        ansr, ansc = r, c

    for num in range(1, N):
        
        if flag:
            dir1, dir2 = 0, 1
            flag = False
        else:
            dir1, dir2 = 2, 3
            flag = True

        for _ in range(num):
            r += dr[dir1]
            c += dc[dir1]
            graph[r][c] = number
            if flag_answer and number == answer: 
                flag_answer = False
                ansr, ansc = r, c
            number += 1

        for _ in range(num):
            r += dr[dir2]
            c += dc[dir2]
            graph[r][c] = number
            if flag_answer and number == answer: 
                flag_answer = False
                ansr, ansc = r, c
            number += 1

    for _ in range(num):
        r += dr[0]
        c += dc[0]
        graph[r][c] = number
        if flag_answer and number == answer: 
                flag_answer = False
                ansr, ansc = r, c
        number += 1

    for i in range(N):
        for j in range(N):
            print(graph[i][j], end=" ")
        print()

    print(ansr+1, ansc+1)
    
solution()

🎵 두번째 풀이

N = int(input())        # 달팽이의 크기
answer = int(input())   # 찾아야 하는 수

def solution():
    graph = [[0] * N for _ in range(N)]
    
    r, c = N//2, N//2
    flag, ansr, ansc = True, 0, 0

    dir = [[-1, 0], [0, 1], [1, 0], [0, -1]]    # 위 오른쪽 아래 왼쪽
    dir_idx = 0

    number, count = 1, 1

    for _ in range(N-1):
        for _ in range(2):
            for _ in range(count):
                graph[r][c] = number
                if flag and number == answer:
                    flag, ansr, ansc = False, r, c
                r += dir[dir_idx][0]
                c += dir[dir_idx][1]
                number += 1
            dir_idx = (dir_idx + 1) % 4
        count += 1

    for _ in range(count):
        graph[r][c] = number
        if flag and number == answer:
            flag, ansr, ansc = False, r, c
        r += dir[dir_idx][0]
        c += dir[dir_idx][1]
        number += 1

    for i in range(N):
        for j in range(N):
            print(graph[i][j], end=" ")
        print()

    print(ansr+1, ansc+1)
    
solution()


✒️ 생각


반복되는 횟수에 집중해서 문제 풀어봄.. 다른 분들은 더 간단히 푸신것 같던데 꼭 다른 코드도 생각해봐야지😧

profile
🐥 Backend Developer 🐥

0개의 댓글