[백준 14681번 사분면 고르기] 17강. 백준 단계별로 풀어보기 <2-4>
안녕하세요 밤샘공부입니다~
질문이 있으시면, 아래 오픈채팅방이나 메일로 보내주세요~
2시간 이내에 답변 드리겠습니다.
오픈챗 링크 : https://open.kakao.com/o/srASNxef
메일 주소 : studying.all.night.1114@gmail.com
전달력을 높이기 위해 평어체를 사용하였습니다.
1. 문제 설명
(1) 문제
흔한 수학 문제 중 하나는 주어진 점이 어느 사분면에 속하는지 알아내는 것이다. 사분면은 아래 그림처럼 1부터 4까지 번호를 갖는다. "Quadrant n"은 "제n사분면"이라는 뜻이다. 예를 들어, 좌표가 (12, 5)인 점 A는 x좌표와 y좌표가 모두 양수이므로 제1사분면에 속한다. 점 B는 x좌표가 음수이고 y좌표가 양수이므로 제2사분면에 속한다. 점의 좌표를 입력받아 그 점이 어느 사분면에 속하는지 알아내는 프로그램을 작성하시오. 단, x좌표와 y좌표는 모두 양수나 음수라고 가정한다. |
(2) 입력
첫 줄에는 정수 x가 주어진다. (−1000 ≤ x ≤ 1000; x ≠ 0) 다음 줄에는 정수 y가 주어진다. (−1000 ≤ y ≤ 1000; y ≠ 0) |
(3) 출력
점 (x, y)의 사분면 번호(1, 2, 3, 4 중 하나)를 출력한다. |
(4) 예제
① 예시 1
- 입력
12
5
- 출력
1
2. 문제 해석 및 총평
해당 문제는 주어진 점이 몇 사분면에 있는지를 물어보는 문제이다. 이때, 크게 두가지 방법으로 나누어서 풀 수 있다. 첫번 째 방법으로는 , 단순히 조건문을 4갈래로 나누어 풀어도 된다. x좌표가 양수인지 음수인지 2갈래. y좌표가 양수인지 음수인지 2갈래. 저번 시간에 풀었던 윤년 문제와 마찬가지로 구조도를 그려보았다.
그런데 이때, y좌표가 양수인가?라는 질문이 2개인게 조금 불편하다. 그렇기에 좀 더 효율적으로 알고리즘을 구현할 수 있지 않을까? 라는 생각을 떠올리는 것이 당연하다. 이에 더불어 이진논리를 알고 있다면 금상천화이다.
즉, 양수좌표라면 1 로 / 음수좌표라면 0 으로 값을 치환한다. 그렇다면 1사분면, 2사분면, 3사분면, 4사분면의 좌표가 순서대로 11, 01, 00, 10 으로 표현된다. 이후 이 값을 이진수로 해석하여 3, 1, 0, 2로 생각할 수 있다. 그런 뒤 이 3, 1, 0, 2를 리스트의 인덱스로 간주하여 사분면의 값을 저장한 리스트인 Quads = [3, 2, 4, 1] 을 만든뒤 Quads[이진 값]을 넣으면 자동으로 사분면 값을 반환하게 할 수 있다.
이해가 잘 안된다면 아래 그림을 참고하자.
이러한 사실을 바탕으로 코드를 짜보자.
3. 코드
(1) 방식 1
#방식 1
x = int(input())
y = int(input())
if x > 0 :
if y > 0 :
print(1)
else :
print(4)
else :
if y > 0 :
print(2)
else :
print(3)
조건문을 이용한 담백한 풀이다. 솔직히, 마음에 드는 풀이는 아니지만 처음 python을 공부할 때는 이정도로만 쓸 줄 알아도 칭찬받을 만 하다.
(2) 방식 2
#방식 2
x = int(input())
y = int(input())
quads = [3, 2, 4, 1]
# 요렇게 쓰면 1사분면, 2사분면, 3사분면, 4사분면의 점이 각각 (1, 1) / (0, 1) / (0, 0) / (1, 0)이 된다.
x_y_2 = (x>0, y>0)
# 2진수 값 -> 10진수
x_y_10 = x_y_2[0]*2 + x_y_2[1]
print(quads[x_y_10])
방식 2의 논리구조를 그대로 코드로 옮겼다. 어떤가? 조건문을 쓰지 않고도 이 문제를 푼 사실이 놀랍지 않은가? (엄밀하게는, 조건문을 안썼다고 보기 어렵기는 합니다. x>0 / y>0 요부분 때문에요. ) 아마, x_y_2 = (x>0, y>0) 부분이 잘 이해가 안될 것이다. 이 부분에 대해 부연설명을 하자면, 기본적으로 Python은 참 -> 1 / 거짓 -> 0 을 반환한다. 따라서 x>0 이라는 것은 참, 거짓을 판단하는 동시에 1 혹은 0으로 존재한다. 예를 들어 x 가 양수라면 x > 0 은 1의 값이 된다. 그럼에도 이해가 잘 되지 않는 다면 오픈챗 링크로 들어와 질문해주면 된다! (커피 쿠폰도 같이!)
(3) 짧은 코드
#추가 풀이
print([3, 2, 4, 1][(int(input())>0)*2 + (int(input())>0)])
코드를 최대한 줄여 보았다. (비추천 풀이. just 학습용. 그래도 재미는 있네요 ㅎㅎ)
'밤샘코딩 > 백준 AtoZ' 카테고리의 다른 글
[백준 2525번 오븐시계] 19강. 백준 단계별로 풀어보기 <2-6> (0) | 2023.04.28 |
---|---|
[백준 2884번 알람시계] 18강. 백준 단계별로 풀어보기 <2-5> (0) | 2023.04.27 |
[백준 2753번 윤년] 16강. 백준 단계별로 풀어보기 <2-3> (0) | 2023.04.25 |
[백준 9498번 시험 성적] 15강. 백준 단계별로 풀어보기 <2-2> (0) | 2023.04.24 |
[백준 1330번 두 수 비교하기] 14강. 백준 단계별로 풀어보기 <2-1> (0) | 2023.04.24 |
댓글
이 글 공유하기
다른 글
-
[백준 2525번 오븐시계] 19강. 백준 단계별로 풀어보기 <2-6>
[백준 2525번 오븐시계] 19강. 백준 단계별로 풀어보기 <2-6>
2023.04.28 -
[백준 2884번 알람시계] 18강. 백준 단계별로 풀어보기 <2-5>
[백준 2884번 알람시계] 18강. 백준 단계별로 풀어보기 <2-5>
2023.04.27 -
[백준 2753번 윤년] 16강. 백준 단계별로 풀어보기 <2-3>
[백준 2753번 윤년] 16강. 백준 단계별로 풀어보기 <2-3>
2023.04.25 -
[백준 9498번 시험 성적] 15강. 백준 단계별로 풀어보기 <2-2>
[백준 9498번 시험 성적] 15강. 백준 단계별로 풀어보기 <2-2>
2023.04.24