본문 바로가기
coding test

[코테준비] #1. 행렬 / 배열

by 소소한해결사 2024. 7. 23.

 

 

오늘의 학습 키워드 

행렬 / 배열 

 

 

공부한 내용 

 

📌 코딩 테스트 문제 ? 

코딩테스트 연습 - n^2 배열 자르기 

 

 

📌 문제 풀이 프로세스 

 

[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