| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- 백준 구현문제
- unity게임
- 바킹독알고리즘
- c#코딩기초트레이닝
- c#기초문법
- 백준
- 유니티게임만들기
- unity3dservival
- c#프로그래머스기초문법
- unity3d게임만들기
- 오블완
- 백준 c++ 공부
- Unity
- c#코테
- 유니티3dui
- c#기본문법
- c#
- c#문제
- unity게임만들기
- c# c#프로그래머스
- 바킹독
- 백준 C++
- 티스토리챌린지
- C#문법
- 유니티서바이벌게임만들기
- 백준코테
- 유니티
- unity3d
- 유니티공부
- 백준코딩테스트
- Today
- Total
나 개발자 진짜 되냐?
백준 C++ 10250번 ACM 호텔 ( 컴퓨터는 0, 나는 1 ) 본문

오늘은 매우매우 기념하고 싶은 날이다.
축하하려고 작은 케이크도 샀다.
이 기념일은 두번 다시는 오지 않는다.
그래서 더 귀하다.
뭐 사실 기념일이야 다 귀하긴 하지만 말이다.
즐거운 시간을 보내고싶었는데
그건 될지 안될지 잘 모르겠다...


왕 쉬울 줄 알았는데..
왕 어려웠던 문제....

왜 틀렸을까?
아무리 봐도 모르겠어서 젬쓰에게 질문
맞은 건 75점..
문제가 두 가지나 있다고 한다.
예외적인 게 뭐냐고 결국 물어봤다.
1. N이랑 H가 같을 경우 0이 출력하는 문제 발생
2. 저렇게 cout에 사이에 0을 넣으면 10층 10호가 될 경우
1010 호 여야하는데 저대로 하면 10010 이 된다.

이렇게 해줬는데
나름 예외라고 생각했는데
또 틀렸다고 한다.
그럼 배수면 어쩔 거냐고 묻는다.
아차차... 긁적..
나눴을 때 그냥 0이 나오면 안 되는 것..!!
그래서!
1번은 최종적으로!

일 줄 알았지만?! 틀렸단다.
이렇게 해주면 밑에에서 오류가 나게 된다고 한다.

만약에 이렇게 해주면
H가 6이고 N도 6이면
원래는 601호가 나와야 하지만
계산에 따르면 602호가 나오게 된다.
그래서 밑에도 if else 걸어줘야 한다.
그렇게 하면 진짜 최종!!

이렇게 된다.
정답은 맞다만.. 더 좋은 방향이 있다며 제안한다.
수학적 꼼수라고 말해주었다.
층의 경우 0호나 0 층은 없기 때문에 1부터 시작이지만,
나눗셈의 경우 몫과 나머지가 0일 때가 존재한다.
그것은 바로 H와 W가 같을 때, 혹은 배수일 때 경우이다.
아까 위에도 적었지만 H가 6이고 N도 6일 경우
원래는 601호가 나와야 하지만
조건을 안 달고 아까 맨 처음 위에 있는 식으로 풀게 되면
6%6은 0이고 6/6 은 1이니까
002가 나오는 무식한 상황이 발생한다
사실은 601이 나와야 하는데 말이다.
근데 우리는 예외처리로 if else를 해주었지만.
N -1을 해준 후에 % 든 / 해주고 다시 +1을 해주면
굳이 if를 안 해도 601호가 나오게 된다는 것이다.
왕! 신기!
간단하게
컴퓨터는 0부터 세고 싶어 하는데 인간은 1부터 세고 싶어 하니
컴퓨터에 일단 0부터 시작하게 하고, 그다음에 인간방식의 1을 더하자!
쉽지 않은.. 계산법이랄까..?!
역시 인간이 아니라 해석하기 어렵네...

그럼 아까 그 긴 게 두줄로 끝나게 된다.
2번은 이렇게 수정!

삼항연산자 쓰고 싶었는데..

긁적 답이 자꾸 이상하게 나온다..
삼항연산자로 쓰려면..
cout << h << (w < 10? "0" : "") << w << "\n";
이렇게 쓰라고 한다.
위에처럼 쓰면 비트라고 계산한다고...ㅋㅋ
하긴 이 방법이 있는데...
하지만 더 좋은 방법을 알려주었다.
h에다가 * 100을 해주고 + w를 해주면
그냥 답이 나온다고 한다.
600 + 12호 = 612호
600+ 2호 = 602호
오.. 똑똑하다.. 정말..ㅋㅋ
그렇다 하긴 그것도 맞네 단어를 굳이 하나씩 쓸 필요는 없긴 하다.

반토막으로 줄이기 성공!!!!!
이 문제의 가장 중요한 건 N-1 해주고 다시 +1 해주는 거다.
위 방법은 배열이나, 달력계산, 턴넘기기 등등에 자주 사용된다고 한다.
아직까지 제대로 완벽하게 숙지는 못했지만..ㅋㅋ
.. 음 원리가 참 신기하다.
.. 차차 익숙해지는 걸로..ㅎㅋ
고생했다.
'C++을 시작해봐요! > 단계문제를 풀어보아요!' 카테고리의 다른 글
| 백준 C++ 1008번 A / B ( percision(), fixed ) (1) | 2026.02.04 |
|---|