ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • n^2 배열 자르기
    코딩 테스트/Level 2 2021. 10. 17. 09:06
    반응형

    https://programmers.co.kr/learn/courses/30/lessons/87390

     

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

    정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다. n행 n열 크기의 비어있는 2차원 배열을 만듭니다. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다. 1행 1열부

    programmers.co.kr

     

    가벼운 맘으로... 

    def solution(n, left, right):
        answer = [[j + 1 if j >= i else i + 1 for j in range(n)] for i in range(n)]
        return [each for line in answer for each in line][left:right + 1]

    시간제한이 있는 문제였다... 

    테스트 1 〉	통과 (7.42ms, 17.1MB)
    테스트 2 〉	실패 (시간 초과)
    테스트 3 〉	실패 (시간 초과)
    테스트 4 〉	통과 (0.66ms, 10.5MB)
    테스트 5 〉	통과 (0.56ms, 10.3MB)
    테스트 6 〉	통과 (92.52ms, 53.9MB)
    테스트 7 〉	통과 (105.19ms, 56.5MB)
    테스트 8 〉	통과 (113.81ms, 55.9MB)
    테스트 9 〉	실패 (시간 초과)
    테스트 10 〉	실패 (시간 초과)
    테스트 11 〉	실패 (시간 초과)
    테스트 12 〉	실패 (시간 초과)
    테스트 13 〉	실패 (시간 초과)
    테스트 14 〉	실패 (시간 초과)
    테스트 15 〉	실패 (시간 초과)
    테스트 16 〉	실패 (시간 초과)
    테스트 17 〉	실패 (시간 초과)
    테스트 18 〉	실패 (시간 초과)
    테스트 19 〉	실패 (시간 초과)
    테스트 20 〉	실패 (시간 초과)

     

    for를 줄여볼까?

    def solution(n, left, right):
        answer = [j + 1 if j >= i else i + 1 for j in range(n) for i in range(n)]
        return answer[left:right + 1]

    약간 빨라졌지만... 실패...
    안~ 가벼운 문제였구나.. 

    테스트 1 〉	통과 (5.78ms, 16.9MB)
    테스트 2 〉	실패 (시간 초과)
    테스트 3 〉	실패 (시간 초과)
    테스트 4 〉	통과 (0.43ms, 10.2MB)
    테스트 5 〉	통과 (0.36ms, 10.3MB)
    테스트 6 〉	통과 (70.18ms, 47.1MB)
    테스트 7 〉	통과 (74.13ms, 49MB)
    테스트 8 〉	통과 (80.97ms, 48.4MB)
    테스트 9 〉	실패 (시간 초과)
    테스트 10 〉	실패 (시간 초과)
    테스트 11 〉	실패 (시간 초과)
    테스트 12 〉	실패 (시간 초과)
    테스트 13 〉	실패 (시간 초과)
    테스트 14 〉	실패 (시간 초과)
    테스트 15 〉	실패 (시간 초과)
    테스트 16 〉	실패 (시간 초과)
    테스트 17 〉	실패 (시간 초과)
    테스트 18 〉	실패 (시간 초과)
    테스트 19 〉	실패 (시간 초과)
    테스트 20 〉	실패 (시간 초과)

     

    슬라이스도 쓰지 말까?

    def solution(n, left, right):
        answer = []
        for j in range(n):
            for i in range(n):
                if left <= (i + j * n) <= right:
                    answer.append(j + 1 if j >= i else i + 1)
        return answer

    통과가 늘었지만 실패..
    얄팍한 수로는 해결이 안된다..

    테스트 1 〉	통과 (13.94ms, 17.4MB)
    테스트 2 〉	실패 (시간 초과)
    테스트 3 〉	실패 (시간 초과)
    테스트 4 〉	통과 (0.70ms, 10.2MB)
    테스트 5 〉	통과 (0.67ms, 10.2MB)
    테스트 6 〉	통과 (73.88ms, 21.3MB)
    테스트 7 〉	통과 (90.05ms, 22MB)
    테스트 8 〉	통과 (86.97ms, 19.8MB)
    테스트 9 〉	통과 (7930.64ms, 21.7MB)
    테스트 10 〉	통과 (8433.51ms, 21.6MB)
    테스트 11 〉	통과 (5634.30ms, 21.5MB)
    테스트 12 〉	실패 (시간 초과)
    테스트 13 〉	실패 (시간 초과)
    테스트 14 〉	실패 (시간 초과)
    테스트 15 〉	실패 (시간 초과)
    테스트 16 〉	실패 (시간 초과)
    테스트 17 〉	실패 (시간 초과)
    테스트 18 〉	실패 (시간 초과)
    테스트 19 〉	실패 (시간 초과)
    테스트 20 〉	실패 (시간 초과)

     

    .....

    def solution(n, left, right):
        answer = []
        for num in range(left, right + 1):
            answer.append(max(num % n + 1, num // n + 1))
        return answer
    def solution(n, left, right):
        answer = [max(num % n + 1, num // n + 1) for num in range(left, right + 1)]
        return answer
    solution = lambda n, left, right: [max(num // n, num % n) + 1 for num in range(left, right + 1)]
    테스트 1 〉	통과 (19.75ms, 17.4MB)
    테스트 2 〉	통과 (22.88ms, 22.2MB)
    테스트 3 〉	통과 (32.78ms, 22.5MB)
    테스트 4 〉	통과 (0.04ms, 10.3MB)
    테스트 5 〉	통과 (0.02ms, 10.3MB)
    테스트 6 〉	통과 (21.94ms, 21.3MB)
    테스트 7 〉	통과 (27.69ms, 21.9MB)
    테스트 8 〉	통과 (28.29ms, 19.8MB)
    테스트 9 〉	통과 (21.44ms, 21.7MB)
    테스트 10 〉	통과 (23.00ms, 21.7MB)
    테스트 11 〉	통과 (21.60ms, 21.6MB)
    테스트 12 〉	통과 (30.13ms, 20.5MB)
    테스트 13 〉	통과 (26.95ms, 21.6MB)
    테스트 14 〉	통과 (26.06ms, 21.3MB)
    테스트 15 〉	통과 (26.36ms, 21.1MB)
    테스트 16 〉	통과 (27.72ms, 21.4MB)
    테스트 17 〉	통과 (26.53ms, 21.2MB)
    테스트 18 〉	통과 (28.97ms, 22.3MB)
    테스트 19 〉	통과 (28.41ms, 21.5MB)
    테스트 20 〉	통과 (24.36ms, 20.8MB)

     

    자바

    class Solution {
        public int[] solution(int n, long left, long right) {
            int[] answer = new int[(int) (right - left + 1)];
            for (long i = left; i < right + 1; i++) {
                int pos = (int) (i - left);
                answer[pos] = Math.max((int) (i % n), (int) (i / n)) + 1;
            }
            return answer;
        }
    }



    반응형
Designed by Tistory.