[프로그래머스 Python] 코딩테스트 입문 Day 10 - 조건문, 배열, 수학, 시뮬레이션
코딩테스트 입문 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]
- 2차원 배열, 리스트 내에 리스트들의 집합으로 만들기 위해선
- 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)
로 나눈 나머지 값을 반환하도록 함
- 고려 X 경우 :
- 길이로 나눈 값의 나머지를 불러온 이유
- 공의 위치(인덱스) : 0 > 2 > 4 > 0(6) > 2(8) > 4(10) ..
- numbers 내의 인덱스 값으로 불러오기 위해 리스트의 길이로 나눈 나머지를 반환
- k 번째에 공을 던지는 사람의 번호를 구함
- 예시로 이해
- 공 던지기에 참여한 사람 수 : 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일 경우
- 문제 정리
- left로 이동(== 맨 처음 요소가 마지막 위치로 이동)
- right로 이동(== 맨 마지막 요소가 첫 번째 위치로 이동)
- 코드 설명
- 위 조건을 만족하기 위해 조건문으로 direction 종류를 기준으로 실행할 코드를 나눈다.
- 왼쪽으로 이동 시, nums 변수에 0번 인덱스를 제외한 요소들을 저장하고 마지막 위치에 0번째 인덱스 값을 추가하기 위해 append 함수를 사용했다.
- 오른쪽으로 이동 시, nums 변수에 0번 인덱스의 값부터 -2번 인덱스의 값까지의 요소를 저장하고 첫 번째 요소에 -1번째 인덱스 값을 추가하기 위해 insert 함수를 사용했다.
- 한줄 정리
- 이번 문제는 append 함수는 마지막 위치에 요소를 넣어주고(위치 지정 X), insert 함수는 특정 위치(인덱스)에 요소를 넣을 수 있다(위치 지정 O)는 리스트관련 함수를 사용했다.
- EASY 😎
👩🏻💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.
댓글남기기