본문 바로가기
코테 - 자바

99클럽 코테 스터디 3일차 TIL + 문자열

by BIGENGINEER 2025. 4. 2.

 

 

 

 


워..일단 접근 방법을 모르겠다.

 

- 숫자 앞 뒤의 ! 개수와 여부를 가지고 코드를 짜야될 것 같은데

 

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과 같은 문법은 계속해서 공부하는걸로..