[BOJ] 17140 - 이차원 배열과 연산

Jiyoon·2023년 3월 12일
1

Algorithm

목록 보기
23/24
post-custom-banner

초기 설정

r, c, k 정보 및 배열을 저장해준다

# r,c,k 정보 저장
info = input().strip().split(' ')
for i in range(len(info)):
    info[i] = int(info[i])

# 배열 저장
arr = []
for _ in range(3):
    row = input().strip().split(' ')
    for i in range(len(row)):
        row[i] = int(row[i])
    arr.append(row)

sec 값(초)이 100 이하일 때 계속 루프를 돌린다
IndexError를 except 해준 이유는 A[r][c]에 들어있는 값이 k가 맞는지 확인하는 과정을 거칠 때, A[r][c] 값이 없는 경우가 존재하기 때문
→ 쓰면 안되나 싶었는데 0이 들어가는 자리도 아니고 넘어가는 이유가 그냥 ‘자리에 없어서’ 하나라,,, 썼다!

while sec <= 100:

    try:
        if arr[info[0]-1][info[1]-1] == info[2]:
            flag = True
            break
    
    except IndexError:
        pass


R 연산

문제에서 하라는대로 하면 된다
숫자의 갯수와 크기를 기준으로 정렬한 후, 새로운 배열을 만들어준다
이후 행 크기의 최댓값을 구하고 빈 공간은 0으로 채운다

		row_num = len(arr)
    col_num = len(arr[0])

    # 행 or 열의 최대 사이즈 초깃값 설정
    max_size = 0

    # R연산
    if row_num >= col_num:
        idx = 0
        for i in arr:
            row_unique = list(set(i))
            # 0이 있을 경우 제거
            if row_unique.count(0):
                row_unique.remove(0) 

            unique_num = []
            for s in row_unique:
                unique_num.append((s, i.count(s)))
            
            # 갯수 -> 크기 순
            sorted_lst = sorted(unique_num, key=lambda x: (x[1], x[0]))
            i = []
            for s in sorted_lst:
                (num, count) = s
                i.append(num)
                i.append(count)
            
            # arr & 행 크기 최댓값 갱신
            max_size = max(max_size, len(i))
            arr[idx] = i
            idx += 1

        # 빈 공간 0 채우기 
        for i in arr:
            if len(i) < max_size:
                i += [0]*(max_size-len(i))


C 연산

R연산과 동일한 로직이지만 열을 기준으로 잡기 때문에 조금 더 복잡할 뿐이다
파이썬 내장함수 zip()만 쓰면 바로 전치행렬을 구할 수 있는게,,, 좀 신기했다

		# C연산
    else:
        arr_col = []
        for i in range(len(arr[0])):
            col_lst = []
            for s in arr:
                col_lst.append(s[i])
            col_unique = list(set(col_lst))

            # 0이 있을 경우 제거
            if col_unique.count(0):
                col_unique.remove(0) 

            unique_num = []
            for s in col_unique:
                unique_num.append((s, col_lst.count(s)))
            
            # 갯수 -> 크기 순
            sorted_lst = sorted(unique_num, key=lambda x: (x[1], x[0]))
            col = []
            for s in sorted_lst:
                (num, count) = s
                col.append(num)
                col.append(count)

            # 열 크기 최댓값 갱신
            max_size = max(max_size, len(col))
            arr_col.append(col)

        # 빈 공간 0 채우기 
        for i in arr_col:
            if len(i) < max_size:
                i += [0]*(max_size-len(i)) 

        arr = list(zip(*arr_col))


보완할 점

문제를 풀 때 사용해야 하는 변수가 많아 변수 네이밍이 깔끔하지 못 했던 것 같다



전체 코드

import sys
input = sys.stdin.readline

# r,c,k 정보 저장
info = input().strip().split(' ')
for i in range(len(info)):
    info[i] = int(info[i])

# 배열 저장
arr = []
for _ in range(3):
    row = input().strip().split(' ')
    for i in range(len(row)):
        row[i] = int(row[i])
    arr.append(row)

sec = 0
flag = False
while sec <= 100:

    try:
        if arr[info[0]-1][info[1]-1] == info[2]:
            flag = True
            break
    
    except IndexError:
        pass
    
    row_num = len(arr)
    col_num = len(arr[0])

    # 행 or 열의 최대 사이즈 초깃값 설정
    max_size = 0

    # R연산
    if row_num >= col_num:
        idx = 0
        for i in arr:
            row_unique = list(set(i))
            # 0이 있을 경우 제거
            if row_unique.count(0):
                row_unique.remove(0) 

            unique_num = []
            for s in row_unique:
                unique_num.append((s, i.count(s)))
            
            # 갯수 -> 크기 순
            sorted_lst = sorted(unique_num, key=lambda x: (x[1], x[0]))
            i = []
            for s in sorted_lst:
                (num, count) = s
                i.append(num)
                i.append(count)
            
            # arr & 행 크기 최댓값 갱신
            max_size = max(max_size, len(i))
            arr[idx] = i
            idx += 1

        # 빈 공간 0 채우기 
        for i in arr:
            if len(i) < max_size:
                i += [0]*(max_size-len(i)) 
                
    # C연산
    else:
        arr_col = []
        for i in range(len(arr[0])):
            col_lst = []
            for s in arr:
                col_lst.append(s[i])
            col_unique = list(set(col_lst))

            # 0이 있을 경우 제거
            if col_unique.count(0):
                col_unique.remove(0) 

            unique_num = []
            for s in col_unique:
                unique_num.append((s, col_lst.count(s)))
            
            # 갯수 -> 크기 순
            sorted_lst = sorted(unique_num, key=lambda x: (x[1], x[0]))
            col = []
            for s in sorted_lst:
                (num, count) = s
                col.append(num)
                col.append(count)

            # 열 크기 최댓값 갱신
            max_size = max(max_size, len(col))
            arr_col.append(col)

        # 빈 공간 0 채우기 
        for i in arr_col:
            if len(i) < max_size:
                i += [0]*(max_size-len(i)) 

        arr = list(zip(*arr_col))

    sec += 1

if flag:
    print(sec)
else:
    print(-1)
post-custom-banner

0개의 댓글