삼성 SW 역량 테스트 기출 문제

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

Algomalgo 2024. 3. 9. 15:02
728x90


<접근 방법>

  1. 행과 열의 길이에 따라 R연산과 C연산이 정해지므로 현재 배열의 행과 열의 길이를 계속 알고 있어야 한다.
    또한, 연산에 따른 배열의 최대 길이에 따라 0을 붙여줘야하므로 최대길이를 연산마다 구해야 한다.
  2. 각 행마다 수와 수의 등장 횟수를 구하기 위해 info라는 딕셔너리에 "key=수, key값=등장횟수"를 저장한다.
    이때 수가 0이라면 info라는 딕셔너리에 넣지 않도록 주의한다.
  3. 수의 등장 횟수가 커지는 순으로, 수가 커지는 순으로 정렬을 한다.
  4. 최대 길이에 맞춰 각 행 끝에 0을 붙여준다.
  5. row와 column의 수를 재정의해주고, 바뀐 배열을 갱신해준다.
  6. C연산의 경우, 위의 과정을 반복하기 전에 배열을 R연산의 배열 형태로 바꿔주고 연산을 진행한다.
  7. 조건에 맞을 경우 break를 해주는데 이때 조건에 유의해야한다.
    현재 배열의 행과 열의 길이가 r, c보다 작을 경우 오류를 유발하므로 주의한다.
r, c, k = map(int, input().split())
array_A = [list(map(int, input().split())) for _ in range(3)]

row, column = 3, 3
answer = -1
while True:
    answer += 1
    if answer > 100:	# 연산의 횟수가 100이 넘어가면 답을 -1로 바꿔주고 break
        answer = -1
        break
    if row>=r and column>=c and array_A[r-1][c-1] == k:	# 정답 조건에 맞으면 break
        break

    if row >= column:   # R 연산
        temp = []	# 새로 만들 배열
        max_length = 0
        for i in range(row):
            info = dict()
            for j in range(column):
                if array_A[i][j] in info:
                    info[array_A[i][j]] += 1
                elif array_A[i][j] != 0:	# 수가 0일 때에는 연산에서 제외
                    info[array_A[i][j]] = 1
            ttemp = []
            for key in info:
                ttemp.append([key, info[key]])
            ttemp.sort(key=lambda x: (x[1], x[0]))	# 수 등장 횟수, 수 정렬
            max_length = max(max_length, 2*len(ttemp))	# 최대 길이 갱신
            tmp = []
            for a, b in ttemp:	# 하나의 행으로 만들기
                tmp.append(a)
                tmp.append(b)
            temp.append(tmp)
        for tmp in temp:
            if len(tmp) < max_length:	# 최대 길이보다 짧은 행일 시, 0 추가
                for _ in range(max_length- len(tmp)):
                    tmp.append(0)
        row, column = len(temp), max_length		# 현재 배열의 row, column 갱신
        array_A = temp	# 배열 갱신

    else: # C 연산
    	# R 배열 형태로 바꿔주기(연산 편하게 하기 위함)
        t_arr = [[0]*row for _ in range(column)]
        for i in range(row):
            for j in range(column):
                t_arr[j][i] = array_A[i][j]
        row, column = column, row

        temp = []	# 새로 만들 배열
        max_length = 0
        for i in range(row):
            info = dict()
            for j in range(column):
                if t_arr[i][j] in info:
                    info[t_arr[i][j]] += 1
                elif t_arr[i][j] != 0:	# 수가 0일 때 연산에서 제외
                    info[t_arr[i][j]] = 1
            ttemp = []
            for key in info:
                ttemp.append([key, info[key]])
            ttemp.sort(key=lambda x: (x[1], x[0]))	# 수 등장 횟수, 수 정렬
            max_length = max(max_length, 2 * len(ttemp))	# 최대 길이 갱신
            tmp = []
            for a, b in ttemp:	# 하나의 행으로 만들기
                tmp.append(a)
                tmp.append(b)
            temp.append(tmp)
        for tmp in temp:
            if len(tmp) < max_length:	# 최대 길이보다 짧은 행일 시, 0 추가
                for _ in range(max_length - len(tmp)):
                    tmp.append(0)
        row, column = len(temp), max_length	# 현재 배열의 row, column 갱신
        t_arr = [[0] * row for _ in range(column)]
        for i in range(row):
            for j in range(column):
                t_arr[j][i] = temp[i][j]
        row, column = column, row	# 현재 배열의 row, column 갱신
        array_A = t_arr	# 배열 갱신

print(answer)

물론 R연산과 C연산의 대부분의 과정이 같으므로, 하나의 함수로 묶어서 정리하는 것이 가능하다.

예제6의 결과 도출 과정

이해가 되지 않는 부분이 있으면 질문 주세요. 감사합니다.

728x90