https://www.acmicpc.net/problem/17140
해당 문제는 조건에 따라 각 행 또는 열에 연산을 반복하면서 주어진 위치에 지정한 값이 있는지 확인하는 문제입니다.
저는 이 문제를 풀 때 각 행과 열의 최대 길이가 100이 된다는 것에 집중했습니다.
처음부터 100 X 100 크기의 배열을 이용해서 작업을 했습니다.(행과 열의 길이를 맞추는 작업을 간단히 하기 위해 위와 같이 했지만 이것 때문에 속도가 느려진 게 아닌가 생각이 듭니다.)
이 문제에 대한 제 접근법은 아래와 같습니다.
접근법
1. 처음 입력되는 r, c를 각각 -1 해서 저장(목표 지점이 되는 행과 열의 위치를 인덱스 번호와 일치시키기 위해 수행했습니다.)
2. 입력 값을 100 X 100 크기의 배열에 저장
3. 조건에 따라 행과 열에 대해 연산 수행
3.1 만약 행의 수 >= 열의 수 라면 R연산 수행
3.2 만약 행의 수 < 열의 수 라면 C연산 수행
3.3 각 행(또는 열)에 연산이 수행된 후 길이를 100으로 맞추기
4. 연산 수행 후 목표 위치에 주어진 값이 있는 지 확인
전체 코드는 아래와 같습니다.
전체 코드
import sys
from collections import Counter
r, c, k = map(int, sys.stdin.readline().strip().split())
r, c = r-1, c-1
mat = [ list(map(int, sys.stdin.readline().strip().split()))+[0]*97 for _ in range(3) ]
mat = mat + [[0]*100 for _ in range(97)]
maxR = 3
maxC = 3
answer = -1
time = 0
if mat[r][c] == k:
answer = 0
time = 101
while time < 100:
time += 1
if maxR >= maxC:
# R연산 수행
tempMaxC = 0
for row in range(maxR):
temp = [e for arr in sorted(Counter(mat[row]).items(), key=lambda x: (x[1], x[0])) for e in arr if arr[0] != 0]
if tempMaxC < len(temp):
tempMaxC = len(temp)
if len(temp) < 100:
temp += [0] * (100 - len(temp))
else:
temp = temp[:100]
mat[row] = temp
maxC = tempMaxC
else:
# C연산 수행
tempMaxR = 0
for col in range(maxC):
temp = [e for arr in sorted(Counter([mat[row][col] for row in range(maxR)]).items(), key=lambda x: (x[1], x[0])) for e in arr if arr[0] != 0]
if tempMaxR < len(temp):
tempMaxR = len(temp)
if len(temp) < 100:
temp += [0] * (100 - len(temp))
else:
temp = temp[:100]
for row in range(len(temp)):
mat[row][col] = temp[row]
maxR = tempMaxR
# 목표 위치에 숫자를 확인하기
if mat[r][c] == k:
answer = time
break
print(answer)
'PS > Python' 카테고리의 다른 글
[백준] 14499 - 주사위 굴리기(파이썬, Python) (0) | 2021.05.30 |
---|---|
[백준] 17144 - 미세먼지 안녕!(파이썬, Python) (0) | 2021.05.30 |
[백준] 14502 - 연구소(파이썬, Python) (0) | 2021.05.19 |
[백준] 3190 - 뱀(파이썬, Python) (0) | 2021.05.03 |
[백준] 16236 - 아기 상어(파이썬, Python) (0) | 2021.05.01 |