본문 바로가기
개발공부/[코딩테스트_SWEA]

[SWEA 1258][Python][S/W 문제해결 응용] 7일차 - 행렬찾기

by 왜지? 2023. 1. 1.
반응형

코드

## SWEA 1258
T = int(input())
for test_case in range(1, T+1):
    N = int(input())
    arry = [list(map(int,input().split())) for _ in range(N)]
    mat_dict = {} ## 문제에서 r,c에 중복이 없다고 했으므로, dict의 key로 활용 가능.
    result_arry = []

    for i in range(N):
        cnt = 0
        for j in range(N) :
            if arry[i][j] > 0 :
                cnt += 1
            elif arry[i][j] == 0 and cnt > 0 :
                ## dict key : col , dict value : row
                mat_dict[cnt] = mat_dict.get(cnt,0)+1
                cnt = 0
        if cnt > 0 :
            ## arry[i][j]>0 and j = N-1 이라 for 문이 종료되었을 때 
            mat_dict[cnt] = mat_dict.get(cnt, 0) + 1

    for c,r in mat_dict.items() :
        result_arry.append((c*r,r,c))
    result_arry.sort()

    print(f"#{test_case} {len(result_arry)}",end=' ')
    for rc,r,c in result_arry:
        print(f"{r} {c}",end=' ')
    print()

 

풀이

처음에는 2d arry를 모두 탐색하면서 사각형을 발견하면 col,row를 list에 저장하려고 접근했었다. 

그렌데 위 방법으로 접근하니 for과 if가 너무 많아져서 너무 복잡한 코드가 만들어 졌다.. 

그래서 좀 더 간단히 풀 방법은 없을 지 찾아보다가 문제에서 row와 col에 중복이 없다고 한 부분을 이용했다. 

중복이 없으니 row와 col을  dictionary의 ket로 쓸 수 있었고, 굳이 if문을 많이써서 조건을 찾지 않아도 됐다. 

arry[i][j]>0 일때 cnt를 증가시키고 0이 발견되면 cnt를 dict에 업데이트 했다. 

dict의 key는 column, value는 row이다. 

 

 

반응형

댓글