상세 컨텐츠

본문 제목

[1일1커밋 7D] 연휴 끝! 다시 시작하는 1일1커밋 챌린지 | SWEA S/W 문제해결 기본 4일차

취준/2. 코딩테스트

by ranlan 2024. 9. 23. 21:28

본문

728x90

기나 긴 연휴와 기대만빵이던 대만여행도 끝나버렸다. 이제 쉴만큼 쉬었으니 공부 다시 시작! 퇴근하고 평일에는 쪼금밖에 못하지 않을까나

 

지금 내가 공부하고 있는 곳은 ➡️ SWEA https://swexpertacademy.com/main/code/problem/problemList.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


 

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)

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14eWb6AAkCFAYD&categoryId=AV14eWb6AAkCFAYD#

일단 테스트케이스 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

 

[SWEA] 1219. 길찾기 (Java)

문제 SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 풀이 0. 문제해석 깊이우선탐색을 이용하여 한 도시를 지날때마다 두방향으로 탐색

hanyeop.tistory.com

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

 

[Java] 화면에서 입력 받기 : 스캐너(Scanner)

자바에서 화면으로부터 입력을 받아오는 방법은 정말 다양합니다. 그 중에서 가장 기본적이고 보편적인 방법이 Scanner 클래스를 이용한 방법입니다. Scanner가 보편적으로 쓰이는 이유와 Scanner의

ontheway.tistory.com

헷갈렸던 부분만 정리하자만,

nextLine()은 개행무자를 포함하여 한줄 단위로 입력을 받고
next()는 개행문자를 무시하고 입력을 받는다.

 

나는 첫번째 줄은 next()로 입력받고 두번째 줄을 한 줄 통으로 nextLine()으로 입력받고자 하였는데, 이런 경우 첫번째 줄에서 개행문자가 포함이 안되기 때문에 nextLine()시 두 번째 줄이 아닌 '\n'이 입력받게 된다.

고로 한줄씩 입력받고 싶으면 모두 nextLine()으로 처리하던가, 중간에 개행문자를 한번 스캐너로 처리해줄 것!

 

아 코테 공부하기 싫다 ~

 

728x90

관련글 더보기

댓글 영역