[문제링크]

 

1939번: 중량제한

첫째 줄에 N, M(1≤M≤100,000)이 주어진다. 다음 M개의 줄에는 다리에 대한 정보를 나타내는 세 정수 A, B(1≤A, B≤N), C(1≤C≤1,000,000,000)가 주어진다. 이는 A번 섬과 B번 섬 사이에 중량제한이 C인 다리

www.acmicpc.net

 

0. 다익스트라나 프림에서 사용하는 방식을 사용했다.

 

1. 시작지점의 초기값은 MAX, 나머지 지점의 초기값은 0

 

2. 아직 가보지 못한 지점중, 가장 많은 짐을 지고 갈수있는 지점 X를 탐색한다

 

3. X로부터 갈수있는 지점들을, X를 거치는 경우 / 기존 최댓값을 비교해 갱신한다

 

4. 이를 n번 반복하면, n개의 노드 전체를 탐색한 것이다.

 

5. 종료된 후 end지점에 있는 값이 해당 지점에 들고갈 수 있는 최대 짐 무게이다

 

* 성능 향상법 : n에 비해 m의 크기가 크지 않으므로, 우선순위 큐를 이용해 최대값을 찾는다면 시간 성능이 올라갈 것이다

 

* 다른 풀이법 : 짐의 무게가 N일때, cost가 N 이상인 다리만 사용해서 시작점 - 도착점에 도달할 수 있는 최대 N 구하기

  - N에 대해 bfs를 실행해보며 이분탐색으로 N값을 갱신한다

 

* 문제 태그에 disjoint set이 있던데.. 모르겠다 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main{
	public static void main(String[] args)throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int n = pint(st.nextToken());
		int m = pint(st.nextToken());
		ArrayList<ArrayList<int[]>>graph=new ArrayList<>();
		
		for (int i = 0; i <= n; i++) {
			graph.add(new ArrayList<>());
		}
		for (int i = 0; i < m; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			int n1 = pint(st.nextToken());
			int n2 = pint(st.nextToken());
			int c = pint(st.nextToken());
			graph.get(n1).add(new int[] {n2,c});
			graph.get(n2).add(new int[] {n1,c});
		}

		st = new StringTokenizer(br.readLine(), " ");
		int fst = pint(st.nextToken());
		int end = pint(st.nextToken());
		
		//각 지점까지 도달할 수 있는 최대 무게, 초깃값 0
		int[]weight = new int[n+1];
		boolean[]isV=new boolean[n+1];
		weight[fst]=Integer.MAX_VALUE;
		
		for (int i = 0; i < n; i++) {
			int max=0,maxNode=0;
			for (int j = 0; j <= n; j++) {
				if(!isV[j] && max<weight[j]) {
					max=weight[j];
					maxNode=j;
				}
			}
			
			isV[maxNode]=true;
			
			for (int j = 0; j < graph.get(maxNode).size(); j++) {
				int[]next = graph.get(maxNode).get(j);
				int nextCost=Math.min(next[1], weight[maxNode]);
				
				if(weight[next[0]] <nextCost) {
					weight[next[0]]=nextCost;
				}
			}
		}
		System.out.println(weight[end]);
		
	}
	static int pint(String s) {
		return Integer.parseInt(s);
	}
}

결과 화면

 

'알고리즘 문제 풀이 > BOJ 골드' 카테고리의 다른 글

[백준] 1062 - 가르침  (0) 2021.05.05
[백준] 17404 - RGB거리 2  (0) 2021.05.02
[백준] 10775 - 공항  (0) 2021.05.01
[백준] 16562 - 친구비  (0) 2021.04.28
[백준] 3055 - 탈출  (0) 2021.04.28
[백준] 4195 - 친구 네트워크  (0) 2021.04.28
[백준] 1976 - 여행 가자  (0) 2021.04.28

[문제링크]

 

16562번: 친구비

첫 줄에 학생 수 N (1 ≤ N ≤ 10,000)과 친구관계 수 M (0 ≤ M ≤ 10,000), 가지고 있는 돈 k (1 ≤ k ≤ 10,000,000)가 주어진다. 두번째 줄에 N개의 각각의 학생이 원하는 친구비 Ai가 주어진다. (

www.acmicpc.net

 

0. disjoint set 문제

 

1. 기존에 존재하는 학생들의 관계를 따라 set들을 합친다

 

2. 학생들을 친구비에 따라 정렬한다

 

3. 친구비가 낮은 순서로 친구맺기를 시도한다.

  - 해당 학생이 속한 집합의 root를 구해 이미 친구인 집합인지, 아닌지 판단한다

 

4. 모든 집단과 친구가 된 후, 금액이 k보다 크다면 실패

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

public class Main{
	public static void main(String[] args)throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		n = pint(st.nextToken());
		int m = pint(st.nextToken());
		int k = pint(st.nextToken());
		int[][] cost=new int[n][2];
		boolean[] isFriend=new boolean[n];
		int friendMoney=0;
		
		init();
		st = new StringTokenizer(br.readLine(), " ");
		for (int i = 0; i < n; i++) {
			cost[i][0]=i;
			cost[i][1]=pint(st.nextToken());
		}
		for (int i = 0; i < m; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			int x = pint(st.nextToken())-1;
			int y = pint(st.nextToken())-1;
			mergeGroup(x, y);
		}
		
		Arrays.sort(cost, new Comparator<int[]>() {
			@Override
			public int compare(int[] o1, int[] o2) {
				return o1[1]-o2[1];
			}
		});
		
		for (int i = 0; i < n; i++) {
			int root = getRoot(cost[i][0]);
			if(!isFriend[root]) {
				isFriend[root]=true;
				friendMoney+=cost[i][1];
			}
		}
		if(friendMoney>k)System.out.println("Oh no");
		else System.out.println(friendMoney);
		
	}
	static int n;
	static int[]parents;
	
	static void init() {
		parents=new int[n];
		for (int i = 0; i < n; i++) {
			parents[i]=i;
		}
	}
	
	static int getRoot(int x) {
		if(parents[x]!=x)return parents[x]=getRoot(parents[x]);
		return x;
	}
	
	static void mergeGroup(int x, int y) {
		parents[getRoot(y)]=getRoot(x);
	}
	
	static int pint(String s) {
		return Integer.parseInt(s);
	}
}

결과 화면

'알고리즘 문제 풀이 > BOJ 골드' 카테고리의 다른 글

[백준] 17404 - RGB거리 2  (0) 2021.05.02
[백준] 10775 - 공항  (0) 2021.05.01
[백준] 1939 - 중량제한  (0) 2021.05.01
[백준] 3055 - 탈출  (0) 2021.04.28
[백준] 4195 - 친구 네트워크  (0) 2021.04.28
[백준] 1976 - 여행 가자  (0) 2021.04.28
[백준] 1717 - 집합의 표현  (0) 2021.04.28

[문제링크]

 

3055번: 탈출

사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제

www.acmicpc.net

 

0. 물이 찰 예정인 칸으로 진행할 수 없다 -> 물을 먼저 채우고 고슴도치를 이동시키면 된다

  - 고슴도치는 변수로 적절하지 않으니 대신 뜨또를 변수로 사용하였다.

 

1. 물 한번 - 고슴도치 한번 번갈아가며 빈 칸을 채우는 BFS 실행

  - ans가 갱신된 그 순간이 곧 최소시간이므로 즉시 탈출한다

  - 끝까지 갱신되지 못했다면 정해진 문자열 출력

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main{
	public static void main(String[] args)throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int n = pint(st.nextToken());
		int m = pint(st.nextToken());
		char[][]map=new char[n+2][m+2];
		for (int i = 0; i < m+2; i++) {
			map[0][i]='X';
			map[n+1][i]='X';
		}for (int i = 0; i < n+2; i++) {
			map[i][0]='X';
			map[i][m+1]='X';
		}
		
		Queue<int[]>bieber=new LinkedList<>();
		Queue<int[]>water=new LinkedList<>();
		
		for (int i = 1; i < n+1; i++) {
			String s = br.readLine();
			for (int j = 1; j < m+1; j++) {
				map[i][j]=s.charAt(j-1);
				if(map[i][j]=='S')bieber.offer(new int[] {i,j});
				if(map[i][j]=='*')water.offer(new int[] {i,j});
			}
		}

		int time=0, ans=-1;
		while(!bieber.isEmpty()) {
			time++;
			int len = water.size();
			//1. 물부터 진행,
			for (int i = 0; i < len; i++) {
				int[] cur=water.poll();
				
				for (int j = 0; j < 4; j++) {
					int tx=cur[0]+dx[j], ty=cur[1]+dy[j];
					if(tx<1||tx>n||ty<1||ty>m)continue;
					
					if(map[tx][ty]=='S'||map[tx][ty]=='.') {
						map[tx][ty]='*';
						water.offer(new int[] {tx,ty});
					}
					
				}
			}
			
			//2. 뜨또 진행
			len = bieber.size();
			for (int i = 0; i < len; i++) {
				int[] cur=bieber.poll();

				for (int j = 0; j < 4; j++) {
					int tx=cur[0]+dx[j], ty=cur[1]+dy[j];
					if(tx<1||tx>n||ty<1||ty>m)continue;
					
					if(map[tx][ty]=='.') {
						map[tx][ty]='S';
						bieber.offer(new int[] {tx,ty});
					}
					else if(map[tx][ty]=='D') {
						ans=time;
					}
				}
				
			}
			if(ans!=-1)break;
			
		}
		if(ans==-1)System.out.println("KAKTUS");
		else System.out.println(ans);
	}
	
	static int[]dx = {1,0,-1,0};
	static int[]dy = {0,1,0,-1};
	
	static int pint(String s) {
		return Integer.parseInt(s);
	}
}

결과 화면

 

'알고리즘 문제 풀이 > BOJ 골드' 카테고리의 다른 글

[백준] 10775 - 공항  (0) 2021.05.01
[백준] 1939 - 중량제한  (0) 2021.05.01
[백준] 16562 - 친구비  (0) 2021.04.28
[백준] 4195 - 친구 네트워크  (0) 2021.04.28
[백준] 1976 - 여행 가자  (0) 2021.04.28
[백준] 1717 - 집합의 표현  (0) 2021.04.28
[백준] 9252 - LCS 2  (0) 2021.04.28

[문제링크]

 

4195번: 친구 네트워크

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계의 수 F가 주어지며, 이 값은 100,000을 넘지 않는다. 다음 F개의 줄에는 친구 관계가 생긴 순서대로 주어진

www.acmicpc.net

 

0. disjoint set 문제

 

1. parents 배열 외에도, popul배열을 둬서 배열의 인구수를 관리한다.

 

2. popul배열은 서로 다른 set의 merge시에만, 흡수되는 쪽의 인구를 반대쪽에 누적시킴으로서 계산된다.

 

3. 문자열로 들어오는 사람 이름을 처리하기 위해, HashMap에 index와 함께 저장하였다.

 

4. 새로운 입력마다 두 사람의 set의 merge시도를 하며, 같은 집합일 경우 현재 인구를,

  - 다른 집합일 경우 합친 후 인구를 반환한다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main{
	public static void main(String[] args)throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int tc = pint(br.readLine());
		for (int testcase = 1; testcase <= tc; testcase++) {
			N = pint(br.readLine());
			HashMap<String, Integer>people=new HashMap<>();
			init();
			
			int idx=0;
			for (int i = 0; i < N; i++) {
				StringTokenizer st = new StringTokenizer(br.readLine());
				String fst = st.nextToken();
				String snd = st.nextToken();
				int fidx,sidx;
				if(people.containsKey(fst)) {
					fidx=people.get(fst);
				}else {
					people.put(fst, idx);
					fidx=idx++;
				}
				
				if(people.containsKey(snd)) {
					sidx=people.get(snd);
				}else {
					people.put(snd, idx);
					sidx=idx++;
				}
				sb.append(mergeGroup(fidx, sidx)).append("\n");
			}
			
		}System.out.println(sb);
		
	}
	static int N;
	static int[]parents;
	static int[]popul;
	
	static void init() {
		parents=new int[2*N];
		popul=new int[2*N];
		for (int i = 0; i < parents.length; i++) {
			parents[i]=i;
			popul[i]=1;
		}
	}
	
	static int getRoots(int x) {
		if(parents[x]!=x)return parents[x]=getRoots(parents[x]);
		return x;
	}
	
	static int mergeGroup(int x, int y) {
		int gx = getRoots(x), gy=getRoots(y);
		if(gx==gy)return popul[gx];
		
		parents[gy]=gx;
		popul[gx]+=popul[gy];
		return popul[gx];
	}
	
	static int pint(String s) {
		return Integer.parseInt(s);
	}
}

결과 화면

'알고리즘 문제 풀이 > BOJ 골드' 카테고리의 다른 글

[백준] 1939 - 중량제한  (0) 2021.05.01
[백준] 16562 - 친구비  (0) 2021.04.28
[백준] 3055 - 탈출  (0) 2021.04.28
[백준] 1976 - 여행 가자  (0) 2021.04.28
[백준] 1717 - 집합의 표현  (0) 2021.04.28
[백준] 9252 - LCS 2  (0) 2021.04.28
[백준] 1644 - 소수의 연속합  (0) 2021.04.22

[문제링크]

 

1976번: 여행 가자

동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인

www.acmicpc.net

 

0. 1717번 문제처럼 disjoint set의 이용 (2021.04.28 - [백준/골드] - [백준] 1717 - 집합의 표현)

 

1. 모든 연결된 x,y쌍에 대해 그 집합을 합쳐준다

 

2. 모든 방문할 node들에 대해 같은 집합에 속하는지 확인한다

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args)throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		N = pint(br.readLine());
		M = pint(br.readLine());
		init();
		for (int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			for (int j = 0; j < N; j++) {
				int x = pint(st.nextToken());
				if(x==1) {
					mergeGroup(i,j);
				}
			}
		}
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		int root = getRoot(pint(st.nextToken())-1);
		boolean possible=true;
		for (int i = 1; i < M; i++) {
			if( root != getRoot( pint(st.nextToken())-1 ) )possible=false;
		}
		System.out.println(possible?"YES":"NO");
		
	}
	static int N,M;
	static int[]parents;
	
	static void init() {
		parents=new int[N];
		for (int i = 0; i < N; i++) {
			parents[i]=i;
		}
	}

	static int getRoot(int x) {
		if(parents[x]!=x)return parents[x]=getRoot(parents[x]);
		else return x;
	}
	
	static void mergeGroup(int x, int y) {
		parents[getRoot(y)]=getRoot(x);
	}
	
	static boolean isSameGroup(int x, int y) {
		return getRoot(x)==getRoot(y);
	}
	
	static int pint(String s) {
		return Integer.parseInt(s);
	}
}

결과 화면

'알고리즘 문제 풀이 > BOJ 골드' 카테고리의 다른 글

[백준] 16562 - 친구비  (0) 2021.04.28
[백준] 3055 - 탈출  (0) 2021.04.28
[백준] 4195 - 친구 네트워크  (0) 2021.04.28
[백준] 1717 - 집합의 표현  (0) 2021.04.28
[백준] 9252 - LCS 2  (0) 2021.04.28
[백준] 1644 - 소수의 연속합  (0) 2021.04.22
[백준] 1937 - 욕심쟁이 판다  (0) 2021.04.22

 

[문제링크]

 

1717번: 집합의 표현

첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는

www.acmicpc.net

 

0. parents[i] : i번째 노드 부모 노드를 가리킨다

 

1. init함수 : 자기 자신을 부모로 설정, 즉 원소 1개짜리의 집합을 n+1개 생성한다

 

2. getRoot함수 : 자기 자신이 부모일때까지 부모를 따라간다. 즉, 해당 원소가 속한 집합의 root를 구한다

 

3. mergeGroup함수 : 양 집합의 부모를 구해서, 한쪽의 부모를 상대방으로 변경한다

 

4. isSameGroup : 양 집합의 부모를 비교한다

 

5. init로 초기화 해준 후, 입력값에 맞춰 함수만 부르면 끝

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args)throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		n = pint(st.nextToken());
		m = pint(st.nextToken());
		init();
		int oper,n1,n2;
		for (int i = 0; i < m; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			oper = pint(st.nextToken());
			n1 = pint(st.nextToken());
			n2 = pint(st.nextToken());
			
			if(oper==0) {
				mergeGroup(n1, n2);
			}else {
				sb.append(isSameGroup(n1, n2)).append("\n");
			}
		}System.out.println(sb);
	}
	
	static int[]parents;
	static int n,m;
	
	static void init() {
		parents=new int[n+1];
		for (int i = 0; i < n+1; i++) {
			parents[i]=i;
		}
	}
	
	static int getRoot(int x) {
		if(parents[x]!=x)return parents[x]=getRoot(parents[x]);
		else return x;
	}
	
	static void mergeGroup(int x, int y) {
		parents[getRoot(y)]=getRoot(x);
	}
	
	static String isSameGroup(int x, int y) {
		return getRoot(x)==getRoot(y)?"YES":"NO";
	}
	
	static int pint(String s) {
		return Integer.parseInt(s);
	}
}

결과 화면

'알고리즘 문제 풀이 > BOJ 골드' 카테고리의 다른 글

[백준] 3055 - 탈출  (0) 2021.04.28
[백준] 4195 - 친구 네트워크  (0) 2021.04.28
[백준] 1976 - 여행 가자  (0) 2021.04.28
[백준] 9252 - LCS 2  (0) 2021.04.28
[백준] 1644 - 소수의 연속합  (0) 2021.04.22
[백준] 1937 - 욕심쟁이 판다  (0) 2021.04.22
[백준] 1865 - 웜홀  (0) 2021.04.22

[문제링크]

 

9252번: LCS 2

LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

www.acmicpc.net

0. 기본 LCS 알고리즘 : 문자열 A와 B의 끝 문자가 x로 같다면, LCS의 길이는 A'와 B'의 LCS + 1 이다

  - 여기서 A', B'이란 맨 끝문자를 제외한 A, B

  - A = A'+x, B = B'+x

  - A와 B의 끝 문자가 x,y로 다르다면, LCS의 길이는 A'와 B의 LCS, A와 B'의 LCS 둘 중 큰 쪽이다

  - A = A'+x, B = B'+y

 

1. 위 과정을 DP로 계산하면서 모든 계산 결과를 저장한다

 

2. LCS문자열 찾기 : DP를 역으로 추적한다

  - DP[x][y]의 값이 DP[x][y-1]와 같다면 : 해당 칸으로부터 온 값, y--

  - DP[x][y]의 값이 DP[x-1][y]와 같다면 : 해당 칸으로부터 온 값, x--

  - 둘 다 아니라면 : LCS로서 진행된 칸, x--, y--, 해당 위치의 문자를 저장

 

3. 역순으로 찾았으므로, 뒤집어서 출력해준다

 

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main{
	public static void main(String[] args)throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		String fst = br.readLine();
		String snd = br.readLine();
		
		int len = fst.length();
		int sndLen = snd.length();
		
		int[][]dp = new int[len+1][sndLen+1];
		
		for (int i = 0; i < len; i++) {
			char f = fst.charAt(i);
			for (int j = 0; j < sndLen; j++) {
				char s= snd.charAt(j);
				
				if(s==f) {
					dp[i+1][j+1] = 1 + dp[i][j];
				}
				else {
					dp[i+1][j+1] = Math.max(dp[i][j+1], dp[i+1][j]);
				}
			}
		}
		
		int x = len, y=sndLen;
		while(sb.length()!=dp[len][sndLen]) {
			if(dp[x][y]==dp[x][y-1]) {
				y--;
			}else if(dp[x][y]==dp[x-1][y]) {
				x--;
			}else {
				x--;y--;
				sb.append(fst.charAt(x));
			}
		}
		
		System.out.println(dp[len][sndLen]);
		System.out.println(sb.reverse());
		
	}
	static int pint(String s) {
		return Integer.parseInt(s);
	}
}

결과 화면

1. 프로필 페이지 크롤링

 

  우선 그랑블루 프로필 페이지의 규칙을 살펴봐야 한다.

부계정 no.4

  위 사진처럼 모든 계정들은 ID라는 고유번호를 가진다.

  반드시 8자리인건 아니고, 계정 생성에 따라 증가하는 번호이다.(이유는 모르겠으나 정확히 1씩 증가하지는 않는다)

 

프로필 주소

  그리고 프로필페이지 주소는 보다시피 /#profile/고유번호 로 접근 가능하다.

  

  그럼 간단하게 url로 요청을 보내서, html 문서를 얻고, 이름/랭크 등 필요한 정보를 id/class/tag로 추출하면 끝나는거 아닌가? 와 프로젝트 끝!

 

간단!

  그렇게 생각하고 아주 간단한 테스트 페이지를 만들어 보았다.

명료!

  버튼을 누르면 하드코딩된 URL로 프로필 페이지 연결, HTML정보를 얻고 txt-group1이라는 class를 찾아 class명을 출력하는 테스트이다.(txt-group1이란 위에서 언급한 계정 고유 ID이다)

  Jsoup은 HTML문서의 파싱이 가능하게 해주는 라이브러리이다.

행복회로(불탐)

  그렇게 쉬울리가 없었다.

 

게임엔 로딩이 있다.

  왜 Null이 잡혔는가..하니 페이지 전환 사이의 로딩화면이 문제였다.

  게임이니만큼 데이터 로딩은 필요한데, 데이터 로딩 중엔 로딩창을 띄워주고, 데이터 로딩이 완료되면 해당하는 페이지를 보여주도록 되있는 듯 했다.

  그리고 Jsoup는 connect하자마자 받은 그 로딩창의 html을 좋다고 받아왔고, 로딩창에서 있지도 않은 데이터를 찾으려 하니 당연히 Null을 뱉은것.

 

  그러면 Jsoup을 잘 조작해서 로딩 이후의 페이지를 받아올 수 있는가? 구글신에게 문의해 보도록 하자

  JSoup는 그냥 HTML만 받아올 뿐, 어림도 없는 소리였다.

 

 

2. 셀레니움 설치

 

  하지만 착한 스택-오버플로우 사람들이 다른 방법을 남겨 주었다 (링크)

  selenium이라는 라이브러리로 동적으로 추가되는 요소들에도 접근 가능하다는 것.

  정확히는 요소 상태를 감시하다 등장한 이후에 페이지를 긁으면 된다고 한다.

 

  그렇게 셀레니움 설치부터 다시 시작하게 되었다

 

  블로그 글이 죄다 add external jar로 추가하던데, 프로젝트 그대로 다른 환경에서도 돌려보고 싶으므로 내부에 직접 추가했다. 8Mb정도는..괜찮지 않을까?

 

셀레니움 init

  사용하기 위한 크로미움 드라이버 또한 현재 크롬 버전에 맞춰 설치했다 (링크)

목표 elements가 보일 때까지 대기하는 코드(상상도)

  그렇게 실행해 본 결과

짜잔

  셀레니움은 새로운 브라우저를 키는것처럼 작동하는 방식이라는 걸 알게되었고,

  이 브라우저는 시크릿모드와 같아 로그인 세션같은건 하나도 남아있지 않다는 걸 알게되었다.

 

  그럼 그 로그인부터 하면 되지 않을까?

캡챠

  

  오늘의 2번째 어림도 없는 소리였다.

 

  캡챠를 프로그램으로 뚫을수 있는 방법이 있나....?

  아무튼 오늘은 머리아파졌으므로 그만하기로 했다.

+ Recent posts