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)