Carnival7
Change Developer
Carnival7
전체 방문자
오늘
어제
  • 분류 전체보기
    • 자바의 정석
    • 프로그래밍 언어별 tools
      • 파이썬
      • 자바
    • 코딩 테스트
      • 백준 강의 기초편
      • 백준 강의 연습편
      • 백준 강의 문제편
      • 삼성 기출
      • 백준 - 일반
      • 카카오 기출
      • 프로그래머스 - 일반
      • 코테 풀이 Tools
    • CS
      • Network
      • 운영체제
      • 알고리즘
      • DB
    • Web_Backend
      • Spring
      • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
      • 스프링 핵심 원리 - 기본편
    • DevOps
    • IT 업무 지식
      • 인프라
      • 클라우드
    • 자격증
      • AWS - CLF
      • 정처기 - 실기
    • 생각 정리

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 슬라이딩 윈도우 #덱
  • 슬라이딩 윈도우
  • code deploy
  • DMZ
  • ci/cd
  • 코딩테스트 #삼성기출 #구현 #시뮬레이션
  • nginx
  • DevOps
  • 삼성기출 #백준강의문제편
  • 스프링 부트 무중단 웹 서비스
  • 삼성기출 #2023 #상반기
  • 프로그래머스 #카카오기출 #레벨2
  • 알고리즘 #백준강의기초편 #코딩테스트
  • Github Actions
  • 스프링 #인터셉터 #AOP #필터
  • 스프링 #AOP

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Carnival7

Change Developer

코딩 테스트/백준 강의 문제편

브루트포스) 17406.배열 돌리기 4

2022. 9. 22. 16:53

17406번: 배열 돌리기 4 (acmicpc.net)

 

17406번: 배열 돌리기 4

크기가 N×M 크기인 배열 A가 있을때, 배열 A의 값은 각 행에 있는 모든 수의 합 중 최솟값을 의미한다. 배열 A가 아래와 같은 경우 1행의 합은 6, 2행의 합은 4, 3행의 합은 15이다. 따라서, 배열 A의

www.acmicpc.net

from itertools import permutations
from collections import deque
from copy import deepcopy

n,m,k= map(int,input().split())
a=list(list(map(int,input().split())) for _ in range(n))
ops=list(list(map(int,input().split())) for _ in range(k))
ans=int(1e9)

# 매트릭스 시계방향 90도 회전
# 배열을 그룹 짓고 요소 rotate 후 다시 넣기
# rotate는 시간복잡도가 O(k)로, 회전횟수만큼의 시간복잡도만을 가진다.
# 그룹의 개수는 K=min(n,m)//2 다. 5x5 등으로 홀수일 경우, 가운데 1개는 돌지 않기에 회전 전과 후의 변화가 없다.
# 그룹별 요소는 윗줄, 오른쪽 줄, 아랫줄, 왼쪽 줄 순서로 큐에 담겨 회전된다.
# 수식은 위의 순서대로 a[k][j](k<=j<m-k), a[i][m-k-1](k<=i<n-k), a[n-k-1][j](k<=j<m-k), a[i][k](k<=i<n-k) 이다.
def rotate_group_clock_90(a):
    n=len(a)
    m=len(a[0])

    K=min(n,m)//2

    for k in range(K):
        q=deque()
        for j in range(k,m-k-1):
            q.append(a[k][j])
        for i in range(k,n-k-1):
            q.append(a[i][m-k-1])
        for j in range(m-k-1,k,-1):
            q.append(a[n-k-1][j])
        for i in range(n-k-1,k,-1):
            q.append(a[i][k])
        q.rotate(1)
        for j in range(k, m - k - 1):
            a[k][j]=q.popleft()
        for i in range(k, n - k - 1):
            a[i][m - k - 1]=q.popleft()
        for j in range(m - k - 1, k, -1):
            a[n - k - 1][j]=q.popleft()
        for i in range(n - k - 1, k, -1):
            a[i][k]=q.popleft()

    return a

def process(sx,sy,ex,ey,b):
    n1,m1=ex-sx+1,ey-sy+1
    part=[[0]*m1 for _ in range(n1)]

    for x in range(n1):
        for y in range(m1):
            part[x][y]=b[x+sx][y+sy]

    rotated_part=rotate_group_clock_90(part)

    for x in range(n1):
        for y in range(m1):
            b[x+sx][y+sy]=rotated_part[x][y]

    return b

# 모든 연산을 순서를 바꿔가며 수행한다.
for perm in permutations(ops,k):
    b=deepcopy(a)
    for r,c,s in perm:
        sx,sy,ex,ey=r-s-1,c-s-1,r+s-1,c+s-1
        b=process(sx,sy,ex,ey,b)
    for row in b:
        ans=min(ans,sum(row))

print(ans)

'코딩 테스트 > 백준 강의 문제편' 카테고리의 다른 글

17069. 파이프 옮기기 2  (1) 2022.10.03
브루트포스) 16637.괄호 추가하기  (1) 2022.09.22
브루트 포스) 20058.마법사 상어와 파이어스톰  (0) 2022.09.22
    '코딩 테스트/백준 강의 문제편' 카테고리의 다른 글
    • 17069. 파이프 옮기기 2
    • 브루트포스) 16637.괄호 추가하기
    • 브루트 포스) 20058.마법사 상어와 파이어스톰
    Carnival7
    Carnival7

    티스토리툴바