Algorithm/Python

[백준 17140] 이차원 배열과 연산

🥭맹2 2021. 4. 20. 21:43

1. 문제

www.acmicpc.net/problem/17140

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