알고리즘 공부/C++

[S1] 백준 29197번 아침 태권도 C++ 수학, 기하학, 해시맵

마달랭 2025. 2. 26. 23:48

리뷰

 

https://www.acmicpc.net/problem/29197

원점에서 보이는 직선의 개수를 구하는 문제

 

 

전역 변수

  • z : 기울기가 없는 직선을 저장할 해시맵
  • one, two, three, four : 1 ~ 4사분면에 위치한 직선을 저장할 해시맵
  • n : 학생의 수를 저장할 변수

 

함수

없음

 

 

문제풀이

  1. n을 입력 받고, n명의 학생의 좌표를 입력 받아 사분면을 구분하여 기울기를 각 해시맵에 저장한다.
  2. 모든 해시맵의 크기를 더해 출력한다.

 

트러블 슈팅

없음

 

 

참고 사항

  • 원점에서 보는 것이기 때문에 각 사분면 마다 체크를 진행해 주어야 한다.
  • 기울기가 없는 경우 divide zero에 유의하여야 한다.

 

정답 코드

#include<iostream>
#include<unordered_map>
using namespace std;

unordered_map<double, bool> z;
unordered_map<double, bool> one;
unordered_map<double, bool> two;
unordered_map<double, bool> three;
unordered_map<double, bool> four;
int n;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> n;
	while (n--) {
		int x, y; cin >> x >> y;
		if (!x && y < 0) z[-10001] = true;
		else if (!x && y > 0) z[10001] = true;
		else if (x < 0 && !y) z[-10002] = true;
		else if (x > 0 && !y) z[10002] = true;
		else {
			if (x > 0 && y > 0) one[(double)x / y] = true;
			if (x < 0 && y > 0) two[(double)x / y] = true;
			if (x < 0 && y < 0) three[(double)x / y] = true;
			if (x > 0 && y < 0) four[(double)x / y] = true;
		}
	}
	cout << z.size() + one.size() + two.size() + three.size() + four.size();
}
728x90