DINGA DINGA
Published 2021. 2. 8. 16:29
[백준] 1094번: 막대기 C & C++/BOJ
728x90

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

 

1094번: 막대기

지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대

www.acmicpc.net

 

코드

#include <stdio.h>
main() {
	int x, stick = 0;			//x: 입력 받는 수, stick: 막대기 수
	scanf("%d", &x);
	while (x > 0) {
		if (x & 1)
			stick++;
		x >>= 1;
	}
	printf("%d\n", stick);
}

 

설명

 

이 문제는 처음엔 배열로 접근하다가, 반으로 나눈다는 점에 초점을 두고 이진수 비트 연산을 활용해 해결했다.

예를 들어 설명해보겠다.

입력 받는 수가 23이라고 하면, 실행 과정은 다음과 같다.

 

1) 23의 이진수 표현: 0001 0111

2) x & 1이 true이므로 stick++ (현재 stick: 1)

3) x >>= 1: 0000 1011

4) x & 1이 true이므로 stick++ (현재 stick: 2)

5) x >>= 1: 0000 0101

6) x & 1이 true이므로 stick++ (현재 stick: 3)

7) x >>= 1: 0000 0010

8) x & 1이 false이므로 아무것도 하지 않음

9) x >>=1: 0000 0001

10) x & 1이 true이므로 stick++ (현재 stick: 4)

11) x가 0이므로 while문을 종료하고 stick 출력

 

728x90

'C & C++ > BOJ' 카테고리의 다른 글

[백준] 1259번: 팰린드롬수  (0) 2021.02.19
[백준] 1152번: 단어의 개수  (0) 2021.02.09
[백준] 2869번: 달팽이는 올라가고 싶다  (0) 2021.02.09
[백준] 1316번: 그룹 단어 체커  (0) 2021.02.09
[백준] 1008번: A/B  (0) 2021.02.08