< 문제 >

< 정답 >

 

 

 

< 설명 >

- 문제를 이해했다면( 처음에 잘못 이해하였음 ), 쉬운 문제였다.

: 문제에서 제시된 i부터 j번째까지 슬라이싱하려면 [ i -1 : j ] 가 되어야하고, k번째 숫자는 k - 1이 된다. 

1) commands의 길이는 입력값마다 다르므로, len(commands)를 최대값으로 하는 반복문을 실행.

2) array에서 순차적으로 2차원 배열 commands의 값으로 슬라이싱.

3) 슬라이싱된 배열을 정렬

4) k-1 번째에 해당하는 값을 배열에 저장

5) 반복문이 끝나면 각 k번째 수에 해당하는 값이 든 배열 answer를 return.

 

 

< 배운 것 >

- 2차원 배열의 인덱스에 접근할 수 있다.

- 변수의 이름이 길어지는 등, 어떤 값이 가리키는 것을 파악하기 어려울 때, 조목조목 따져서 알 수 있다.

 

- array.sort()sorted(array)의 차이를 안다.

1) array.sort()는 해당 배열 자체를 정렬(변경)하고, sorted(array)는 해당 배열에 영향을 주지 않고 다른 변수에 값을 할당하거나 바로 출력할 때 사용할 수 있다.

2) sort(), sorted()와 reverse=True의 조합

: array.sort(reverse=True)  / sorted(array, reverse=True)

- reverse()와 reversed()

: sort() , sorted() 와 같은 맥락으로 사용 가능하며, 현재 배열에서 역순으로 바꾸는 것이지, DESC 정렬이 아니다.

'Algorithm > 정렬' 카테고리의 다른 글

버블정렬 ( 파이썬, 코틀린 )  (0) 2021.05.01

< 문제 > 

 

 

 

< 정답 >

 

< 내가 접근한 방식 >

 

- 이 문제를 이해한 뒤, 학생들은 3개의 상태가 있다고 생각했다.

  1) "체육복은 도난 당해서 빌려야만 수업에 참가할 수 있는 학생"

  2) "여벌의 체육복이 있었으나, 도난 당했고 빌려줄 수 없지만 자신은 수업에 참가할 수 있는 학생"

  3) "자신의 체육복이 있고, 여벌의 체육복이 있어서 빌려줄 수 있는 학생"

 

 

- 전체 학생을 담은 리스트로 시작해서 수업에 참여할 수 없는 학생을 걸러내는 방식. 

 

< 설명 >

- 저는 3가지 상태가 있다고 생각했지만, 제가 참조한 다른 분의 풀이에서는 두 가지 상태로 나누어도 충분했습니다.

set 함수를 통해 reserve와 lost의 차집합(setReserve / setLost )를 구했는데, 이는 setReserve의 값보다 1작거나 큰 요소를 제거하는 것( = 결과적으로 빌릴 수 없는 학생의 집합을 구하는 것)을 위해서였습니다.

이 방법을 통해서

제가 접근한 방식의 2번에 해당하는 학생을 따로 어렵게 구분할 필요가 없어졌습니다.

 

 

< 배운 것 >

- 경우의 수에서 참인 값을 계속 얻어나가는 방식과 참 또는 거짓인 값에서 반대의 값을 빼나가는 방식이 있다.

- 경우의 수를 구할 때, 어떤 경우들 간의 구분이 실제 결과값을 도출하는데 있어서 구분할 필요가 있는지 생각해볼 필요가 있다. ( 경우가 다른 것과 결과값을 도출하는데 있어서 경우를 나누는 것은 다르다. )

< 문제 >

 

< 정답 코드 >

 

< 설명 >

- 정답 answers의 값과 수포자의 정답 list1,2,3을 비교할 것이다.

- 비교 후 맞춘 정답을 카운트하기 위해서 count1,2,3 변수와 이 변수를 임시로 담을 answer_temp를 만든다.

- answers 가 기준이 되도록 answers의 길이만큼 수행하는 반복문

- list1,2,3 그리고 answers는 길이가 다른데, list1,2,3은 반복되므로, lastIndex에 도달했을 때, 0으로 돌아가게 하려면

  증가값 i를 각 수포자 정답 리스트의 길이로 나눠주면 가능하다.

- answer_temp에는 3명의 수포자가 맡힌 정답 갯수가 순서대로 들어있다.

- answer_temp의 index는 0~2이고, 문제에서 요구하는 정답은 1, 2, 3 중에서 답변해야하므로 person Index에 + 1을 

  해준 값이 문제에서 요구하는 n번 수포자를 가리키는 값이 된다.

 

< 배운 것 >

1) 길이가 다른 배열들이 있을 때 길이가 더 짧은 배열의인덱스 전체를 반복하면서 비교하는 로직을 짤 수 있다.

- 길이가 더 긴 배열의 길이를 반복문의 조건부로 한다.

- 길이가 더 짧은 배열과 비교할 때, 배열의 인덱스는 증감값 i를 짧은 배열의 길이(len)로 나눈 몫이다.

 

2) for a, b in enumerate(array):  형태에서 a는 인덱스, b는 a 인덱스에 해당하는 값인 걸 안다.

 

 

< 문제 내용 >

 

 

 

< 코드 >

 

< 설명 >

1) maxLength

: answer가 가질 수 있는 최대값

2) spicieCount

: 중복된 종들을 중복이 없는 set함수로 분류

 

3) spicieCount가 maxLength보다 큰 경우( 데려갈 수 있는 폰켓몬 종의 수를 초과했다 ),   데려갈 수 있는 최대치인 maxLength가 정답이 된다.

 

4) spicieCount가 maxLength보다 작은 경우( 데려갈 수 있는 폰켓몬 종의 수가 적다 ),   있는 종을 다 데려간다. ( answer = spicieCount )

  

 

< 추가 설명 >

 

- set 함수의 특징

1) 중복을 허용하지 않는다.

2) 순서가 없다(unorderd).

3) 집합 자료형 set에 저장된 값을 인덱싱으로 접근하려면 리스트나 튜플로 변환해야한다.

 

 

< 배운 것 >

- set함수를 통해 얻은 중복을 제거한 값이 갖는 의미를 안다.

 

 

 

0에서 시작하는 변수 answer가 주어진 배열 absolutes만큼의 길이를 반복해서 배열 signs와 absolutes의 모든 인덱스를 거치는데, signs[i]가 참이면 값을 더하고, 거짓이면 값을 빼준다.  

 

< 배운 것 >

- 파이썬의 증감 연산을 할 수 있다. ( x += n )

- 최대값/최소값 구하기 : 변수에 배열의 값 하나를 할당해서 배열 전체 요소에 비교시킨다.

 

1) 파이썬

arr = [1,3,5,4,2,8,6,9,7]

min = arr[8]
for i in range(0, len(arr)-1):
    if min > arr[i] :   # 부호만 바꾸면 최대값을 구할 수 있다.
        min = arr[i]
    print(min)

 

 

2) 코틀린

val arr: Array<Int> = arrayOf(1,3,5,4,2,8,6,9,7)
    
    var min = arr[0]
    for( i in 0 until arr.lastIndex){
        if(min > arr[i]){   // 부호만 바꾸면 최대값이 구해진다.
            min = arr[i]
        }
        println(min)
    }

 

- 오름차순 정렬 ( 뒤로 갈수록 커지는 - ASC )

 

1) 파이썬

arr = [1,3,5,4,2]
for i in range(len(arr) - 1, 0, -1):
    for j in range(i):
        if arr[j] > arr[j + 1]:       # 부호만 바꿔주면 내림차순
            arr[j], arr[j + 1] = arr[j + 1], arr[j]
print(arr)

 

 

2) 코틀린

val arr: Array<Int> = arrayOf(1,3,5,4,2)

        val maxDepth = arr.size - 1
        for(i in maxDepth downTo 1){
            for(j in 0 until i){
                if(arr[j] > arr[j+1]){
                    arr[j] = arr[j + 1].also{arr[j + 1] = arr[j]}
                }
            }
        }
    arr.forEach { print(it) }

 

< 배운 것 >

- 코틀린에서 .also{}를 통해 temp 변수에 저장하지 않고 바로 두 값을 스왑할 수 있다.

- 코틀린 반복문에서 "n .. x" , "n .. downTo x", "n until x"의 인덱스 차이를 숙지했다.

 

* sequence 자료형(리스트, 튜플, 문자열)을 슬라이싱 하는 경우

 

- start, end, step은 양수/0/음수가 들어갈 수 있다.

- start: 슬라이싱을 시작할 위치

- end: 슬라이싱을 끝낼 위치

- step: 실행되는 보폭( defalut = +1 )

 

 

 

 

* start와 end의 위치에 대한 이해를 돕기 위한 그림

 

 

1) 양수를 넣는 경우

예)

# 띄어쓰기(공백)은 문자열 1칸으로 인식된다.

print('hello world'[6:11])
>>>world

 

 

 

2) 음수를 넣는 경우

 

※ step이 양수인 경우에는 위 그림과 같지만, step이 음수여서 인덱스의 뒤부터 긁어올 때에는 다르다.

   아래 예제를 참조.

 

print('hello world'[-1: 11])   # step값은 1인 상태
>>>d

print('hello world'[11:-6:-1]) # step값은 -1인 상태
>>>dlrow


# [11:-6:-1]에서 world는 5개의 문자이기 때문에 end값이 -5라고 생각할 수 있지만,
# step이 음수이면, 'hello world' 인덱스의 가장 끝 위치인 [11]의 위치가 -1 이라고 생각(암기)해야 편하다.

 

 

 

 

'Programming languages > Python' 카테고리의 다른 글

for문과 if문 한 번에 ( list comprehension )  (0) 2021.05.06
시퀀스(Sequence) 자료형  (0) 2021.04.17

+ Recent posts