본문 바로가기
코테/코딩테스트오답노트

[코테오답] 연산자 우선순위 & 비트 연산 출력 결과

by arirang_ 2025. 1. 1.

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)'으로만 생각하고 조건문을 작성하면 안된다!! 비트 연산 결과의 최종 출력값을 생각해보아야 한다.