티스토리 뷰

728x90
반응형

백준 온라인 저지(BOJ) 15894번 수학은 체육과목 입니다

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

 

15894번: 수학은 체육과목 입니다

성원이는 수학을 정말 못 하는 고등학생이다. 수학을 못하는 대신 근성과 팔 힘이 뛰어난 성원이는 수학 시험에서 수학 지식을 사용하지 않고 근성과 체력을 사용해 문제를 푼다. 지난 시험에서

www.acmicpc.net

* 사용언어 : C언어, C++

 

1. 문제

한 변의 길이가 1인 정사각형을 아래와 같이 붙여 나감

가장 아래 정사각형이 n개일 때 실선으로 이루어진 도형의 둘레 길이를 출력

(n 의 범위는 1 ~ 1,000,000,000)

 

2. 풀이

결론부터 말하면 n * 4 를 출력하면 되는 단순한 문제입니다.

 

다만 n 이 최대 10억이므로 4를 곱하면 40억이 되어 int 형 범위(-21억 ~ 21억)을 넘기 때문에

출력 시 unsigned int(%u)로 해주어야 합니다. (0 ~ 42억)

 

 

왜 단순히 곱하기 4로 출력한 것이 답이냐면,

도형 둘레의 길이는 n * n 정사각형과 완전히 같기 때문입니다.

위 두 도형의 둘레 길이는 같다

따라서 길이가 n 인 정사각형의 둘레 길이를 출력하면 되므로

n * 4 로 쉽게 구현할 수 있었습니다.

 

 

문제를 보자마자 바로 위와 같은 풀이를 생각해낸 것은 아니었습니다.

생각한 과정을 복기하면 아래와 같이 정리할 수 있습니다.

 

1) 규칙이 있을 것 같다고 생각함

2) n = 4 까지 하나씩 길이를 직접 구해봄 (4, 8, 12, 16, ...)

3) 정답이 n * 4 임을 발견함

4) 왜일까 고민하다가 상하좌우 선분을 나누어 생각해봄

5) 순서대로 아래는 n → 좌, 우도 n → 위도 n 인 것을 알아챔

6) 둘레의 길이가 n * n 정사각형의 길이와 같다는 것을 떠올림

 

3. 코드

#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
/*
15894_수학은 체육과목 입니다
1112KB	0ms
*/
#include <cstdio>

int main() {
#ifdef _WIN32
	freopen("input.txt", "r", stdin);
#endif // _WIN32
	int n;
	scanf("%d", &n);
	printf("%u\n", n << 2);
	return 0;
}

* shift 연산이 더 빠릅니다. (n << 2 는 n * 4 와 같음)

 

728x90
반응형
댓글