알고리즘 풀이/백준(BOJ) 20

[JAVA/백준2606] 바이러스

문제 신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다. 예를 들어 7대의 컴퓨터가 과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다. 어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수..

[JAVA/백준15685] 드래곤 커브

문제 드래곤 커브는 다음과 같은 세 가지 속성으로 이루어져 있으며, 이차원 좌표 평면 위에서 정의된다. 좌표 평면의 x축은 → 방향, y축은 ↓ 방향이다. 시작 점 시작 방향 세대 0세대 드래곤 커브는 아래 그림과 같은 길이가 1인 선분이다. 아래 그림은 (0, 0)에서 시작하고, 시작 방향은 오른쪽인 0세대 드래곤 커브이다. 1세대 드래곤 커브는 0세대 드래곤 커브를 끝 점을 기준으로 시계 방향으로 90도 회전시킨 다음 0세대 드래곤 커브의 끝 점에 붙인 것이다. 끝 점이란 시작 점에서 선분을 타고 이동했을 때, 가장 먼 거리에 있는 점을 의미한다. 2세대 드래곤 커브도 1세대를 만든 방법을 이용해서 만들 수 있다. (파란색 선분은 새로 추가된 선분을 나타낸다) 3세대 드래곤 커브도 2세대 드래곤 커브..

[JAVA/백준1110] 더하기 사이클

1. 문제 2. 풀이 사이클의 횟수를 구하는 getCycle()을 호출하는데 여기서 원래 수로 돌아올 때 까지 연산이 반복되므로 각각의 조건에 나누어 재귀로 함수를 호출하고 사이클의 횟수를 저장하는 변수count의 값을 하나씩 증가해주었다. 연산은 정수n이 주어졌을때 10의 자리수와 1의 자리수를 더해준 후, 원래 n의 오른쪽 자리 수와 이어붙어주어야 하므로 string클래스의 내장 함수를 사용하는것이 편할것 같다는 생각이 들어서 문자열로 입력받았다. n이 00일 경우 ~ 1번만 연산을 해주면 되므로 바로 리턴 n이 0~9일 경우 ~ 예를 들어 n=9일 때, 09→0+9=09이므로 이어 붙이면 다음 n은 99가 된다. 즉, n을 두번 이어 붙이면 된다. n이 두자리 수인 경우 ~ 변수tmp에 n의 각 자..

[JAVA/백준9012] 괄호 - 스택

문제 풀이 테스트케이스만큼 문자열을 입력받는데, 이때 한번 입력받을때 괄호검사를 하는 함수를 호출한다. 괄호검사를 하는 함수 isCorrect()는 호출될때마다 스택을 새로 생성한다. 문자열의 길이만큼 검사를 해주는데, 이때 스택이 비었을 경우에는 문자열의 i번째 문자를 스택에 넣어준다. 스택이 비어있지 않으면 스택의 가장 위(peek())와 i번째 문자를 비교해준다. 이때 주의할점은 처음에 단순히 (와 ), 또는 )와 (처럼 괄호가 같지 않으면 pop이 되도록 해주었는데 괄호가 닫히는 모양은 스택의 top은 항상 '('이어야 하고 스택에 넣을 문자는 항상 ')'이어야 한다. 이점만 유의하고, 스택클래스를 사용한적이 있다면 삽질하지 않고 빠르게 풀 수 있을 문제였다 ㅠㅠ 소스코드 import java.u..

[JAVA/백준1003] 피보나치 함수 DP

1. 문제 2. 풀이 위 문제는 DP를 사용하지 않고 풀면 시간초과가 발생한다. 그래서 처음에는 메모이제이션으로 구현하려고 했지만, 예를 들어 이미 계산되어 메모제이션 배열에 저장되어 있는 경우에 0과 1을 어떻게 출력해야할지 고민하는데 시간이 많이 걸려서 결국 구글링을 해서 점화식을 세워 해결하였다. 점화식은 n=1일때부터 0과 1이 몇번 출력되는지를 세워보면 규칙을 찾아낼 수가 있다. n 0호출 1호출 0 1 0 1 0 1 2 1 1 3 1 2 4 2 3 n이 행(i)이고 0호출했을때와 1호출했을때를 열(j)이라고 하여 점화식을 세우면 다음과 같다. f[i][j] = f[i-2][j] + f[i-1][j] i=0, i=1인 경우에는 미리 초기화해둔다. 3. 소스코드 import java.util.Sc..

[JAVA/백준10828] 스택

1. 문제 2. 풀이 자바 Collections클래스를 사용하여 스택을 구현하였다. 명령어 push 3은 문자열 push,공백,숫자 로 이루어진 문자열이므로 명령을 입력했을때 공백이 있을 경우, push명령을 처리하도록 해주었고 다른 명령어들은 switch문을 사용하였다. 이 때, stack.empty()에서 기본으로 제공하는 것은 true, false인데 문제에서 요구하는 것은 1,0이므로 함수를 수정해주었다. 스택의 기본 개념만 이해한다면 쉽게 풀 수 있는 문제였다. 3. 소스코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Stack; public class Main { public static v..

[JAVA/백준1924] 2007년

문제 문제풀이 월, 날짜를 입력 받고 1월 1일로부터 얼마나 지났는지 일수를 더한 후 현재 날짜를 더해준다. 그리고 7을 나눈 나머지값으로 미리 생성해둔 요일 배열에서 현재 요일이 무엇인지를 알 수 있다. 소스코드 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Scanner; import java.util.StringTokenizer; public class Main { public static StringTokenizer st; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(ne..