17140 - 이차원 배열과 연산

2022. 7. 7. 14:542022/BaekJoon_삼성 SW 역량 테스트 기출

처음에 텍스트 만으로는 이해하기 어려워서 아래 그림과 같이 그려가며 이해해보았다.

예제 1번 - 1
예제 1번 - 2
예제 1번 - 3

# R연산 : 배열 A의 모든 행에 대해서 정렬을 수행 -> 행의 개수 >= 열의 개수
# C연산 : 배열 A의 모든 열에 대해서 정렬을 수행 -> 행의 개수 < 열의 개수
def rowSort(graph):
    copyGraph = []
    maxRowLen = 0
    for rowGraph in graph:
        srGraph = set(rowGraph)
        lrGraph = list(srGraph)
        lrGraph.sort(reverse=True)
        tmp = []
        for i in range(len(lrGraph)):
            if lrGraph[i] == 0:
                continue
            tmp.append([lrGraph[i], rowGraph.count(lrGraph[i])])
        # 수의 등장 횟수가 커지는 순서로 -> 동일 횟수가 여러가지면 수가 커지는 순서로 정렬
        tmp.sort(key=lambda x : (x[1], x[0]))

        tmp2 = []
        for i in tmp:
            tmp2.append(i[0])
            tmp2.append(i[1])

        copyGraph.append(tmp2)
        maxRowLen = max(maxRowLen, len(tmp2))

    # 100이 넘으면 처음 100개의 수를 제외한 나머지는 버리기 
    if maxRowLen > 100:
        maxRowlen = 100
    for j in range(len(copyGraph)):
        if len(copyGraph[j]) < maxRowLen:
            copyGraph[j]+=[0]*(maxRowLen-len(copyGraph[j]))

    return copyGraph

def colSort(graph):
    colGraph = []
    for idx in range(len(graph[0])):
        tmp = []
        for i in range(len(graph)):
            tmp.append(graph[i][idx])

        colGraph.append(tmp)

    colGraph = rowSort(colGraph)
    # 행 - 열 전환
    transGraph = [[0]*len(colGraph) for _ in range(len(colGraph[0]))]
    for row in range(len(colGraph)):
        for col in range(len(colGraph[0])):
            transGraph[col][row] = colGraph[row][col]
    return transGraph


# 한 행 또는 열에 있는 수를 정렬하기 위해서, 각각의 수가 몇 번 나왔는지 확인 -> 등장 횟수가 커지는 순서 & 다수인 경우에는 수가 커지는 순서 정렬 -> 정렬 결과 삽입
R, C, K = map(int, input().split())
graph = []
for _ in range(3):
    graph.append(list(map(int, list(input().split()))))

cnt = 0
while True:
    if cnt > 100:
        print(-1)
        break
    # 범위 조건 추가
    if  0 <= R-1 < len(graph) and 0<=C-1<len(graph[0]) and graph[R-1][C-1] == K:
        print(cnt)
        break
    elif len(graph) >= len(graph[0]):
        graph = rowSort(graph)
    else:
        graph = colSort(graph)

    cnt += 1

 

예제 6번의 경우에는 [[1, 1, 1], [1, 1, 1], [1, 1, 1]] -> [[1, 3], [1, 3], [1, 3]] -> [[1, 1, 3, 1], [1, 1, 3, 1], [1, 1, 3, 1]] 의 정렬 끝에 2라는 결과가 나온다. 

그런데 처음에 이를 간과하고 바로 인덱싱을 했더니 2번째([[1, 3], [1, 3], [1, 3]]) 정렬에서  Out Of Index 에러가 났다. 

그래서 범위에 대한 조건(65번 줄)을 추가한 뒤에 PASS를 할 수 있었다.

'2022 > BaekJoon_삼성 SW 역량 테스트 기출' 카테고리의 다른 글

16235 - 나무재테크  (0) 2022.08.07
14499 - 주사위 굴리기  (0) 2022.07.26
17143 - 낚시왕  (0) 2022.06.25
15685 - 드래곤 커브  (0) 2022.06.10
16234 - 인구 이동  (0) 2022.05.13