오늘의 학습 키워드
- 문자열
백준 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
풀이
- BufferedReader로 문자열 입력 받기
- 정수 앞 뒤 '!' 개수 세기
- 뒤 '!' 만큼 팩토리얼 계산
- 앞 '!' 만큼 논리반전 계산
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을 사용해서 하나의 반복문만 사용할 수 있도록 수정했다.
'99클럽 코테 스터디' 카테고리의 다른 글
[99클럽 코테 스터디 6일차 TIL] Climbing Stairs (0) | 2025.04.07 |
---|---|
[99클럽 코테 스터디 5일차 TIL] Implement Stack using Queues (0) | 2025.04.05 |
[99클럽 코테 스터디 4일차 TIL] Implement Queue using Stacks (0) | 2025.04.03 |
[99클럽 코테 스터디 2일차 TIL] 문자열 분석 (0) | 2025.04.01 |
[99클럽 코테 스터디 1일차 TIL] 명령 프롬프트 (0) | 2025.03.31 |