본문 바로가기
  • Adillete
【스터디노트】/▷TIL

99클럽 코테 스터디 3일차 TIL + 오늘의 학습 키워드 문자열

by 아딜렛 2025. 4. 2.

 

 

 오늘의 학습 키워드 : 문자열
- 공부한 내용 본인의 언어로 정리하기

ⓐsc.nextLine(); 으로 개행 문자를 소비하여 다음 입력을 정확히 할수 있다

ⓑin number =-1;로 하면 0,1을 사용하지 않고 초기화 할수 있다.

ⓒ-1 =>오류 검출도 가능만약 어떤 이유로 코드가 숫자를 읽지 못한 경우(예: 입력 형식이 잘못된 경우), 변수 값이 여전히 -1이라면 이는 문제가 있다는 신호로 사용할 수 있다.

1단계: 접두사 느낌표를 카운트한다.

2단계: 숫자를 읽는다.

3단계: 팩토리얼을 센다.


- 오늘의 회고
  - 어떤 문제가 있었고, 나는 어떤 시도를 했는지

!0=1 을 함수로 만들어야하는데 이 부분을 이해 못하고 에러났다.


  - 어떻게 해결했는지

// 논리 반전 계산 함수: !n
public static int logicalNot(int n) {
    return n == 0 ? 1 : 0;  // !0 = 1, !1 = 0 (문제 조건에 명시)
}


  - 무엇을 새롭게 알았는지

메서드를 만들어서 메인절에서 필요한 부분을 만들어야 알고리즘이 작동한다.
  - 내일 학습할 것은 무엇인지 문자열 관련된 알고리즘 추가 공부할것이다.

문제

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

!!초콜릿 중독 주의!!

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

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

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

입력

첫 번째 줄에는 수식의 개수 T가 주어진다. (1≤T≤1000)

두 번째 줄부터 T개의 수식이 한 줄에 하나씩 주어진다. 하나의 수식은 a개의 느낌표, 정수 n, b개의 느낌표가 공백 없이 순서대로 합쳐진 형태이다. (0≤a,b≤30; 0≤n≤1)

출력

각 수식을 계산한 결과를 한 줄에 하나씩 출력한다.

예제 입력 1 복사

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

예제 출력 1 복사

1
1
1
0
1
1

 


수도코드

알고리즘 초콜릿수식계산:
    함수 main():
        T = 입력받은 테스트 케이스 수 
        
        반복 T번:
            expression = 입력받은 수식
            result = evaluateExpression(expression) 호출
            result 출력
    
    함수 evaluateExpression(expression):
        prefixExclamations = 0  // 숫자 앞의 느낌표 개수
        number = -1             // 숫자 (0 또는 1)
        suffixExclamations = 0  // 숫자 뒤의 느낌표 개수
        
        i = 0  // 문자열 인덱스
        
        // 접두사 느낌표 카운트
        반복 (i < expression.길이 그리고 expression[i] == '!'):
            prefixExclamations 증가
            i 증가
        
        // 숫자 읽기
        만약 (i < expression.길이):
            number = expression[i] - '0'  // 문자를 숫자로 변환
            i 증가
        
        // 접미사 느낌표 카운트
        반복 (i < expression.길이 그리고 expression[i] == '!'):
            suffixExclamations 증가
            i 증가
        
        // 계산 시작
        value = number
        
        // 접미사 느낌표(팩토리얼) 적용
        반복 suffixExclamations번:
            value = factorial(value) 호출
        
        // 접두사 느낌표(논리 반전) 적용
        반복 prefixExclamations번:
            value = logicalNot(value) 호출
        
        return value
    
    함수 factorial(n):
        만약 (n == 0 또는 n == 1):
            return 1  // 0! = 1, 1! = 1
        
        result = 1
        반복 i = 2부터 n까지:
            result *= i
        
        return result
    
    함수 logicalNot(n):
        만약 (n == 0):
            return 1
        아니면:
            return 0
import java.util.Scanner;

public class Main{

    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        int T= sc.nextInt();
        sc.nextLine();

        for(int t=0; t<T;t++){
            String expression = sc.nextLine();
            int result= evaluateExpression(expression);
            System.out.println(result);
        }
    }

    private static int evaluateExpression(String expression) {

        int prefix =0;
        int number=-1;
        int suffix=0;

        int i = 0;

        while(i<expression.length()&&expression.charAt(i)=='!'){
            prefix++;
            i++;
        }
        if(i<expression.length()){
            number = expression.charAt(i)-'0';
            i++;
        }
        while(i<expression.length()&&expression.charAt(i)=='!'){
            suffix++;
            i++;
        }
        int value=number;
        for(int j=0; j<suffix;j++){
            value=factorial(value);
        }
        for(int j=0; j<prefix;j++){
            value= logicalNot(value);
        }
        return value;
    }

    private static int factorial(int n) {
        if(n==0|| n==1){
            return 1;
        }
        int result=1;
        for(int i=2; i<=n;i++){
            result*=i;
        }
        return result;
    }
    public static int logicalNot(int n){
        return n==0? 1:0;
    }


}