[BOJ] 17140번 이차원 배열과 연산 (Python) [삼성 SW 역량 테스트 기출 문제]

천호영·2023년 2월 15일
0

알고리즘

목록 보기
73/100
post-thumbnail

문제

https://www.acmicpc.net/problem/17140

풀이

  • R연산, C연산을 각각 구현하지 않고, R연산만 구현한 후 C연산은 배열을 회전하여 R연산을 이용하도록 했다. 이러한 문제가 저번 문제에서도 한번 있었어서 자주 나오는 패턴 같다.
  • 시계방향 회전 == 반시계방향 회전 3번, 반시계 방향 회전 == 시계방향 회전 3번 임을 이용해서 한가지 회전만 구현해서 풀었다.
  • 배열의 길이가 계속 달라지므로 r,c 위치에서 인덱스 에러가 발생할 수 있다는걸 테스트 케이스를 통해서 깨달았다. 해당 테스트 케이스가 없었으면 찾는데 오래걸렸을 것 같다. 문제 이해할때 좀 더 깊게 이해했어야 한다.

+) zip 연산으로 2차원 배열 편하게 transpose시키는 법 알아보자
=> 코딩테스트 팁에 추가완료

from collections import Counter


def counter_clockwise(graph):
    """2차원 배열 반시계 방향 회전한 배열 반환"""
    M = len(graph)
    N = len(graph[0])
    new_graph = []
    for j in reversed(range(N)):
        new_graph.append([graph[i][j] for i in range(M)])
    return new_graph


def unpack_tuple_to_list(line):
    """[(0,1),(2,3)] => [0,1,2,3]"""
    temp_list = []
    for l in line:
        if l[0] != 0:  # 0은 무시
            temp_list.append(l[0])
            temp_list.append(l[1])
    return temp_list


def op_R(graph):
    new_graph = []
    for line in graph:
        new_line = Counter(line).most_common()
        new_line.sort(key=lambda x: (x[1], x[0]))  # 등장횟수, 수
        new_line = unpack_tuple_to_list(new_line)
        new_graph.append(new_line)

    # 0 채우기
    max_len = max(len(l) for l in new_graph)
    for line in new_graph:
        while len(line) != max_len:
            line.append(0)

    return new_graph


r, c, k = map(int, input().split())
r, c = r - 1, c - 1  # 인덱스 0부터 읽게
A = [list(map(int, input().split())) for _ in range(3)]

# ANS
second = 0
while second <= 100:
    M = len(A)  # 행 개수
    N = len(A[0])  # 열 개수

    if 0 <= r < M and 0 <= c < N and A[r][c] == k:  # 인덱스 체크 필요
        print(second)
        break

    if M >= N:  # 행 >= 열
        A = op_R(A)
    else:
        # 반시계로 뒤집어서 op_R에 전달
        A = op_R(counter_clockwise(A))

        # 결과 시계 방향으로 뒤집어서 A에 저장(반시계3번==시계1번)
        for _ in range(3):
            A = counter_clockwise(A)

    second += 1

if second == 101:  # while문 끝까지 돌았으면
    print(-1)
profile
성장!

0개의 댓글