❗오늘의 학습 키워드
행렬 / 배열
❗ 공부한 내용
📌 코딩 테스트 문제 ?
📌 문제 풀이 프로세스
[1] 문제 이해
해당 문제는 글을 처음 읽었을 때,
무슨 말인지 잘 이해가 되지 않았다...
하지만, 감사하게도 밑에 gif 이미지로
상세하게 설명이 되어 있어서
쉽게 이해할 수 있었다.
[2] 직관적 문제 접근
난 기본적으로 단순한 인간이라...
직관적으로 3단계를 나열했다.
(1) n 만큼의 행렬을 만들자.
(2) n행 n열로 짜여진 매트릭스에
이런 식으로 숫자를 넣어보자.
(3) 매트릭스를 배열로 전환해서 left ~ right 만큼 슬라이싱을 하자.
[3] (직관적) 문제 풀이
import numpy as np
def solution(n, left, right):
answer=[]
# n 만큼의 행렬을 만들자.
matrix = np.zeros((n,n))
# n행 n열로 짜여진 매트릭스에 숫자를 넣어보자.
for i in range(n):
for j in range(n):
matrix[i,j]=max(i+1, j+1)
# 매트릭스를 배열로 전환해서
for i in range(n):
for j in range(n):
answer.append(matrix[i,j])
# left ~ right만큼 슬라이싱을 하자.
answer=answer[left:right+1]
return answer
결과는 ... ?
예상했던대로 '런타임 에러'가 많이 떴다.
이제 코드를 줄이려고 한다.
[4] 생각의 전환 - 거꾸로 ?
[첫 번째 알고리즘]
(1) n 만큼의 행렬을 만들자.
(2) n행 n열로 짜여진 매트릭스에
이런 식으로 숫자를 넣어보자.
(3) 매트릭스를 배열로 전환해서 left ~ right 만큼 슬라이싱을 하자.
(3) 방법인 슬라이싱을 먼저 한다면
for문을 줄일 수 있지 않을까 ?
그렇다면, 매트릭스를 굳이 만들지 않아도 될 것 같다..!
그렇다면 이중for문이 아니라
하나의 for문으로 문제를 해결 할 수 있을 것 같은 느낌이 들었다.
시간 복잡도가 On^2 에서
On으로 줄이는 게 가장 핵심일 듯 하다!
[두 번째 알고리즘]
(1) left ~ right+1 만큼의 배열을 만들자.
(2) 배열을 만들면서 해당 위치에 들어가야 할 숫자를 넣어보자.
두 번째 알고리즘은 2단계밖에 안됐다.
하지만, 그만큼 특정 단계에서 생각해야할 요소가 많다.
(1)은 단순히 for문의 범위를 left ~ right +1 을 하면 그만이다.
for i in range(left, right + 1):
(2) 는 생각을 많이 해야된다.
어떻게 해야 이런 규칙이 나왔는지 말이다.
첫 번째 알고리즘에서는 행과 열 중에서 가장 큰 값을
매트릭스에다가 넣었으니,
이제는 행과 열을 구하는 코드를 먼저 작성해야한다.
그래야 둘 중 큰 값을 배열에 넣을 수 있으니 말이다.
그림 그리면서 더해보고 나눠보고
이것저것 해보고 나니
생각보다 쉽게 행과 열을 구할 수 있었다.
n 은 전체 행과 열의 길이를 뜻하기 때문에
계산에 꼭 필요한 존재이다.
또한 left ~ right+1 에서 차례대로 돌고 있는
i 또한 계산에 꼭 필요한 존재일 것이다.
지금 어디에 위치해있는지 아는 것은 i 니깐..
결국 i 나누기 n을 했을 때 몫은 행을 나타내고
i 나누기 n의 나머지는 열을 나타낸다는 것을 알았다.
def solution(n, left, right):
answer=[]
for i in range(left, right + 1):
row = i // n
column = i % n
answer.append(max(row+ 1, column + 1))
return answer
이렇게 엄청 코드가 짧아졌다.
결과는 ...
통과다~
문제 풀이에 걸린 시간은 33분이다.
[5] 회고
코테에서 가장 어려운 부분은
생각의 전환이다.
생각의 전환 중 가장 단순한 방법은
'거꾸로 생각하기' 여서
그렇게 많이 접근 하려고 한다.
학창시절 공부를 잘 못했던 터라
행렬이 나에게 무섭게 다가왔다.
그래도 33분 이라는 시간 동안
고민하고 끄적이다 보니, 조금은 친해진 것 같다.
이번 스터디를 통해 새롭게 알게 된 것은
행과 열의 위치를 단순히 구하려면
전체 행과 열의 길이를안다면
나눠서 몫과 나머지로 알 수 있다는 것 ? 🤣
누군가에겐 쉬운 접근이었을테지만
나에게는 조금 버거웠다 ..
그래도 이렇게 끄적이며서 알게된 풀이 코드를
쌓다 보면 유사 문제에
쉽게 대처할 수 있을거라 생각한다.
풀이 시간 : 00:33:??
'coding test' 카테고리의 다른 글
[코테준비] #4. 문자열 (0) | 2024.07.26 |
---|---|
[코테준비] #3. 문자열 (0) | 2024.07.25 |
[코테준비] #2. 행렬 (4) | 2024.07.24 |