
오늘의 학습 키워드 : 문자열
- 공부한 내용 본인의 언어로 정리하기
ⓐ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;
}
}
'【스터디노트】 > ▷TIL' 카테고리의 다른 글
99클럽 코테 스터디 5일차 TIL + 오늘의 학습 키워드 스택과 큐 (0) | 2025.04.04 |
---|---|
99클럽 코테 스터디 4일차 TIL + 오늘의 학습 키워드: 스택과 큐 (0) | 2025.04.03 |
99클럽 코테 스터디 2일차 TIL + 오늘의 학습 키워드 문자열 (0) | 2025.04.02 |
[D-0] 파이널 프로젝트까지 끝! (1) | 2024.11.13 |
[24.10.16] finalproject day8일차 일과 (0) | 2024.10.18 |