[백준] 14681번 사분면 고르기

권태형·2023년 11월 29일

알고리즘

목록 보기
12/33

문제만 보면 불편하게 수학적 지식을 많이 요구하는 것 처럼 보일 수 있는 문제지만, 결국 x와 y값의 음양에 따른 결과 출력을 다르게 해주기만 하면 되는 문제이다.

나의 풀이

int x = int.Parse(Console.ReadLine());
int y = int.Parse(Console.ReadLine());

if(x > 0 && y > 0) Console.WriteLine(1);
else if(x < 0 && y > 0) Console.WriteLine(2);
else if(x < 0 && y < 0) Console.WriteLine(3);
else Console.WriteLine(4);

나는 처음 생각할 때 이렇게 풀었지만, 지금 보니 코드가 굉장히 지저분하게 보였다. 차라리 각 조건에 대한 결과를 하나의 변수에 담고 마지막에 그 변수를 출력하는 방식이면 좀 더 가독성 있었지 않았을까? 라는 생각이 든다.

int x = int.Parse(Console.ReadLine());
int y = int.Parse(Console.ReadLine());
int z;

if(x > 0 && y > 0) z = 1;
else if(x < 0 && y > 0) z = 2;
else if(x < 0 && y < 0) z = 3;
else z = 4;

Console.WriteLine(z);

생각대로 작성하고 문제풀이를 돌렸을때 정상 동작했을 때 속도는 차이가 없었지만, 메모리 용량측면에서 4kb의 차이가 생겼고, 코드 길이에서 30b의 차이가 발생했다. 메모리 용량은 z를 담기위한 변수 공간이 더 늘어났기 때문이지만 이정도 차이에 가독성을 올릴 수 있다면 2번 방식이 더 나은 것 같다.


다른사람 풀이

int a=Console.ReadLine()[0],b=Console.Read();Console.Write(a!=45?b!=45?1:4:b!=45?2:3);

충격적인 코드다. 그냥 보기에는 "이게 뭐야?" 뒤에 삼항의 삼항의 삼항연산자가 존재했다. 진짜 읽기 불편한 코드였으나, 그것보다 내 상식을 완전히 깨는 부분은 바로 int a=Console.ReadLine()[0],b=Console.Read();부분이었다.

나는 당연하게 각 사분면을 분리하는 x와 y의 음수, 양수 구분은 0보다 커야한다와 0보다 작아야한다 로 고정하고 있었는데, 이 코드는 달랐다.

첫번째 줄의 첫 번째 문자를 a변수에 담고, 그 다음줄의 첫번째 문자를 b변수에 담는데 이게 45(아스키 코드에서 -음의 부호)가 맞는가 아닌가로 음수와 양수를 구분지어서 풀이했다.

굳이 숫자를 0과 비교연산을 실행할 필요가 없다. -가 붙었냐 안붙었냐를 따지기만 해서 음수와 양수를 구분해 내는 방식이 내겐 너무 생소하고 독특하게 다가왔다.

물론 뒤의 삼항연산자가 3번이나 연달아 사용되는 것은 실질적은 업무에서 가독성을 해치기 때문에 사용되지 않을 수 있지만, 정말 배울게 많았던 아주 짧은 코드였다.

profile
22년 12월 개발을 시작한 신입 개발자 ‘권태형’입니다. 포스팅 하나하나 내가 다시보기 위해 쓰는 것이지만, 다른 분들에게도 도움이 되었으면 좋겠습니다. 💯컬러폰트가 잘 안보이실 경우 🌙다크모드를 이용해주세요.😀 지적과 참견은 언제나 환영합니다. 많은 댓글 부탁드립니다.

0개의 댓글