1. 문제
2. 접근 방법
배열의 행의 갯수 >= 열의 갯수일 경우에는 R연산,
배열의 행의 갯수 < 열의 갯수일 때는 C연산을 해줘야합니다.
R연산은 가로로 정렬이 진행되는 연산이고,
C연산은 세로로 정렬이 진행되는 연산입니다.
저는 여기서 이렇게 생각했슴다!!!
고럼 정렬하는 거 하나만 만들어놓고 회전을 시키면 안될까?!?!?!?!
저는 그렇게 R연산만 만들어놓고
C연산은 현재 배열을 회전시킨 후 R연산을 진행하고 다시 회전시킨 모습으로 만들었씁니다.
여기까지는 어렵지 않은데여
문제는 여깁니다.
a[r][c] = k가 되는 시간을 구하는 건데여
중간 과정을 거치다보면 r과 c가 배열의 범위를 벗어날 수도 있다는 말입니다.
처음에 제출했을 때 런타임 오류가 뜨면서 index error가 떠서 무척 놀랬는데여!
바로 이거였습니다.
근데 사실 정답에 영향을 끼치는 것은 아니고 중간에 배열의 크기가 계속해서 변화하면서 생길 수 있는 문제이기 때문에
그냥 배열이 넘어가면 (즉 인덱스 오류가 생긴다면)
오류 처리 해줘서 시간만 +1 해주고 다음 연산을 진행하게 넘겨줬습니다 !
3. 코드
python
def funcC():
global board
board = rotate(board)
funcR()
board = rotate(board)
def rotate(inlst):
outlst = [[0]*len(inlst) for _ in range(len(inlst[0]))]
for y in range(len(inlst)):
for x in range(len(inlst[0])):
outlst[x][y] = inlst[y][x]
return outlst
def funcR():
global board
temp_board = []
max_length = 0
for i in range(len(board)):
temp_set = list(set(board[i]))
temp = []
for idx in range(len(temp_set)):
if temp_set[idx] == 0:
continue
temp_cnt = board[i].count(temp_set[idx])
temp.append([temp_set[idx], temp_cnt])
temp.sort(key=lambda x : (x[1], x[0]))
t = len(temp)
for i in range(t):
x, y = temp.pop(0)
temp.append(x)
temp.append(y)
temp_board.append(temp)
max_length = max(max_length, len(temp))
for i in range(len(temp_board)):
length = len(temp_board[i])
if len(temp_board[i]) < max_length:
temp_board[i] += [0]*(max_length-length)
board = temp_board
r, c, k = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(3)]
total_time = 0
while True:
try:
if board[r-1][c-1] == k:
print(total_time)
break
else:
total_time += 1
except:
total_time += 1
if total_time > 100:
print(-1)
break
if len(board) >= len(board[0]):
funcR()
else:
funcC()
4. 마치며
인덱스를 넘어갔을 때의 테케는 다음과 같습니다.
4 4 1
1 2 1
2 1 3
3 3 3
'Algorithm > Python' 카테고리의 다른 글
[백준 17837] 새로운 게임2 (0) | 2021.04.21 |
---|---|
[백준 17142] 연구소3 (0) | 2021.04.20 |
[백준 17143] 낚시왕 (0) | 2021.04.20 |
[백준 17144] 미세먼지 안녕! (0) | 2021.04.20 |
[백준 16234] 인구 이동 (0) | 2021.04.19 |