[Programmers/Lv. 0] 코딩테스트 입문 Day 10 - 조건문, 배열, 수학, 시뮬레이션 (Python)

2023. 4. 30. 14:01Algorithm

1. 점의 위치 구하기


x와 y를 순서대로 담은 배열 dot가 주어질 때, 해당 좌표가 몇 사분면에 속하는지 구하라는 문제이다.

 

(내가 생각한 풀이 과정)

굳이 어렵게 생각할 필요 없이 배열의 인덱싱 [0]은 x점의 위치, [1]은 y점의 위치라고 생각하고 조건을 나눠주었다.
if와 elif, else문을 이용해서 총 4가지 사분면의 조건을 설정하면 된다.

 

(코드)

더보기

💡 내 코드

def solution(dot):
    if dot[0] > 0 and dot[1] > 0:
        return 1
    elif dot[0] < 0 and dot[1] > 0:
        return 2
    elif dot[0] < 0 and dot[1] < 0:
        return 3
    elif dot[0] > 0 and dot[1] < 0:
        return 4

 

💡 다른 사람의 풀이 코드

조건을 나눠줄 필요없이 true, false에 따라 인덱싱 값이 달라지는 quad 배열을 미리 설정해 주는 방법도 있다.

def solution(dot):
    quad = [(3,2),(4,1)]
    return quad[dot[0] > 0][dot[1] > 0]

 


2. 2차원으로 만들기


배열과 정수가 주어질 때, 주어진 정수에 따라 주어진 배열을 2차원 배열로 변경하라는 문제이다.
2차원 배열로 변경할 때는, 주어진 정수의 수만큼 배열을 묶어주는 방식을 이용하면 된다.

 

(내가 생각한 풀이 과정)

주어진 배열을 순서대로 반복하면서 배열의 길이가 주어진 정수 n이 될 때까지 배열을 계속 추가한다.
만약, 길이가 주어진 정수 n만큼이 될 경우에는 큰 배열에다가 해당 배열을 추가하고, 다시 배열을 추가해 주면 된다.
최종 반환할 때는 모든 배열들이 추가된 큰 배열을 반환한다.

큰 배열은 out_list, 계속 요소가 추가되는 배열은 in_list라고 이름을 정해준다.

 

(코드)

더보기

💡 내 코드

def solution(num_list, n):
    out_list, in_list = [], []
    for i in range(len(num_list)):
        in_list.append(num_list[i])
        if len(in_list) == n:
            out_list.append(in_list)
            in_list = []
        
    return out_list

 

💡 다른 사람의 풀이 코드

내가 풀이한 것처럼 배열을 두개 설정하기보다는 for문의 3번째 step 인수와 배열의 슬라이싱 기능을 이용하면 간단하게 해결할 수 있었다.

def solution(num_list, n):
    answer = []
    for i in range(0, len(num_list), n):
        answer.append(num_list[i:i+n])
    return answer

 


3. 공 던지기


정수 배열과 정수 k가 주어질 때, 공을 1번부터 던지고 오른쪽으로 한 명을 건너뛰고 던진다고 하자.
이때, k번째로 공을 던지는 사람의 번호가 몇 번인지 구하라는 문제이다.

 

(내가 생각한 풀이 과정)

한 명을 건너뛰기 때문에 2를 곱해주고, k번째로 공을 던지는 사람의 번호가 필요하니 나는 k-1을 곱해줄 거다.
(1번째로 공을 던지는 사람은 인덱스 0(2*0), 2번째로 공을 던지는 사람은 2(2*1), 3번째로 공을 던지는 사람은 4(2*2))

단, 길이에 따라서 반복되는 수가 다르기 때문에 배열의 길이를 나눈 나머지값을 반환하면 된다.

 

(코드)

더보기

💡 내 코드

def solution(numbers, k):
    return numbers[2 * (k - 1) % len(numbers)]

 


4. 배열 회전시키기


정수 배열 numbers와 문자열 direction이 주어질 때, 배열의 원소를 문자열 direction 방향으로 한 칸씩 회전시킨 배열을 반환하라는 문제이다.
이때, direction 방향은 "left"와 "right" 둘 중 하나로 나뉘게 된다.

 

(내가 생각한 풀이 과정)

left, right 방향에 따라 배열의 요소를 추가하고 빼주기를 다르게 설정해 주면 된다.

left일 경우, 가장 마지막 부분에 첫 번째 요소를 넣고 첫 요소를 지운다.
right일 경우, 가장 첫 부분에 마지막 요소를 넣고 마지막 요소를 지운다.

 

(코드)

더보기

💡 내 코드

def solution(numbers, direction):
    if direction == "left":
        numbers.insert(len(numbers), numbers[0])
        del numbers[0]
    else:
        numbers.insert(0, numbers[-1])
        del numbers[-1]       
    return numbers

 

💡 다른 사람의 풀이 코드

추가하고 지우는 과정 없이, 배열의 인덱싱과 슬라이싱만을 이용해서 답을 구할 수도 있는 문제이다.

def solution(numbers, direction):
    return [numbers[-1]] + numbers[:-1] if direction == 'right' else numbers[1:] + [numbers[0]]