삼성 SW 역량 테스트 기출 문제
[Python] 백준 17140번 : 이차원 배열과 연산
Algomalgo
2024. 3. 9. 15:02
728x90
<접근 방법>
- 행과 열의 길이에 따라 R연산과 C연산이 정해지므로 현재 배열의 행과 열의 길이를 계속 알고 있어야 한다.
또한, 연산에 따른 배열의 최대 길이에 따라 0을 붙여줘야하므로 최대길이를 연산마다 구해야 한다. - 각 행마다 수와 수의 등장 횟수를 구하기 위해 info라는 딕셔너리에 "key=수, key값=등장횟수"를 저장한다.
이때 수가 0이라면 info라는 딕셔너리에 넣지 않도록 주의한다. - 수의 등장 횟수가 커지는 순으로, 수가 커지는 순으로 정렬을 한다.
- 최대 길이에 맞춰 각 행 끝에 0을 붙여준다.
- row와 column의 수를 재정의해주고, 바뀐 배열을 갱신해준다.
- C연산의 경우, 위의 과정을 반복하기 전에 배열을 R연산의 배열 형태로 바꿔주고 연산을 진행한다.
- 조건에 맞을 경우 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연산의 대부분의 과정이 같으므로, 하나의 함수로 묶어서 정리하는 것이 가능하다.
이해가 되지 않는 부분이 있으면 질문 주세요. 감사합니다.
728x90