99클럽 코테 스터디 3일차 TIL ✒️!!초콜릿 중독 주의!!
✅ 오늘의 학습 키워드
- char에서 int 변환
- 문자열 인덱스 탐색
- 조건문
🔍 오늘의 문제 분석
- 문자열에서 0 또는 1의 인덱스를 찾는다
- 0 또는 1 뒤에 !가 있으면 항상 결과는 1이다
- 0 또는 1 앞에 !의 개수대로 논리를 반전한다
오늘의 문제는 특정 문자열에서 숫자를 찾고 해당 숫자의 위치에 따라 논리를 적용하는 문제였다.
✨ 오늘의 회고
📌내가 적은 답안📌
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int cases = Integer.parseInt(br.readLine());
for (int c = 0; c < cases; c++) {
String s = br.readLine();
int index01 = -1;
int left = 0;
int answer = -1;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '0' || s.charAt(i) == '1') {
index01 = i;
answer = s.charAt(i) - '0';
break;
} else {
left++;
}
}
if (s.indexOf("!", index01) != -1) { //숫자 기준 오른쪽에 !가 있으면 항상 true
answer = 1;
}
answer = left % 2 == 1 ? 1 - answer : answer; //숫자 기준 왼쪽 !가 홀수이면 반전
System.out.println(answer);
}
//
}
}
오늘 문제는 이해하는데 많은 시간이 걸렸다. 논리를 파악하기 위해서 다른 분이 올리신 TIL을 참고했다. 처음에는 Stack을 이용해서 푸는 방법이 생각났고 그다음은 숫자를 기준으로 문자열의 앞과 뒤를 따로 보고 조건식을 만드는 것도 생각해 봤다. Stack이 익숙하지 않아서 조건식만 활용해서 풀어보았다.
입력마다 반복문을 돌릴 때 while로 했는데 입력 초과 에러가 났다. 그래서 for 문으로 다시 작성했다. for문도 처음에 잘못 작성해서 NumberFormat 에러가 났다.
for (int t = 0; t < br.read(); t++) { //br.read()는 하나의 문자를 아스키 코드 값으로 반환한다!
for (int t = 0; t < Integer.parseInt(br.readLine()); t++) {
//총 문장의 개수를 담는 t 변수를 따로 선언하지 않아 문제가 발생했다
답을 저장하는 변수 answer를 int형이 아닌 boolean 형으로 설정했더니 문제가 틀렸다고 나와서 다시 int형으로 바꿨다. boolean형으로 했을 때 로직의 문제는 없어보였는데 잘 모르겠다.
숫자 기준 오른쪽에 느낌표가 하나라도 있으면 항상 1이 나오는데 이 로직을 구현하는데 있어서 처음에는 substring 메서드를 사용했다. 문자열을 매번 자르고 다시 검사하는 substring보다 속도를 더 향상하기 위해서 indexOf 메서드를 사용해 봤다.
s.substring(index01).contains("!") //문자열을 자른 후 검사하는 방식
s.indexOf("!", index01) != -1
아래는 자바 공식 문서에서 정의한 indexOf 메서드이다.
📒 indexOf(String str, int fromIndex)
- str: 검색할 문자열
- fromIndex: 검색을 시작할 인덱스
✏️ 지정된 문자열이 fromIndex 이후 처음 등장하는 인덱스를 반환하며 문자열이 없을 경우 -1 반환.
마지막으로 Stack으로 푸는 방법도 궁금해서 찾아봤다. 🤔
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int cases = Integer.parseInt(br.readLine());
for (int c = 0; c < cases; c++) {
String s = br.readLine();
Stack<Character> stack = new Stack<>();
int answer = -1;
for (char ch : s.toCharArray()) {
if (ch == '!') {
stack.push(ch);
} else if (ch == '0' || ch == '1') {
answer = ch - '0';
break;
}
}
if (s.substring(s.indexOf(String.valueOf(answer))).contains("!")) {
answer = 1;
}
while (!stack.isEmpty()) {
stack.pop();
answer = 1 - answer; // 반전
}
System.out.println(answer);
}
}
}