와드의 블로그

99클럽 코테 스터디 1일차 TIL 본문

TIL

99클럽 코테 스터디 1일차 TIL

Ward 2024. 10. 28. 12:21

비기너

문제

문자열 내 p와 y의 개수

#문자열

https://school.programmers.co.kr/learn/courses/30/lessons/12916

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

풀이

toLowerCase() 메서드를 이용해서 문자열의 문자를 소문자로 만든다.

문자열을 순차 탐색하며 p의 개수와 y의 개수를 센다.

p의 개수와 y의 개수를 비교하여 리턴한다.

참고

https://ward.tistory.com/191

 

자바 String 메서드 정리

charAt(i)해당 인덱스에 위치한 문자를 반환한다.s.length()문자열의 길이를 반환한다.s1.equals(s2)두 문자열을 비교한 결과를 반환한다.s1.concat(s2)두 문자열을 연결한 문자열을 반환한다.s.substring(i1, i2)

ward.tistory.com

코드

class Solution {
    boolean solution(String s) {
        int cntp = 0, cnty = 0;
        
        for (char c : s.toLowerCase().toCharArray()) {
            if (c == 'p')
                cntp++;
            if (c == 'y')
                cnty++;
        }
        
        return cntp == cnty;
    }
}

미들러

문제

1072번: 게임

# 이분탐색

https://www.acmicpc.net/problem/1072

풀이

최대 게임 수가 10억이므로 순차탐색을 통해 정답을 구하려 하면 시간초과가 발생한다.

1부터 10억 사이에서 승률이 바뀌는 게임 수을 이분탐색을 이용해서 찾는다.

승률을 구하는 과정에서 게임 수에 100을 곱하면 int의 범위를 벗어날 수 있으므로 long으로 계산해줘야 한다.

참고

https://ward.tistory.com/192

 

이분탐색

이분탐색정렬된 배열에서 원하는 값을 O(logn)의 시간복잡도로 찾을 수 있는 알고리즘이다.배열의 중앙에 있는 값을 조사하여 찾고자 하는 값이 배열의 왼쪽 또는 오른쪽에 있는지를 알아내어 탐

ward.tistory.com

코드

import java.util.*;
import java.io.*;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int x = Integer.parseInt(st.nextToken());
		int y = Integer.parseInt(st.nextToken());
		int z = (int) (y * 100L / x);

		int s = 1, e = 1000000000, ans = -1;
		while (s <= e) {
			int m = (s + e) / 2;
			int tmp = (int) ((y + m) * 100L / (x + m));
			if (z < tmp) {
				ans = m;
				e = m - 1;
			} else
				s = m + 1;
		}

		bw.write(ans + "");
		bw.flush();
		bw.close();
	}
}

챌린저

문제

11403번: 경로 찾기

# dfs # 플로이드-워셜

https://www.acmicpc.net/problem/11403

풀이 1

각 정점마다 dfs를 진행하여 연결된 정점을 구한다.

dfs를 시작하는 정점을 시작할 때 방문 처리 하지 않고 다른 정점을 경유해서 왔을 때 방문 처리한다.

참고

https://ward.tistory.com/193

 

그래프 탐색

DFS그래프를 탐색할 때 한 노드에서 다음 분기로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법을 말한다.검색 속도가 BFS에 비해 느리지만 더 간단하게 구현할 수 있다.재귀를 이용하여 구

ward.tistory.com

코드

import java.util.*;
import java.io.*;

public class Main {
	static int n;
	static int[][] adj;
	static int[] visited;

	static void dfs(int x) {
		for (int i = 0; i < n; i++) {
			if (visited[i] == 1 || adj[x][i] == 0)
				continue;
			visited[i] = 1;
			dfs(i);
		}
	}

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		n = Integer.parseInt(br.readLine());
		adj = new int[n][n];

		for (int i = 0; i < n; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			for (int j = 0; j < n; j++)
				adj[i][j] = Integer.parseInt(st.nextToken());
		}

		for (int i = 0; i < n; i++) {
			visited = new int[n];
			dfs(i);
			for (int j = 0; j < n; j++)
				bw.write(visited[j] + " ");
			bw.write("\n");
		}

		bw.flush();
		bw.close();
	}
}

풀이 2

그래프의 각 모든 정점에서의 다른 정점과의 연결성을 체크하는 문제이므로 플로이드-워셜 알고리즘을 응용하여 풀 수 있다.

참고

https://ward.tistory.com/198

 

플로이드-워셜

플로이드-워셜플로이드-워셜 알고리즘은 음의 사이클이 없는 그래프에서 모든 정점에서 모든 정점까지의 최단 거리를 모두 구할 수 있는 알고리즘이다.플로이드-워셜 알고리즘은 다이나믹 프

ward.tistory.com

코드

import java.util.*;
import java.io.*;

public class Main {
	static int n;
	static int[][] adj;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		n = Integer.parseInt(br.readLine());
		adj = new int[n][n];

		for (int i = 0; i < n; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			for (int j = 0; j < n; j++)
				adj[i][j] = Integer.parseInt(st.nextToken());
		}

		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				for (int k = 0; k < n; k++) {
					if (adj[j][i] == 1 && adj[i][k] == 1)
						adj[j][k] = 1;
				}
			}
		}

		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++)
				bw.write(adj[i][j] + " ");
			bw.write("\n");
		}
		bw.flush();
		bw.close();
	}
}

 

'TIL' 카테고리의 다른 글

99클럽 코테 스터디 6일차 TIL  (0) 2024.11.02
99클럽 코테 스터디 5일차 TIL  (0) 2024.11.01
99클럽 코테 스터디 4일차 TIL  (0) 2024.10.31
99클럽 코테 스터디 3일차 TIL  (0) 2024.10.30
99클럽 코테 스터디 2일차 TIL  (0) 2024.10.29