코테 연습

 

구현

첫 번째

import sys
input = lambda: sys.stdin.readline().rstrip()

result = []
for _ in range(int(input())):
    n, d = map(int, input().split())
    d = d // 45 % 8
    n_2 = n//2

    grid = [list(map(int, input().split())) for _ in range(n)]
    moved_grid = [[0] * n for _ in range(n)]

    for _ in range(d):
        for r in range(n):
            for c in range(n):
                # 주 대각선
                if r == c:
                    moved_grid[r][n_2] = grid[r][c]
                    continue
                # 가운데 열
                if c == n_2:
                    moved_grid[r][n-r-1] = grid[r][c]
                    continue
                # 부 대각선
                if r + c == n-1:
                    moved_grid[n_2][c] = grid[r][c]
                # 가운데 행
                if r == n_2:
                    moved_grid[c][c] = grid[r][c]
        for r in range(n):
            for c in range(n):
                if not moved_grid[r][c]:
                    moved_grid[r][c] = grid[r][c]
        grid = moved_grid
        moved_grid = [[0] * n for _ in range(n)]
    result.append(grid)

for res in result:
    for row in res:
        print(*row, sep=" ")
import sys
from collections import deque

input = sys.stdin.readline
answer = []

for _ in range(int(input())):
    n, d = map(int, input().split())
    board = [list(input().split()) for _ in range(n)]
    lines = [list() for _ in range(8)]

    for i in range(n // 2):
        lines[0].append(board[i][i])

    for i in range(n // 2):
        lines[1].append(board[i][n // 2])

    for i in range(n // 2):
        lines[2].append(board[i][n - i - 1])

    for i in range(n // 2):
        lines[3].append(board[n // 2][n - i - 1])

    for i in range(n // 2):
        lines[4].append(board[n - i - 1][n - i - 1])

    for i in range(n // 2):
        lines[5].append(board[n - i - 1][n // 2])

    for i in range(n // 2):
        lines[6].append(board[n - i - 1][i])

    for i in range(n // 2):
        lines[7].append(board[n // 2][i])

    lines = deque(lines)

    count = d // 45

    if count >= 0:
        for _ in range(count):
            lines.appendleft(lines.pop())
    else:
        for _ in range(-count):
            lines.append(lines.popleft())

    for i in range(n // 2):
        board[i][i] = lines[0][i]

    for i in range(n // 2):
        board[i][n // 2] = lines[1][i]

    for i in range(n // 2):
        board[i][n - i - 1] = lines[2][i]

    for i in range(n // 2):
        board[n // 2][n - i - 1] = lines[3][i]

    for i in range(n // 2):
        board[n - i - 1][n - i - 1] = lines[4][i]

    for i in range(n // 2):
        board[n - i - 1][n // 2] = lines[5][i]

    for i in range(n // 2):
        board[n - i - 1][i] = lines[6][i]

    for i in range(n // 2):
        board[n // 2][i] = lines[7][i]

    for row in board:
        answer.append(' '.join(row))

print("\n".join(answer))

 

위 코드가 내가 작성한 코드이고 아래 코드가 우수한 공개 코드이다.

나는 45도 회전할 때마다 원소를 바꿔가며 진행했지만

우수한 코드는 8개의 line을 리스트에 저장해놓고

회전할 때는 자료구조 queue를 이용해서 line을 popleft and append로 진행했다.

배울 것이 있는 풀이였다.

 

그래프

첫 번째

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

 

1043번: 거짓말

지민이는 파티에 가서 이야기 하는 것을 좋아한다. 파티에 갈 때마다, 지민이는 지민이가 가장 좋아하는 이야기를 한다. 지민이는 그 이야기를 말할 때, 있는 그대로 진실로 말하거나 엄청나게

www.acmicpc.net

 

다이나믹 프로그래밍

첫 번째

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

 

2407번: 조합

n과 m이 주어진다. (5 ≤ n ≤ 100, 5 ≤ m ≤ 100, m ≤ n)

www.acmicpc.net

import sys
input = lambda: sys.stdin.readline().rstrip()

n, m = map(int, input().split())

def solve():
    dp = [[0] * (n+1) for _ in range(n+1)]
    for i in range(1, n+1):
        for j in [0, i]:
            dp[i][j] = 1
    
    for i in range(2, n+1):
        for j in range(1, n):
            dp[i][j] = dp[i-1][j] + dp[i-1][j-1]
    return dp[n][m]

print(solve())

 

조합의 파스칼 삼각형 특징을 이용한 문제 풀이이다.

조합의 공식을 사용해도 되지만 그러면 의미가 없으니깐 dp로 풀이했다.

핵심 계산식은 아래와 같다.

dp[i][j] = dp[i-1][j] + dp[i-1][j-1]

 

 

 

 

'알고리즘' 카테고리의 다른 글

11.21 알고리즘 문제풀이  (2) 2023.11.21
11.20 알고리즘 문제풀이  (1) 2023.11.20
11.18 알고리즘 문제풀이  (0) 2023.11.18
다이나믹 프로그래밍 정리  (0) 2023.11.16
11.16 알고리즘 문제풀이  (1) 2023.11.16