Algorithm 171

[BOJ] 6987. 월드컵

처음에 보고 아이디어를 떠올리기 상당히 어려웠던 문제이다. 이 문제에서 전체 경우의 수를 따져본다면 전체 6팀이 경기를 하기때문에 총 15경기가 열리고, 경기마다 승,무,패 의 경우가 있기에 전체 3^15가지의 경우가 생기게 된다. 그러므로 백트래킹을 사용하여 승무패를 계속 재귀적으로 호출하면서 전체경우의 수랑 현재 테이블이랑 같아지는지 확인하여 구할수 있다. 백트래킹 문제라 전혀 생각지 못한 문제였다. 문제를 깊이 생각할 필요가 있다고 느꼈다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52..

Algorithm 2020.05.06

[BOJ] 2606. 바이러스

유니온파인드 내지는 DFS를 이용하여 1과 연결된 것을 찾는 문제이다. 첫번째로 유니온파인드로 구현해보았다. 이문제에서 유니온파인드를 사용하면서 두가지 주의할점을 찾았다. 첫째, 경로의 최적화를 하기위해 find함수에서 return find(p[num]);대신 return p[num]=find(p[num]);을 사용해주었다. 둘째로 마지막에 모든 정점에 대하여 find함수를 한번씩 실행시켜줘서 부모를 저장하고있는 p배열을 갱신해주는 작업을 하였다. 이 작업은 필수적으로 해야하는 작업인데 놓치기 쉬움으로 항상 습관적으로 해야한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ..

Algorithm 2020.05.06

[Programmers] 호텔 방 배정

이 문제는 간단해 보이나 효율성을 통과하기 어려운 문제이다. 일반적인 풀이방법으로는 정확성은 통과할 수 있지만 유니온파인드 알고리즘을 사용하지 않는다면 효율성을 통과하기 어렵다. 또한, 유니온 파인드라는 것을 사용한다 하더라도 K값이 상당히 큼(10^12)으로 일차원 배열을 사용하기 어렵다. 따라서 필요한 것에 대해서만 HashMap의 형태로 유니온파인드를 사용해야한다. 이 문제는 다음과 같은 로직을 적용하였다. 1. room_number의 수를 전체 하나씩 보기 2-1. 수가 hashMap에 존재하지 않는 key이거나 (수,수) 의 형태로 존재한다면 현재 key를 배정 2-2. 그렇지 않다면 find(map.get(key))를 하여 새로운 방을 배정 3. 마지막으로 현재수와 현재수+1을 union 아이..

Algorithm 2020.05.05

[BOJ] 16998. Baaaaaaaaaduk2 (Easy)

조합과 BFS가 합쳐진 문제이다. 이 문제는 바둑판에서 0이 되는 곳의 위치 2개를 뽑는 조합을 사용한다음, 1로 둘러쌓인 2의 최대 갯수를 구하는 BFS문제이다. 이 문제에 주의할점은 2가 테두리 혹은 1로 만 둘러쌓여야 하는데 이과정에서 나는 flag변수 possible을 하나 선언하여 0이랑 인접해있으면 count를 할수 없게 처리하였다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 ..

Algorithm 2020.05.03

[Programmers] 징검다리 건너기

정확성과 효율성을 같이 보는 문제이다. 이 문제를 요구조건 그대로 구현한다면 어렵지 않게 풀수있고, 정확성부분에선 전부다 맞칠 수 있다. 하지만 효율성 부분에 있어선 시간초과가 나기 쉽다. 이 문제 같은 경우는 효율성을 위해선 알고리즘 기법을 사용해야하는데 나는 파라메트릭 서치 를 사용하였다. 파라메트릭 서치란 다음과 같다. 파라메트릭 서치 : 최적화 문제를 결정 문제로 바꾸어 푸는 것. left, right, mid 값을 사용하여 특정값을 찾는 이분탐색과 상당히 유사하며 logN의 시간복잡도를 가짐. 이분 탐색과의 차이점은 결정문제인지 아닌지의 차이. 문제로 다시 돌아가서 제한사항을 본다면 지나가는 친구들의 수는 무한이라고 주어졌다. 하지만 생각해보면 배열의 최소수인 200,000,000까지 친구들이 ..

Algorithm 2020.05.03

[BOJ] 14502. 연구소

구현할 것이 상당히 많은 문제였다. 기본적으로 벽이 갈수 있는 위치 3군대를 찾는 과정을 거치고 벽을 셋팅후 BFS하여 모든 0의 갯수를 세어주는 과정을 찾는 문제였다. 조합과 BFS를 연속하여 구현하기 때문에 빼먹을수 있는 부분이 많은 문제이므로 꼼꼼하게 함수로 나누어 코딩하는게 중요한 문제였다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80..

Algorithm 2020.05.02

[BOJ] 15686. 치킨 배달

이 문제는 조합을 사용하여 간단히 풀수있는 문제이다. (전체치킨집수)C(제한된치킨집수) 와 같은 조합식을 세우고 이대로 접근하여 풀고 그 상황에서의 치킨거리의 최솟값을 구하면 쉽게 풀 수 있는 문제이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 package boj; impo..

Algorithm 2020.05.02

[SWEA] 4366. 정식이의 은행업무

문자열을 가지고 변환시키면서 모든경우를 다해보는 문제이다. 이 문제는 문자열을 가지고 진법변환을 해주고 HashMap을 사용하는 문제였다. 다만 주의할점은 문자열을 건드는 작업을 할때는 String 클래스를 이용하는 것보다 StringBuilder클래스를 이용해주는 것이 훨씬 시간적으로 이득이라는 점이다. 또한 문자열의 문자를 치환할때 StringBuilder 클래스의 setCharAt()함수를 이용해주면 이문제를 쉽게 풀수있다. 진법변환에 대해선 10진수를 다른 진수로 바꾸려면 Integer.pasrseInt(Num,N진법수) 와 같은 형태로 바꿀수 있지만 다른진수에서 10진수의 형태로 바꾸려면 직접해주는게 편할 수 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18..

Algorithm 2020.05.02

[SWEA] 1949. 등산로 조성

이차원 행렬상에서 특정조건의 최장길이를 구하는 문제이다. 최장길이를 구하는 문제는 DFS와 백트래킹으로 풀면 쉽게 풀 수 있다. 맨처음 이문제를 접근하였을 때 BFS와 3차원 visit배열로 접근하였다. 이 방법으로도 풀리긴 하지만 DFS와 2차원 visit 배열의 백트래킹을 사용하면 훨씬 간결한 코드를 얻을 수 있다. 이 문제에선 주의할점이 두가지 있는데, 첫째 산을 깎을수 있다는 점과 둘째 깎을때 꼭 K만큼이 아니라 K이하 만큼 깎을수 있다는 점이다. 두가지를 유념하여 DFS를 한다면 쉽게 풀수 있었던 문제이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 3..

Algorithm 2020.05.02

[BOJ] 17281.⚾

구현이 중요한 문제다. 문제에 주어진 그대로 구현을 하는 문제이다. 구현은 까다롭지 않지만 다만 여기서 주의할점은 타자의 순서인데, 이 문제에선 1번선수가 4번타자를 맡게 되므로 나머지 8명의 선수를 이용하여 순열을 하고 그때 그때마다 게임을 진행하는 식으로 하였다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86..

Algorithm 2020.05.01