Programmers Code/Level 3_4

[Programmers] level4 - 행렬과 연산 (Python) : 2022 카카오 테크 인턴십

NIMHO 2022. 11. 17. 12:46
728x90

▶행렬과 연산 - 2022 카카오 테크 인턴십 (level 4)

문제

2022.08.28 - [Programmers Code/Level 4] - [Programmers] level4 - 행렬과 연산 (Python) : 2022 카카오 테크 인턴십 (75점 / 100점)

 

[Programmers] level4 - 행렬과 연산 (Python) : 2022 카카오 테크 인턴십 (75점 / 100점)

▶행렬과 연산 - 2022 카카오 테크 인턴십 (level 4) ▶문제 [본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.] 당신은 행렬에 적용할 수 있는 두 가지 연산을 만들었습니다. ShiftRow

dhalsdl12.tistory.com

지난번에 이 문제를 풀었는데, 효율성 테스트에서 3개의 testcase가 통과하지 못해서 75점만 받았다.

 

이번에 다시 카카오 해설을 보면서 문제를 이해하고 새롭게 풀어보았다.

https://tech.kakao.com/2022/07/13/2022-coding-test-summer-internship/

 

2022 테크 여름인턴십 코딩테스트 해설

2022년 카카오 여름 인턴십 코딩 테스트가 지난 5월 7일에 5시간에 걸쳐 진행되었습니다. 시간이 부족하여 문제를 풀지 못하는 아쉬움이 없도록 1시간을 늘려 테스트를 진행한 것이 작년과 조금

tech.kakao.com

주어진 행렬을 좌측, 우측, 센터로 나누어서 풀면 편하다고 한다.

그래서 좌측을 first 리스트로, 우측을 last 리스트로, 센터는 center 이중 리스트로 구현했다.

 

아, 이때 모두 일반 list가 아닌 deque로 구현했다.

deque로 구현한 이유는 appendleft와 popleft를 사용해야 하기 때문이다.

 

shiftrow를 해줄때는 first, last, center 모두 pop를 해서 appendleft를 해주면 마지막 행이 가장 위로 올라간다.

728x90

그리고 rotate해줄때는 위 그림으로 구현하면 쉽게 풀릴 것이다.

 

first[0]은 center[0]에 가장 앞에 들어가야 하기 때문에 center[0].appendleft(first.popleft()) 이런 코드가 나온다.

append 혹은 appendleft해주는 모든 부분을 고려해서 코드를 작성해주면 된다.

from collections import deque


def solution(rc, operations):
    answer = []
    row_l = len(rc)
    col_l = len(rc[0])
    
    center = deque(deque(row[1:-1]) for row in rc)
    first, last = deque(), deque()
    for i in range(row_l):
        first.append(rc[i][0])
        last.append(rc[i][col_l - 1])
    
    for oper in operations:
        if oper == 'ShiftRow':
            center.appendleft(center.pop())
            first.appendleft(first.pop())
            last.appendleft(last.pop())
        elif oper == 'Rotate':
            center[0].appendleft(first.popleft())
            last.appendleft(center[0].pop())
            center[row_l - 1].append(last.pop())
            first.append(center[row_l - 1].popleft())
    
    for i in range(row_l):
        cen = center[i]
        cen.appendleft(first[i])
        cen.append(last[i])
        answer.append(list(cen))
              
    return answer

정확성, 효율성 테스트 모두 통과해서 만점이 나온다.

728x90