Algorithm/SWEA

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

DongKeun2 2022. 2. 18. 14:44

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV18LoAqItcCFAZN&categoryId=AV18LoAqItcCFAZN&categoryType=CODE&problemTitle=1258&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

문제를 잘 읽고 완전히 이해한 뒤 코드를 작성해야 한다는 교훈을 느꼈습니다.
끝없는 디버깅의 늪...

 

🔥 작성 코드 (🌪️61,956kb 172ms)

T = int(input())

for test_case in range(1, T+1):
    n = int(input())
    arr = [list(map(int, input().split())) for _ in range(n)]

    lst = []
    for i in range(n):
        cnt = 0
        for j in range(n):
            if arr[i][j] != 0:
                cnt += 1
                if (j+1) == n:
                    lst.append(cnt)
            else:
                if cnt != 0:
                    lst.append(cnt)
                    cnt = 0

    result = []
    for i in range(1, n+1):
        cnt = 0
        for j in range(len(lst)):
            if lst[j] == i:
                cnt += 1
        if cnt != 0:
            result.append([cnt, i])
    cnt = len(result)

    sol = []
    for i in range(len(result)-1):
        idx = i
        for j in range(i, len(result)):
            if result[idx][0]*result[idx][1] > result[j][0]*result[j][1]:
                idx = j
            elif result[idx][0]*result[idx][1] == result[j][0]*result[j][1]:
                if result[idx][0] > result[j][0]:
                    idx = j
        if idx != i:
            result[i], result[idx] = result[idx], result[i]               
        sol.append(result[i][0])
        sol.append(result[i][1])

    sol.append(result[-1][0])
    sol.append(result[-1][1])
    print(f'#{test_case} {cnt}', *sol)

 

⭕ 접근법

  1. 행과 열의 수가 겹치지 않는다는 점을 이용해 행, 열 중 하나만 선택해서 읽도록 했습니다.
  2. 행마다 수를 읽어가며 0이 아닐면서 연속되는 수의 개수를 꺼내왔습니다.
    •  다른 상자에서 같은 수가 나오지 않기 때문에 꺼내온 수는 해당 상자의 열의 길이가 됩니다.
    •  마찬가지로 꺼내온 수의 중복값이 행의 길이가 됩니다.
    •  수가 끝나는 부분(0을 만나거나 범위밖으로 나갈 때) 값을 저장했습니다.
  3.  저장한 값을 행과 열로 나누어주었습니다. (result에 저장)
  4.  result에 저장된 행과 열의 값들을 순서대로 정리하기 위해서 비교하였습니다.
    • 행과 열의 곱을 비교하고 작은 것부터 앞으로
    • 행과 열의 곱이 같다면 행의 값이 작은 것부터 앞으로
  5. 비교하면서 바뀌어 들어온 값들을 sol에 저장해주었습니다.
    • 마지막은 비교하지 않았으므로 따로 저장해줍니다.

 

 

처음에는 범위가 끝나는 부분에서 cnt를 세고 있다는 것을 고려하지 못해서 fail...

다음엔 비교하지 않은 마지막 행,열 값을 정답에 포함하지 않아서 fail..

문제와 코드를 확실히 확인하는 습관을 들여야겠네요.