코딩테스트 입문 Day 10 조건문, 배열, 수학, 시뮬레이션


1. 점의 위치 구하기

사분면은 한 평면을 x축과 y축을 기준으로 나눈 네 부분입니다. 사분면은 아래와 같이 1부터 4까지 번호를매깁니다.



  • x 좌표와 y 좌표가 모두 양수이면 제1사분면에 속합니다.
  • x 좌표가 음수, y 좌표가 양수이면 제2사분면에 속합니다.
  • x 좌표와 y 좌표가 모두 음수이면 제3사분면에 속합니다.
  • x 좌표가 양수, y 좌표가 음수이면 제4사분면에 속합니다.

x 좌표 (x, y)를 차례대로 담은 정수 배열 dot이 매개변수로 주어집니다. 좌표 dot이 사분면 중 어디에 속하는지 1, 2, 3, 4 중 하나를 return 하도록 solution 함수를 완성해주세요.

(1) 코드 작성

def solution(dot):
    # 1사분면 : x값 양수 & y값 양수
    if dot[0] > 0 and dot[1] > 0:
        return 1
    # 2사분면 : x값 음수 & y값 양수
    elif dot[0] < 0 and dot[1] > 0:
        return 2
    # 3사분면 : x값 음수 & y값 음수
    elif dot[0] < 0 and dot[1] < 0:
        return 3
    # 4사분면 : x값 양수 & y값 음수
    else:
        return 4

(2) 코드 리뷰 및 회고

  • 문제는 점들의 위치(x, y 고려)가 어느 사분면에 위치하는지를 구하는 것이다.
  • 입력되는 dot의 x(0번 인덱스 값), y(1번 인덱스 값)는 0은 없다.
  • 즉, 점이 어느 축 위에 존재하지 않는다.
  • 문제는 if-elif-else 문을 사용해서 쉽게 풀었다.
  • 각 사분면별로 x, y값이 양수인지 음수인지에 따라 조건문을 작성하고 사분면 위치를 return 값으로 반환하게 작성했다.
  • 마지막 제 4사분면 위치를 반환할 때 별도의 조건문 없이 else 로 사용한 이유는 입력되는 값이 4개의 경우만 존재하기 때문이다. 즉, 3가지 조건문에 만족하지 않는 경우가 1가지(제 4사분면에 존재하는 경우)뿐이라서 else문을 사용했다.
  • EASY 😎


2. 2차원으로 만들기

정수 배열 num_list와 정수 n이 매개변수로 주어집니다. num_list를 다음 설명과 같이 2차원 배열로 바꿔 return하도록 solution 함수를 완성해주세요.

num_list가 [1, 2, 3, 4, 5, 6, 7, 8] 로 길이가 8이고 n이 2이므로 num_list를 2 * 4 배열로 다음과 같이 변경합니다. 2차원으로 바꿀 때에는 num_list의 원소들을 앞에서부터 n개씩 나눠 2차원 배열로 변경합니다.

num_list n result
[1, 2, 3, 4, 5, 6, 7, 8] 2 [[1, 2], [3, 4], [5, 6], [7, 8]]

제한사항

  • num_list의 길이는 n의 배 수개입니다.
  • 0 ≤ num_list의 길이 ≤ 150
  • 2 ≤ n < num_list의 길이

(1) 코드 작성

def solution(num_list, n):
    answer = []
    # for 중첩문 사용
    for i in range(0, len(num_list), n):
        # 반복문 실행될 때마다 새로운 빈 리스트로 생성
        new_list = []
        for j in range(n):
            new_list.append(num_list[i+j])
        answer.append(new_list)
    return answer

(2) 코드 리뷰 및 회고

  • 이번 문제는 num_list 내에 있는 요소들을 n개로 각각 묶어 2차원 형태로 만드는 것이다.
  • 문제 해결을 위해 for 중첩문을 사용했다.
    • 단, num_list내의 모든 요소들을 불러오고 또 각 요소에 대해 반복문을 실행시키는 것은 의미없다.
    • 그래서 for문으로 반복 횟수를 지정할 때, step를 추가했다.
  • 예로 이해
    • num_list : [1, 2, 3, 4, 5, 6] / n : 3
    • 첫 번째 반복문에서 range(0, 6, 3)이 됨
    • i는 0으로 시작 > j는 0, 1, 2 로 총 3번 반복 됨
    • 즉, 새로운 리스트 내에 인덱스가 (0+0)인 값, (0+1)인 값, (0+2)인 값을 넣고 두 번째 반복문이 종료되면 3개의 요소가 들어간 new_list를 answer 리스트에 넣는다.
    • 그 다음 i는 3이 됨 (0 + 3(스텝) == 3)
    • 두 번째 반복문에서 j는 이전과 동일하게 0, 1, 2로 총 3번 반복
    • 새로운 리스트 내에 인덱스가 (3+0), (3+1), (3+2)인 값이 추가되고 이 리스트를 answer 리스트에 추가한다.
  • 주의사항
    • 2차원 배열, 리스트 내에 리스트들의 집합으로 만들기 위해선 append 함수를 사용해야한다.
    • expend를 사용하게 되면 리스트 내의 요소들이 하나씩 들어간다.
    • 예:
      • [0].append([1, 2, 3]) -> [0, [1, 2, 3]]
      • [0].expend([1, 2, 3]) -> [0, 1, 2, 3]
  • EASY 😎


3. 공 던지기

머쓱이는 친구들과 동그랗게 서서 공 던지기 게임을 하고 있습니다. 공은 1번부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있습니다. 친구들의 번호가 들어있는 정수 배열 numbers와 정수 K가 주어질 때, k번째로 공을 던지는 사람의 번호는 무엇인지 return 하도록 solution 함수를 완성해보세요.

제한사항

  • 2 < numbers의 길이 < 100
  • 0 < k < 1,000
  • numbers의 첫 번째와 마지막 번호는 실제로 바로 옆에 있습니다.
  • numbers는 1부터 시작하며 번호는 순서대로 올라갑니다.

(1) 코드 작성

def solution(numbers, k):
    # 공 던지는 사람의 위치(인덱스)값 계산
    idx = (2*(k-1)) % len(numbers)
    return numbers[idx]

(2) 코드 리뷰 및 회고

  • 문제 이해
    • numbers는 공 던지기를 하는 사람들의 위치라고 생각
    • 공 던지기를 하는 상황에서 공은 본인을 기준으로 한 사람 건너 뛴 그 다음 사람에게로 전달
    • 아래 이미지는 이해를 위해 추가함(Powerpoint로 제작)
  • 문제 정리
    • 공 던지기는 numbers 내에서 이루어짐
    • [1, 2, 3, 4, 5, 6] 멤버내에서 공의 위치는 1 > 3 > 5 > 1 > 3 > 5 .. 반복
    • 인덱스 값을 어떻게 정의할 것인가가 문제의 핵심
  • 코드 정리
    • k 번째에 공을 던지는 사람의 번호를 구함
      • 최종 공의 위치 전을 구해야 함
    • 위 사항을 고려해 (k-1)로 설정함
      • k번째 공의 위치가 아닌 k-1번째 공의 위치를 구해야하기 때문
    • 공의 이동은 위치가 1번 > 3번 과 같이 인덱스 값이 2씩 차이남
      • 이 점을 고려해 idx 변수에 2를 곱하여줌
    • 마지막으로 numbers 길이를 고려해야 함
      • 고려 X 경우 : 1 > 3 > 5 > 7 > 9 > ...
      • 이 점을 고려해 len(numbers)로 나눈 나머지 값을 반환하도록 함
    • 길이로 나눈 값의 나머지를 불러온 이유
      • 공의 위치(인덱스) : 0 > 2 > 4 > 0(6) > 2(8) > 4(10) ..
      • numbers 내의 인덱스 값으로 불러오기 위해 리스트의 길이로 나눈 나머지를 반환
  • 예시로 이해
    • 공 던지기에 참여한 사람 수 : 6 / 공던지기 총 3번
    • 0 –1번–> 2 –2번–> 4(구해야하는 공의 위치) –3번–> 6(현재 공 위치)
    • 2*(3-1)%6 => 4 % 6 == 4
    • numbers[4]
  • 인덱스값을 어떻게 반환할 것인가를 고민하긴 했지만 문제는..! EASY 😎


4. 배열 회전시키기

정수가 담긴 배열 numbers와 문자열 direction가 매개변수로 주어집니다. 배열 numbers의 원소를 direction방향으로 한 칸씩 회전시킨 배열을 return하도록 solution 함수를 완성해주세요.

제한사항

  • 3 ≤ numbers의 길이 ≤ 20
  • direction은 “left” 와 “right” 둘 중 하나입니다.

(1) 코드 작성

def solution(numbers, direction):
    # 방향별 실행 코드 차별화
    if direction == 'left':
        nums = numbers[1:]
        nums.append(numbers[0])
    else:
        nums = numbers[:-1]
        nums.insert(0, numbers[-1])
    return nums

(2) 코드 리뷰 및 회고

  • 문제 이해
    • 이동 방향이 left일 경우 numbers 안에 있는 요소들을 왼쪽으로 한칸씩 이동
    • 이동 방향이 right일 경우 numbers 안에 있는 요소들이 오른쪽으로 한칸씩 이동
  • 문제 정리
    • left로 이동(== 맨 처음 요소가 마지막 위치로 이동)
    • right로 이동(== 맨 마지막 요소가 첫 번째 위치로 이동)
  • 코드 설명
    • 위 조건을 만족하기 위해 조건문으로 direction 종류를 기준으로 실행할 코드를 나눈다.
    • 왼쪽으로 이동 시, nums 변수에 0번 인덱스를 제외한 요소들을 저장하고 마지막 위치에 0번째 인덱스 값을 추가하기 위해 append 함수를 사용했다.
    • 오른쪽으로 이동 시, nums 변수에 0번 인덱스의 값부터 -2번 인덱스의 값까지의 요소를 저장하고 첫 번째 요소에 -1번째 인덱스 값을 추가하기 위해 insert 함수를 사용했다.
  • 한줄 정리
    • 이번 문제는 append 함수는 마지막 위치에 요소를 넣어주고(위치 지정 X), insert 함수는 특정 위치(인덱스)에 요소를 넣을 수 있다(위치 지정 O)는 리스트관련 함수를 사용했다.
  • EASY 😎


👩🏻‍💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.

댓글남기기