코딩테스트/삼성 기출

백준 17406번 배열 돌리기 4 파이썬 해설/코드, 구현 문제, 삼성 A형 기출, 골드4

RyanKwon 2022. 1. 8. 14:00
728x90

코드만 궁금한 분은 깃허브 링크 눌러주세요!

 

 

문제 설명 ㄱㄱ

 

17406번: 배열 돌리기 4

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

www.acmicpc.net

 

문제 풀이 논리!

 

그냥... 주어진 대로 풀면 된다. 그래도 조금 팁을 주자면, 완전 탐색 문제인데 시간을 마구 쓸수는 없는 문제이다. 나는 처음에 근처 탐색을 모두 하고 조건에 맞는 요소들만 stack에 넣어서 풀었다. 한곳을 지정하면 어차피 시계방향이니까 스택에 주변의 요소를 넣을 때 시계방향으로 미리 순서를 지정해서 넣으면 원하는 요소만 숫자를 바꿀 수 있었다. 그런데이렇게 하면 시간초과가 나온다. 따라서 그냥 정해진 범위를 벗어날 때만 방향을 바꿔주는 형식으로 문제를 풀어야 시간내에 문제를 풀 수 있다. 이 또한 어차피 시계방향이라 푸는게 그렇게 어렵지 않다. 처음에 왜 이렇게 푸는걸 생각 못했지?ㅋㅋ 결국 남의 풀이를 또 살짝 참고해버렸다 흑.. 요새 내힘으로 푸는게 없는거같아 ㅜㅜ

 

next_r, next_c = cur[0]+dir[d][0], cur[1]+dir[d][1]
if next_r > r+size or next_r < r-size or next_c > c+size or next_c < c-size:
	next_r, next_c = cur[0]-dir[d][0], cur[1]-dir[d][1]
	d += 1
	next_r, next_c = cur[0]+dir[d][0], cur[1]+dir[d][1]

dir은 미리 오른쪽 -> 아래 -> 왼쪽 -> 윗쪽 방향으로 움직이도록 설정해뒀다. 범위를 넘기면 다시 돌아와서 그 다음 방향으로 진행한다.

tmp = [next_r, next_c]
origin = grid[tmp[0]][tmp[1]]
grid[tmp[0]][tmp[1]] = prev
prev = origin
cur = tmp
if tmp == start:
    break

이 부분은 이전 값을 저장해뒀다가 다음.. 부분에 설정하는 부분. 

 

회전을 여러군데에서 하는 경우 회전 순서에 따라 최종 값이 달라지니까 모두 확인해야한다.

728x90