문제 설명
문제 풀이
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
// 램 갯수
int cnt = sc.nextInt();
sc.nextLine();
// 램 용량
String str = sc.nextLine();
String[] array = str.split(" ");
int brokenCnt = 0;
StringBuffer sb = new StringBuffer();
for(int i = 0; i < cnt; i++){
int temp = Integer.parseInt(array[i]);
// 2의 제곱이 아닌 요소 체크
if(temp != (temp & - temp)){
brokenCnt++;
sb.append(i + 1 + " ");
}
}
System.out.println(brokenCnt);
System.out.printf(sb.toString().trim());
}
}
- 구름 플랫폼은 프로그래머스와 다르게 입력 값을 입력받아야 한다.
- 램 개수 입력 후 램 용량들을 입력받아 split를 사용해 배열화 한다.
- 램 갯수 만큼 for문을 돌며 램 용량을 int 형으로 변환한다.
- 2의 n제곱 수를 2진수로 나타내면
2의 2제곱 2 -> 10
2의 4제곱 16 -> 10000
2의 6제곱 64 -> 1000000
2의 0제곱 1 -> 1
이것처럼 1로 시작하여 오른쪽에 0이 채워지는 형태로 변환된다. (2의 거듭제곱은 어떤 한 비트만 1인 켜져 있는 상태) - temp &- temp는 temp에서 켜져 있는 가장 아래의 비트만 켜진 수이다. (temp를 2 제곱 수로 바꿈).
&는 비트 연산자이다. - 입력 받은 temp 가 2 거듭제곱이 아닌 수이고, (temp &- temp)로 2 거듭제곱 수로 변환한 수와 다르면 2 제곱이 아니다.
- &연산자보다 ==, != 연산자가 우선순위가 높으므로 괄호로 꼭 감싸야한다.