https://youtu.be/dYNG-HIuOzQ?si=TqdkFKy8QWYq2rqW

요즘 너무너무 빠졌어요... 진심 몇 십번 들은 플리
솔직히 8월 4주차, 9월 1주차 WIL을 쓰지 않은 건 다 이유가 있다.
배운 게 없기 때문....
 
개강하자마자 약속이 월화수목금토,월화수목금토..... 그냥 매일매일 사람을 만나!!!!!!!!!날 내버려둬...
 
그리고 포스트유니브 활동이 겹치고 겹쳐서 너무너무 바빴다... 회의 텀이 이틀?수준이라 그냥 매일매일 회의 준비...
백준도 그냥저냥... 브론즈로 채우고!.....ㅠ

매일매일 약속 나가느라 처참한 성취 기록.... 사람 만나는 것도 일이라고..!
더욱 처참한 공부 스케쥴러...

1. 알고리즘

11049번: 행렬 곱셈 순서 (acmicpc.net) (골3)
32226번: 진한주식회사는 어느 도시에 있을까? (acmicpc.net) (플4)
7869번: 두 원 (acmicpc.net) (골2)
28067번: 기하가 너무 좋아 (acmicpc.net) (골4)
11758번: CCW (acmicpc.net) (골5)
 
이번 주에는 그래도 브론즈 말고도 많이 풀었다! 사실 첫번째 빼고 대부분 기하문제다....
근데 풀어보면서 기하의 매력이 느꼈달까...! 뭔가 복잡한 알고리즘이 필요한 것이 아니라 수능 수학문제를 푼다는 느낌이 강했다. 그래서 오히려 재밌었다. 아는 알고리즘이 많이 없어서.... 차라리 쉬웠다. 
 
그래서 기하문제를 풀며 내가 배운 것...
 

1.1 원하는 소수점 자리만큼 출력하기

cout << fixed; 		// 소수점 자릿수만 고정
cout.precision(3);	// 10^(-3)까지 출력된다

[C++] 소숫점 반올림 고정출력 cout << fixed; cout.precision(); (velog.io)

[C++] 소숫점 반올림 고정출력 cout << fixed; cout.precision();

소숫점을 고정시켜서 출력해야 할 때 사용하면 됩니다.기본적으로 반올림이 포함됩니다. BOJ 10984 (B3) 내 학점을 구해줘

velog.io

잘 정리된 글도 가져왔다!
 
주의할 점
: 자동적으로 반올림이 된다. 
: 만약 fixed를 쓰지 않으면 정수부를 포함해서 전체 길이가 고정된다.
 

1.2 삼각함수 쓰기

#include <cmath>

res += 0.5 * r2 * r2 * (b - sin(b));

1. 헤더파일 <cmath>가 필요하다
2. 삼각함수 안에 무조건 라디안을 쓴다!
예를 들어, 60도에 대한 사인값을 구하고 싶다면 sin(60)이 아니라 sin(60*PI/180)으로 써야한다. 
단위에 주의할 것!!~~
 
생각보다 삼각함수 쓰기 쉬웠다.
 

1.3 역삼각함수의 nan문제

#include <cmath>

double a = 2 * acos((r1 * r1 + l * l - r2 * r2) / (2 * r1 * l));
double b = 2 * acos((r2 * r2 + l * l - r1 * r1) / (2 * r2 * l));

1. 헤더파일 <cmath>가 필요하다
2. 역삼각함수 안에 (-1) ~ 1 값을 넣어야한다.
 
역삼각함수 그래프를 생각해보쟈

애초에 sin함수와 cos함수의 치역은 [-1, 1]이므로 역삼각함수의 정의역이 [-1, 1]인 것은 당연...하다...
그래서 백준 문제를 풀면서 역삼각함수 안에 [-1, 1]범위의 값을 넣지 않아서 nan값이 많이 나왔다....
 

1.4 부동소수점 오차 문제

진짜 미치도록 짜증났던....
아무리 생각해도 로직이 맞는데 왜 틀렸지?!!의 반복이었다. 28067번...

if (sqrt(l3) + 1e-6 >= (sqrt(l1) + sqrt(l2))) {
					flag = false;
				}

문제는 sqrt였다.. 사실 sqrt말고도 pow도 부동소수점 문제가 크게 생길 수 있다. 
 
백준에도 관련 글이 올라와 있다.
부동소숫점 오류 (acmicpc.net)
 

요약하자면

1. 문제를 풀 때 float보다는 double
: double의 상대 오차는 약 10^(-15)이다.
: 다시 말하면 그 이하로는 오차가 발생할 수 있다는 것이다...
2. 정수가 들어있는 실수형 변수를 정수로 바로 캐스팅(대입?)하면 안된다. 
: 보통의 경우  1e-6 ~ 1e-9 정도를 더한다..
3. 비교 연산을 할 때 등호를 사용하면 안된다. 
: 어느정도의 오차가 있기 때문에 == 을 쓰면 원하는 결과가 나오지 않을 수 있다.
 

해결책

1. 실수를 쓰지 않는다!
: 무조건 식을 정수형으로 바꾼다. 제곱하고 제곱하기...
2. 1e-6 ~ 1e-9값을 통해 오차를 보정?한다.
 
++ 정수간의 연산에서도 오차가 생길 수 있다..
: int형끼리 나눗셈을 해도 오차가 발생한다....
 
혹시 내 로직은 완벽한데 계속 틀렸습니다가 뜬다면?실수형을 사용한 부분을 살펴보쟈..
 

1.5 CCW

: Counter Clock Wise
[알고리즘] CCW(Counter Clock Wise) (tistory.com)

[알고리즘] CCW(Counter Clock Wise)

알고리즘 개요 및 소개 CCW( Counter Clock Wise) 알고리즘은 3개의 점 A, B, C가 있을 때 이 점 3개를 이은 직선의 방향을 알고자 할 때 유용한 기하 알고리즘이다. 경우의 수는 총 3가지가 있으며 시계,

snowfleur.tistory.com

 
처음에 11758번을 CCW를 이용하지 않고 풀었었다. 
대충 p1, p2를 잇는 직선을 기준으로 영역을 나눈 다음 어느 영역에 속하는지에 따라 시계, 반시계방향을 결정하는 풀이였는데...
 
틀렸다!
http://boj.kr/98489122d495441e81b7d164da38ceac
이건 틀린 코드..
 
흠 역시나 부동소수점 오차에 관한 문제일 수도 있다(짐작
확실히 CCW는 나눗셈 부분 없이 구할 수 있어서 부동소수점 오차는 발생할 일이 없다. 
 
++활용에 관하나 흥미로운 글
CCW (Counter-ClockWise) - (2) (tistory.com)

CCW (Counter-ClockWise) - (2)

CCW (Counter-ClockWise) - (2) 이전 게시글 (CCW (Counter-ClockWise) https://wogud6792.tistory.com/10) 이번 게시글에서는 CCW알고리즘이 어떻게 이용되는지를 알아볼 것이다. 우선 CCW 알고리즘 코드는 다음과 같다. 소

rebro.kr

 

벌써 이만큼이나 왔다! 완성까지 한 2주 남았는데... 완성될 모습이 너무 기대된다. 

2. 기획

지금 사과 광고공모전을 하는 중인데... 어렵다! 
분명 내가 생각할 때까지만 해도 로직이 괜찮았는데, 왜 회의만 하면 구려보이는 걸까..!
 
스스로 분석하기에 내 문제점은... 너무 갈팡질팡한다는 것이다. 그러니까 어떤 것이 중요한 것인지 판단을 제대로 못하는 것 같다. 자꾸 사소하고 이상한 포인트에 꽂혀서 정작 큰 틀을 보지 못한다고 해야할까?
 
자꾸만 길 잃고 헤매는 나의 로직... 너무 작은 부분에 매몰되지 말고 큰 주제!큰 그림을 보려고 의식적으로 노력해야함을 느꼈다..  
 

3. 대학수학 및 전공 공부

...못햇어요~~ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
 
아니 변명 좀 하자면, 업무가 너무 많다보니까 자꾸 미루게 된다. 그냥 하루에 1시간씩만!해도 이득인데... 그것마저도 못해서... 뭔가 한 번 공부를 한다면 3시간씩! 이런 식으로 목표를 너무 높게 설정해서 오히려 안히게 되는 것 같다. 그리고 정신승리 하느라..
 
오늘 한 시간 하는 대신 흐름 끊기지 않게 내일 한번에 3시간해야지! 이런 생각으로 매일매일 미루기...
 

4. 이번 주 피드백

1. 백준에 너무 많은 시간 투자를 했다. 
: 이때까지 밀린 백준을 한 셈이라고 치면 안될까...
 
2. 약속을 너무 많이 나감
: 인정.. 좀 줄여야함. 수업 끝나고 약속을 매일 나갔더니 공부 시간이 부족했다... 일주일에 최대 3번정도로만 잡아야지..
 
사실 다른 모든 문제는 2번이 원인인 것 같다. 
그래... 약속 좀 줄여야지...


썸넬

+ Recent posts