Link : https://www.acmicpc.net/problem/14391
Level : G3
유형 : 비트마스킹
📌 문제 탐색
1.종이를 자르는데, 가로 혹은 세로가 1이 되어야 한다.
2.각 조각 숫자의 합이 최대가 되어야 한다.
📌 오답
1. 간격 없이 한자리 수 int가 연속으로 입력 받아지는 경우
- char 형으로 입력 받고 int로 변환해줘도 되지만, 아래와 같이 입력받을 수 있다.
scanf("%1d", &arr[i][j]);
2. 연산자 우선순위를 생각하여, 원하는 출력값이 나오게 하려면 '괄호'를 잘 쳐야 한다.
- 고치기 전
if(s & (1 << k) == 0){
- 고친 후
if((s & (1 << k)) == 0){
& 연산자의 우선 순위보다 == 연산자의 우선순위가 더 높기때문에 (s & (1 << k ))처럼 괄호로 묶지 않으면 & 보다 == 연산자가 먼저 처리된다.
3. 비트 연산 결과를 잘 생각해보아야 한다.
- 고치기 전
if((s & (1<<k)) == 1){ .. }
- 고친 후
if((s & (1<<k)) != 0){ .. }
의도 : s의 k번째 비트가 1인지 확인하는 표현이다.
s = 5 (이진수로 0101)이고 k=2라면,
1 << k는 0100으로 4이다.(왼->오 방향)
s & ( 1 << k )는 0101 & 0100, 즉 값은 4가 된다.
따라서 s의 2번째 비트가 켜져있다는 것을 '그 자리의 값(1)'으로만 생각하고 조건문을 작성하면 안된다!! 비트 연산 결과의 최종 출력값을 생각해보아야 한다.
'코테 > 코딩테스트오답노트' 카테고리의 다른 글
[코테오답] 시프트 연산 결과 대입 (0) | 2024.12.26 |
---|---|
[코테오답] BOJ 15649번 N과 M (0) | 2024.12.15 |