
워..일단 접근 방법을 모르겠다.
- 숫자 앞 뒤의 ! 개수와 여부를 가지고 코드를 짜야될 것 같은데
1) 0 일때, 뒤에 !가 오면 1 아니면 0
2) 1일때, 뒤에 !가 오면 1
??
!! 전체 코드
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();
while (T-- > 0) {
String input = sc.nextLine();
String numStr = input.replaceAll("[^01]", "");
int n = numStr.isEmpty() ? 0 : Integer.parseInt(numStr);
int prefixCount = 0;
for (int i = 0; i < input.length(); i++) {
if (input.charAt(i) == '!') prefixCount++;
else break;
}
int suffixCount = 0;
for (int i = input.length() - 1; i >= 0; i--) {
if (input.charAt(i) == '!') suffixCount++;
else break;
}
int result = n;
for (int i = 0; i < suffixCount; i++) {
result = factorial(result);
}
for (int i = 0; i < prefixCount; i++) {
result = logicalNot(result);
}
System.out.println(result);
}
}
public static int factorial(int n) {
return 1;
}
public static int logicalNot(int n) {
return (n == 0) ? 1 : 0;
}
}
1)
- int n = sc.nextInt(); 으로 숫자를 얻어 온다.
- sc.nextLine()을 하는 이유에 대해 궁금했는데
=> nextInt()는 숫자만 읽어오고 '\n' 개행은 안 읽어오기 때문에 버퍼에 \0은 남아있다. 그러면 String input sc.nextLine()에서 버퍼에 남아있는 '\n'을 읽어버린다. 그래서 sc.nextLine()을 통해 '\n'을 없앤다.
2)
while (T-- > 0) {
// 실행할 코드
}
T--를 사용하는 이유는 T>0 보다 간결한 코드일 뿐만아니라 반복문이 한 번 실행될 때마다 자동으로 감소한다.
- 즉, 위의 코드처럼 사용하면 T번 정확히 실행된다.
3) 숫자 추출
String numStr = input.replaceAll("[^01]", "");
int n = numStr.isEmpty() ? 0 : Integer.parseInt(numStr);
- ^을 통해 숫자가 아닌 모든 문자를 ""빈문자열로 replaceAll함수를 사용하여 대체함. -> 문자열에서 숫자만 남음
- numStr이 비어있으면 n=0, 비어있지 않으면 Integer.parseInt(numStr)로 변환해서 정수로 할당
=> 삼항 연산자로 쓰는 이유는?
- numStr이 비어있으면 NumberFormatException 즉, 숫자 변환 오류가 발생할 수 있기 때문에 비어있으면 기본값 0을 할당
4) 앞부분 느낌표 개수 세기
int prefixCount = 0;
for (int i = 0; i < input.length(); i++) {
if (input.charAt(i) == '!') prefixCount++;
else break;
}
- 반복문 사용해서 앞에서부터 ! 개수 세기
5) 뒷부분 느낌표 개수 세기
int suffixCount = 0;
for (int i = input.length() - 1; i >= 0; i--) {
if (input.charAt(i) == '!') suffixCount++;
else break;
}
- 반복문 사용해서 뒤에서 부터 ! 개수 세기
6) 팩토리얼 계산
int result = n;
for (int i = 0; i < suffixCount; i++) {
result = factorial(result);
}
for (int i = 0; i < prefixCount; i++) {
result = logicalNot(result);
}
7) 팩토리얼 값 반환
public static int factorial(int n) {
return 1;
}
public static int logicalNot(int n) {
return (n == 0) ? 1 : 0;
}
- 0!와 1!는 항상 1 이므로 1 반환
- n==0이면 1 반환, n==1 이면 0 반환
** 회고
- 솔직히 처음 봤을때 감이 안잡혔다.
- 다른 문제들은 접근 방법이 머릿속에 그려졌는데 이 문제는 아니었다 ..
- 구글링을 통해 도움을 받아 코드를 작성하고 나니 실제로는 단순한 구조였다
- 아 .. 아직 많~이 부족하다
- replaceAll과 같은 문법은 계속해서 공부하는걸로..
'코테 - 자바' 카테고리의 다른 글
| 99클럽 코테 스터디 6일차 TIL + 수열( (1) | 2025.04.07 |
|---|---|
| 99클럽 코테 스터디 5일차 TIL + 스택/큐(2) (0) | 2025.04.04 |
| 99클럽 코테 스터디 4일차 TIL + 스택/큐 (0) | 2025.04.03 |
| 99클럽 코테 스터디 2일차 TIL + 문자열 (1) | 2025.04.01 |
| 99클럽 코테 스터디 1일차 TIL + 팰린드롬 (7) | 2025.03.31 |