[백준] 17140번 이차원 배열과 연산 _ 문제 풀이

 


1. 문제

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

2. 풀이

삼성 SW 역량테스트 문제입니다. 문제 풀이 방법은 아래와 같습니다.

  • R 연산은 단순 구현으로 해결할 수 있습니다.
  • C 연산은 배열을 이용하여 구현하려면 복잡할 수 있습니다. 2차원 배열 Transpose → R 연산 → Transpose 하여 손쉽게 해결합니다.
  • 저와 풀이 방법이 비슷한데 소스코드가 깔끔한 코드가 있습니다. 참고하시면 좋을 것 같습니다. BIU Tistory 문제 해결 방법

유의사항은 아래와 같습니다.

  • Flag 비트를 사용하지 않으려고 하다가, 출력이 2번 되는(겹치는) 경우가 있었습니다. Flag 비트를 적당히 잘 사용하자는 생각을 했습니다.
  • 동일한 변수명을 사용하게 되면서 정상적으로 정답이 출력되지 않는 경우 발생. 반복문의 r,c와 입력 변수 R, C 를 다르게 사용해야되는데 둘 다 r, c 로 쓰면서 문제가 발생. index 변수명은 항상 다른 것을 사용해주는 것이 좋겠습니다.
R, C, K = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(3)]
# 한 행에 대하여 정렬 수행
def arrange(arr):
    answer = []
    dic = {}
    for x in arr:
        if x != 0:
            dic[x] = (dic[x] + 1 if dic.get(x, 0) else 1)
    arr_arr = []
    for key in dic:
        arr_arr.append((dic[key], key))
    arr_arr.sort()
    for x in arr_arr:
        answer.extend([x[1], x[0]])
    return answer

time = 0
# 해당 인덱스에 정답이 되는지 확인
if R <= len(A) and C <= len(A[0]) and A[R - 1][C - 1] == K:
    print(time)
else:
    is_get_answer = False
    while time < 100:
        time += 1
        R_NUM = len(A)
        C_NUM = len(A[0])

        # C 연산이 필요하면 배열 회전(Transpose)
        if R_NUM < C_NUM:
            sub_A = []
            for c in range(len(A[0])):
                sub_A.append([A[r][c] for r in range(len(A))])
        else:
            sub_A = A

        # R 연산
        for r_idx, row in enumerate(sub_A):
            sub_A[r_idx] = arrange(row)
        ## 가장 큰 것 찾고, 길이 늘린 뒤에 다 0으로 채우기
        new_len = max([len(row) for row in sub_A])
        for r_idx, row in enumerate(sub_A):
            row.extend([0]* (new_len - len(row)))
            sub_A[r_idx] = row[:100]

        # 다시 회전(Transpose)
        if R_NUM < C_NUM:
            A = []
            for c in range(len(sub_A[0])):
                A.append([sub_A[r][c] for r in range(len(sub_A))])
        else:
            A = sub_A
            
        # 해당 인덱스에 정답이 되는지 확인
        if R <= len(A) and C <= len(A[0]) and (A[R - 1][C - 1] == K):
            print(time)
            is_get_answer = True
            break

    if is_get_answer == False:
        print(-1)