알고리즘 트레이닝/Dynamo로 푸는 백준

Dynamo로 풀어보자-백준 14681번(사분면 고르기)

hnanmal 2023. 1. 20. 21:43
300x250

프로그래밍에서 좌표평면을 어떻게 다룰까?

좌표평면이란 걸 수학 배우면서 많이 접했겠지만, 막상 프로그래밍에서 다루려면, API를 통하지 않고는 막막하게 느껴집니다.

간단하게 어떤 점이 몇 사분면에 위치하는지 판별할 수 있는 알고리즘을 찾아봅시다.

 

문제 및 입력 조건

14681번: 사분면 고르기

 

 

 

다이나모 풀이

전체 풀이의 모습은 아래입니다.

 

 

입력부

 

먼저 사분면 판별의 대상이 되는 좌표를 x,y의 순서로 코드 블럭으로 입력 받습니다.

 

 

알고리즘1 - 둘 다 양수일 때, 하나만 양수일 때?

제1사분면, 2사분면, 3사분면 및 4사분면의 정의를 이미 알고 계시죠?

  • x좌표와 y좌표가 둘 다 양수라면 제1사분면,
  • x좌표는 음수, y좌표는 양수라면 제2사분면,
  • x좌표가 음수, y좌표도 음수라면 제3사분면,
  • x좌표가 양수, y좌표는 음수라면 제4사분면

이 말을 코딩으로 그대로 옮기면 됩니다.

 

미리 딕셔너리를 한번 만들어볼까요?

좌표가 양수인 경우를 true, 음수인 경우를 false로 표현하고, x-y의 형태로 표현하면 아래와 같이 표현됩니다.

  • x좌표와 y좌표가 둘 다 양수라면 “true-true”,
  • x좌표는 음수, y좌표는 양수라면 “false-true”,
  • x좌표가 음수, y좌표도 음수라면 “false-false”,
  • x좌표가 양수, y좌표는 음수라면 “true-false”

 

이 내용을 사전의 형태로 다이나모 코딩하면 이렇게 표현할 수 있습니다.

참 거짓 값을 문자열 “true”와 “false”로 변환한 뒤, 각 사분면을 상징하는 숫자 1, 2, 3, 4 와 짝지어 딕셔너리를 만들어 줍시다. 빨간색 점선에서 보이듯이 데이터가 잘 세팅되었습니다. 다만 hash map의 특성 상 데이터의 입력 순서를 보장하지는 않지만, 우리는 키 값을 통해 데이터에 접근할 것이기 때문에 순서가 보장되지 않아도 아무런 상관이 없습니다.

 

 

알고리즘2 - 입력 받은 좌표도 true-false로 표현해보자

이제 입력받은 좌표를 판별해 볼 시간입니다.

 

x좌표와 y좌표를 각각 양수인지 음수인지 ‘>’노드를 통해 검사해보면, 위에서 딕셔너리를 준비할 때와 마찬가지로, true와 false를 반환합니다. 위쪽에서와 다르게 ‘String from Object’노드를 통해 문자열로 바꿔주지 않은 이유는, Code Block으로 데이터를 넘겨서 문자열로 합성할 때, 자동으로 데이터 타입을 바꿔주기 때문에 노드를 생략했습니다. 위쪽 딕셔너리 파트에서도 생략해도 작동하지만, 설명을 위해서 아래쪽에서만 ‘String from Object’노드를 생략했습니다.

(12, 5)좌표는 최종 표현이 ‘true-true’인 것을 확인할 수 있네요.

이 문자열을 아까 준비해둔 딕셔너리에 연결해서 어떤 값이 나오는지 확인하기만 하면 끝납니다.

 

 

최종 결과물 - 몇 사분면입니까?

 

이제 입력 좌표의 결과값이 딕셔너리의 어떤 키 값과 일치하는지 보고, 해당하는 키에 대응되어 있는 숫자를 반환해주도록 코딩을 하면 끝납니다. 1이라는 숫자를 통해 해당 좌표의 사분면이 제1사분면이란 것을 확인할 수 있었네요.

 

 

입력 좌표를 바꾸어 (9, -13)을 입력하면 위 그림처럼 제4사분면 이라고 잘 알려줍니다.

 

 

결론

이번 문제도 여지없이 딕셔너리를 활용하면 깔끔하게 해결할 수 있는 문제입니다. 아주 간단한 상황인 만큼 딕셔너리의 형태도 굉장히 간소해서 직관적으로 이해할 수 있는 수준의 코딩이기도 합니다. 상황이 복잡해지면, 딕셔너리의 형태도 복잡해져서, 딕셔너리의 내부 데이터가 다시 딕셔너리 형태인 중첩 딕셔너리(nested map)의 형태가 되기도 하는데, 이 때도 딕셔너리의 키 값 부여 체계를 미리 잘 세워놓는다면, 오히려 정돈된 체계로 문제 상황을 무리없이 풀어나갈 수 있습니다.

다른 문제로 또 찾아오겠습니다.

반응형