기나 긴 연휴와 기대만빵이던 대만여행도 끝나버렸다. 이제 쉴만큼 쉬었으니 공부 다시 시작! 퇴근하고 평일에는 쪼금밖에 못하지 않을까나
지금 내가 공부하고 있는 곳은 ➡️ SWEA https://swexpertacademy.com/main/code/problem/problemList.do
1217. 거듭제곱 (D3)
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14dUIaAAUCFAYD
static int a, b;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for(int i=0; i<10; i++) {
int n = sc.nextInt();
a = sc.nextInt();
b = sc.nextInt();
System.out.printf("#%d %d\n", n, pow(a, b, 1));
}
}
static int pow(int a, int b, int i) {
if(i==b) {
return a;
} else {
i++;
return a*pow(a, b, i++);
}
}
안그래도 연휴 전 백준에서 재귀 문제들 풀었었던 덕에 금방 풀었던 문제. 유형별로 연습하는게 확실히 도움이 되는 듯
1218. 괄호 짝짓기 (D4)
일단 테스트케이스 10개중 9개만 통과한 틀린 풀이
static ArrayList<String> pairs;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int ans;
for(int tc=1; tc<=10; tc++) {
int n = sc.nextInt();
String[] s = sc.next().split("");
pairs=new ArrayList<String>();
int idx;
for(int i=0; i<s.length; i++) {
if(s[i].equals("(") || s[i].equals("[") || s[i].equals("{") || s[i].equals("<")) {
pairs.add(s[i]);
} else if(s[i].equals(")")) {
idx = pairs.indexOf("(");
if(idx!=-1) pairs.remove(idx);
} else if(s[i].equals("]")) {
idx = pairs.indexOf("[");
if(idx!=-1) pairs.remove(idx);
} else if(s[i].equals("}")) {
idx = pairs.indexOf("{");
if(idx!=-1) pairs.remove(idx);
} else if(s[i].equals(">")) {
idx = pairs.indexOf("<");
if(idx!=-1) pairs.remove(idx);
}
}
ans = pairs.size()>0 ? 0 : 1;
System.out.printf("#%d %d\n", tc, ans);
}
}
이렇게 냅다 빡구현으로 풀어도 되나 싶게 풀었다. 첨엔 짝지은 괄호들을 이중배열로 저장하고 이랬는데 경우가 몇개 없어서 그냥 조건문 나열함
뭐가 틀렸나 다시 살펴보니 테스트케이스 6번이 틀렸다.
138
{[<(({[{(({[(({{{]{<[([[({[[[[<>]]]{}]{}})]]()<>{}{}<>()<>)()<>{}[]<>]>{}})<>()<><><>}{}}}())){}]}))}()<>()[]{}]})<><><><>)>[][][]]}<>[]{}
#6 0 (틀린 코드의 경우 1 나옴)
난 그냥 괄호 쌍의 수만 맞으면 1 로 출력하도록 짰는데, 문제는 괄호 열고 닫힘이 수식처럼 맞아야했던 것이었다.
예를 들어 입력값이 아래와 같은 경우
(<)>
단순히 괄호 수로 보면 짝이 맞지만
()<> 또는 (<>)
위와 같이 주어져야 짝이 맞음으로 1이 아니라 0이 답이 된다. 어쩐지 스택을 써야할거같더라니,,
결국 스택을 써서 풀었고 바로 통과
static String[][] brackets = {{"(",")"}, {"[","]"}, {"{","}"}, {"<",">"}};
static Stack<String> stack;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int ans;
for(int tc=1; tc<=10; tc++) {
int _ = sc.nextInt();
String[] s = sc.next().split("");
stack=new Stack<String>();
ans = checkPairs(s, stack);
System.out.printf("#%d %d\n", tc, ans);
}
}
static int checkPairs(String[] s, Stack<String> stack) {
String top;
for(int i=0; i<s.length; i++) {
for(int j=0; j<4; j++) {
if(s[i].equals(brackets[j][0])) {
stack.push(s[i]);
}
else if(s[i].equals(brackets[j][1])) {
top = stack.peek();
if(top.equals(brackets[j][0])) stack.pop();
else return 0;
}
}
}
return 1;
}
훨씬 코드가 깔끔해진 느낌
스택(Stack)은 한쪽 끝에서만 넣고 뺄 수 있는 선형 자료구조로 '후입선출(Last In First Out)'
큐(Queue)의 경우 '선입선출(First In First Out)'
자바 자료형 Stack 필요한 메서드만 살짝 맛보기
push() // 추가
pop() // 가장 마지막 요소 제거 및 반환
peek() // 가장 마지막 요소 반환만
1219. 길찾기 (D4) https://swexpertacademy.com/main/code/problem/problemDetail.do
이 문제까지 풀고 자고싶었지만,, 그래프인지 이진탐색인지 시작하면 잠 못잘거같아서 깔끔하게 내일로,,,, 내일 꼭 풀거임
++(24.09.29) 밀리고 밀려 드디어 푸는 4일차 마지막 문제
그래프 탐색으로 풀까 고민하다 재귀로도 어떻게 되지 않을까 생각했는데.. 오랜만에 다시 시작하는데 첫문제부터 오래 끌고싶지 않아 구글링때림
참고한 블로그 https://hanyeop.tistory.com/340
static int[] graph1;
static int[] graph2;
static int ans;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for(int tc=0; tc<10; tc++) {
String[] l1 = sc.nextLine().split(" ");
int n1 = Integer.parseInt(l1[0]); // test case
int n2 = Integer.parseInt(l1[1]); // n
ans=0;
graph1=new int[100];
graph2=new int[100];
String s = sc.nextLine();
String[] nodes = s.split(" ");
for(int i=0; i<nodes.length/2;i++) {
int key = Integer.parseInt(nodes[i*2]);
int value = Integer.parseInt(nodes[i*2+1]);
if(graph1[key]==0) graph1[key]=value;
else graph2[key]=value;
}
searchGraph(graph1[0]);
searchGraph(graph2[0]);
System.out.printf("#%d %d\n", n1, ans);
}
}
static void searchGraph(int x) {
if(x==0) {
return ;
}
if(x==99) {
ans=1;
return ;
}
searchGraph(graph1[x]);
searchGraph(graph2[x]);
}
이 문제는 다른거보다 입력값 처리해서 문제의 배열대로 만드는데 오래걸렸다.
BuffredReader 보다 간편한 Scanner를 선호하는데, 맨날 int값 하나씩 받다 공백 포함된 문자열 받으려하니 개행문자때매 시간 좀 보냈다.
참고한 블로그2 https://ontheway.tistory.com/65
헷갈렸던 부분만 정리하자만,
nextLine()은 개행무자를 포함하여 한줄 단위로 입력을 받고
next()는 개행문자를 무시하고 입력을 받는다.
나는 첫번째 줄은 next()로 입력받고 두번째 줄을 한 줄 통으로 nextLine()으로 입력받고자 하였는데, 이런 경우 첫번째 줄에서 개행문자가 포함이 안되기 때문에 nextLine()시 두 번째 줄이 아닌 '\n'이 입력받게 된다.
고로 한줄씩 입력받고 싶으면 모두 nextLine()으로 처리하던가, 중간에 개행문자를 한번 스캐너로 처리해줄 것!
아 코테 공부하기 싫다 ~
[1일1커밋 9D] 유형별 풀이(2) 이진탐색 대충 끝 | 백준 JAVA 1654, 2805, 2110 (1) | 2024.10.01 |
---|---|
[1일1커밋 8D] 아자아자 | 유형별 풀이(2) 이진탐색 ing | 백준 JAVA 1920, 10816 (0) | 2024.09.29 |
[1일1커밋 6D] 재귀 푸는 중.. | 백준 JAVA 27433, 10870, 25501 (1) | 2024.09.08 |
[1일1커밋 5D] LeetCode SQL & 백준 JAVA 10431, 8979, 7568, 4659 (1) | 2024.09.06 |
[1일1커밋 4D] LeetCode SQL & 백준 JAVA 11723, 9655 (비트 뭐시기와 DP) (2) | 2024.09.06 |
댓글 영역