728x90
▶행렬과 연산 - 2022 카카오 테크 인턴십 (level 4)
▶문제
지난번에 이 문제를 풀었는데, 효율성 테스트에서 3개의 testcase가 통과하지 못해서 75점만 받았다.
이번에 다시 카카오 해설을 보면서 문제를 이해하고 새롭게 풀어보았다.
https://tech.kakao.com/2022/07/13/2022-coding-test-summer-internship/
주어진 행렬을 좌측, 우측, 센터로 나누어서 풀면 편하다고 한다.
그래서 좌측을 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
'Programmers Code > Level 3_4' 카테고리의 다른 글
[Programmers] level3 - 미로 탈출 명령어 (Python) : 2023 KAKAO BLIND RECRUITMENT (2) | 2023.03.01 |
---|---|
[Programmers] level3 - 야근 지수 (Python) : 연습문제 (0) | 2022.11.26 |
[Programmers] level3 - 기둥과 보 설치 (Python) : 2020 KAKAO BLIND RECRUITMENT (6) | 2022.11.13 |
[Programmers] level3 - 징검다리 건너기 (Python) : 2019 카카오 테크 인턴십 (2) | 2022.11.02 |
[Programmers] level3 - 코딩 테스트 공부 (Python) : 2022 카카오 테크 인턴십 (0) | 2022.08.29 |