반응형

안녕하세요 밤샘공부입니다~

[백준 14681번 파이썬]

질문이 있으시면, 아래 오픈채팅방이나 메일로 보내주세요~

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좌표는 모두 양수나 음수라고 가정한다.

[14681번 참고 이미지]

 (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개인게 조금 불편하다. 그렇기에 좀 더 효율적으로 알고리즘을 구현할 수 있지 않을까? 라는 생각을 떠올리는 것이 당연하다. 이에 더불어 이진논리를 알고 있다면 금상천화이다. 

[두번째 방법 - Idea]

    즉, 양수좌표라면 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 학습용. 그래도 재미는 있네요 ㅎㅎ)

반응형