본문 바로가기
99클럽 코테 스터디

[99클럽 코테 스터디 3일차 TIL] !!초콜릿 중독 주의!!

by sozr 2025. 4. 2.

 

 

 

오늘의 학습 키워드

  • 문자열

 

 

백준 31458번 - !!초콜릿 중독!!

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

 

 

 

문제

코코의 초콜릿 가게에서 파는 초콜릿은 달달하기로 유명하다. 그래서 코코는 아래와 같은 경고문을 가게 앞에 붙이려고 한다.

!!초콜릿 중독 주의!!

이 문구를 유심히 보던 코코는 느낌표 사이의 문장을 지우고 그 자리에 수를 넣으면 일종의 수식이 된다는 사실을 깨달았다. 이 수식을 계산해 보자.

이 문제에서 계산할 수식은 정수 하나와 0개 이상의 느낌표로 이루어져 있다. 정수는 0 또는1이며, 느낌표는 정수의 앞이나 뒤에 올 수 있다. 이 수식을 계산하는 규칙은 다음과 같다.


n!은 n의 팩토리얼이다. 0!=1, 1!=1로 정의된다.

!n은 n의 논리 반전(logical not)이다. !0=1, !1=0으로 정의된다. 팩토리얼이나 논리 반전이 중첩되어 있으면 중첩된 횟수만큼 계산하며, !n!과 같이 둘 다 사용된 경우에는 팩토리얼을 먼저 계산한다. 예를 들어, !!n!!=!(!((n!) !))이다.

 

 

 

입력예제

6
0!
1!
!0
!1
!!0!!
!!1!!

 

 

출력예제

1
1
1
0
1
1

 

 

 

풀이

  1. BufferedReader로 문자열 입력 받기
  2. 정수 앞 뒤 '!' 개수 세기
  3. 뒤 '!' 만큼 팩토리얼 계산
  4. 앞 '!' 만큼 논리반전 계산

 

import java.util.*;
import java.io.*;


class Main {
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());    // 수식의 개수
        String s;
        
        
        while(T-- > 0) {
            s = br.readLine();
            int left=0; // 숫자 앞 !
            int right=0; //숫자 뒤 !
            int n = 0;
            boolean find = false; // 숫자 찾았는지 확인
            
            for(int j=0; j<s.length(); j++){
                char c = s.charAt(j);
                
                if(c == '!') {
                    if(!find) left++;   // 찾기 전
                    else right++;       // 찾은 후
                } else {
                    find = true;
                    n = c - '0';
                }
            }
            
            // 1. 팩토리얼 
            for(int k=0; k<right; k++){  
                n = 1;
            }
            
            // 2. 논리반전
            for(int k=0; k<left; k++){
                n = (n == 1) ? 0 : 1;
            }
            
            System.out.println(n);
            
        }
        
        
    }
    
}

 

 

 

처음에 반복문을 두번 사용해서 정수 나올때까지 left증가 정수 이후로 또 반복문을 돌렸는데

boolean을 사용해서 하나의 반복문만 사용할 수 있도록 수정했다.