본문 바로가기

나는 오늘,

(371)
[BOJ] 2151. 거울설치 + TC *거울이 [\] [/] 이 두 방향으로 있다고 생각하고 풀어야 한다. 처음에는 45도이기 때문에 [/] 만 생각하고 풀었다가 아니라는 것을 알게 됐다. *처음 [#] 좌표에서 출발해서 4방향 모두 큐에 넣는다. *각 방향으로 한 칸 앞으로 전진한 좌표가 거울이면 방향을 바꾸어서 큐에 넣고, 방향을 바꾸지 않는 상태로도 큐에 넣는다. 이 좌표에 거울을 설치하지 않는 경우도 생각한다. 3 ... *!# #!! 이 예시를 보면 (1, 3)에서 출발해서 (3,1)로 가야하는데 남쪽 방향으로 (3,3)의 거울로 간 후, 방향을 한 번 바꾸면 바로 (3,1)에 접근가능하다. #include #include #include #include #include #define INF 987654321 using namesp..
[BOJ] 9376. 탈옥 *세 지점에서 bfs를 실행한다. 상근이(0,0) / 죄수 2명 *상근이는 건물 밖을 마음대로 나다닐 수 있기 때문에 맵의 크기를 0,0~h+1, w+1으로 잡아줘야 한다. *상근이를 포함한 각 죄수들이 건물 밖으로 향하는데 여는 문의 개수를 dist[][]에 저장한다. *각 죄수들이 문을 열고 나가도록 코드를 작성하지만 실제로는 상근이가 두 죄수를 데리고 가기 때문에 세 명 다 문을 열 수 있는 가능성을 없애줘야 한다. (정답으로 요구한 것은 최소값이기 때문에) #include #include #include #include #include /* BOJ 9476.탈옥 */ using namespace std; int h, w; char map[102][102]; typedef pair pp; typed..
[BOJ] 12094. 2048(Hard) *2048(easy)와 풀이단계는 비슷하지만, 가지치기를 해줘야 한다. (최대 횟수가 2배로 늘었기 때문에) -가지치기 1) 변경된 맵이 변경되기 이전의 맵과 동일한 경우 -> 이 방향으로는 더 이상 나아가지 않는다. 2) 맵에서 최대값을 찾을때, 최대값은 2승씩 커진다. (cnt==10 이라면 가장 최대값은 1024가 될 것이다. ) 이 특징을 이용해서 현재 depth에서 최대값에 도달할 수 있는 지 확인한다. (즉, 한 번 10번까지 변경된 맵에서 최대값을 추출한 후 maxBlock[10] = 1024 / maxBlock[9] = 512 .... 이런 식으로 미리 저장을 해 놓는다.) *실제 최대값은 1024가 아닐 수 있다. 3) 현재 맵에서 구한 최대값이 현재 depth(==cnt)에서 나와야 하..
[BOJ] 16638. 괄호 추가하기2 *괄호 추가하기1에서 연산자 우선순위만 추가 (계산 단계 하나만 추가됐다) *숫자 자리수를 계산하기 번거로와서 string으로 처리함 2019/10/08 - [BOJ/C++] - [BOJ] 괄호추가하기 [BOJ] 괄호추가하기 문제 길이가 N인 수식이 있다. 수식은 0보다 크거나 같고, 9보다 작거나 같은 정수와 연산자(+, -, ×)로 이루어져 있다. 연산자 우선순위는 모두 동일하기 때문에, 수식을 계산할 때는 왼쪽에서부터 순서대.. jayrightthere.tistory.com *단계 1) 괄호 추가 (addd) - added[i] = true 인 부분은 괄호에 속하는 숫자들이다. - 괄호 안에 연산자는 하나만 들어갈 수 있기 때문에 연산자를 기준으로 i와 i+2를 검사한다. 2) added[i] ==..
[BOJ] 16988. Baaaaaaaaaduk2 (Easy) *조합을 이용하여 2개의 빈칸 좌표에 내 돌(1)을 놓은 후, 죽일 수 있는 상대 돌의 최대값을 계산한다. *죽일 수 있는 상대 돌 그룹은 내 돌(1)로 둘러싸여져 있어야 한다. 하지만 그것을 증명하는 것보다는 돌 그룹의 상하좌우에 빈칸(0)이 있으면 그 돌 그룹은 죽을 수 없다고 간주하는 것이 더 구현하기 쉽다. #include #include #include #include using namespace std; int n, m, ans = 0; int map[21][21]; typedef pair pp; vector emt, enemy; int emtCnt = 0; bool visited[500], chk[21][21]; int dx[4] = { -1,1,0,0 }, dy[4] = { 0,0,-1,1..
[BOJ] 10711. 모래성 *가장자리는 항상 모래가 있는 부분이기 때문에 1,1 ~ h-1,w-1 의 부분 중 8방향을 살펴봤을 때 '.' 인 부분이 자기 자신보다 많은 경우만 큐에 넣는다. 즉, 큐에는 이제 사라질 좌표들만 넣는다. *큐에는 파도에 휩쓸려 사라질 부분들만 넣어지기 때문에 이 부분을 기준으로 주변에 있는 성들을 탐색하면 된다. *더 이상 큐에 넣을게 없으면 (= 없어질 게 없으면) 종료 #include #include #include using namespace std; int h, w; char map[1001][1001]; bool visited[1001][1001]; int age[1001][1001]; typedef pair pp; typedef pair ppp; int dx[8] = { -1, -1, -1..
[BOJ] 5557. 1학년 *dp[][] 에는 현재 인덱스에서 나온 결과에 따라 경우의 수를 저장한다. 8 3 2 4 8 7 2 4 0 8 8 dp[0][8] = 1 1. 8+3 == 11 로 0과 20 사이의 수이므로 dp[1][11] = 1 2. 8-3 == 5 dp[1][5] = 1 이런 식으로 경우의 수를 표시해야 한다. *하지만 이 경우가 마지막에 부등호가 성립되어야 하기 때문에 부등호가 나와야 하는 직전의 인덱스 (n-1)까지 간 후에 숫자들을 저장하고 있는 num[n-1]의 값과 현재까지 계산한 값이 같다면 1을 반환 / 같지 않다면 0을 반환한다. #include #include #include using namespace std; typedef unsigned long long ll; int n; int num[1..
[BOJ] 3709. 레이저빔은 어디로 *(0,0)인 경우만 잘 파악하면 된다. -우향우 거울이 있는 곳으로 이전과 같은 방향으로 또 가게 되는 경우 (무한루프에 빠짐) -갈 수 있는 경로를 다 가봤는데 맵을 떠나지 못하는 경우(queue를 다 돌았는데 보드 밖으로 못 나간 경우) *visited는 방문 표시를 하는 배열로, 3차원으로 기록한다. (좌표, 방향) -> 우향우 거울이 있는 곳으로 이전과 같은 방향으로 다시 들어오면 (0,0)을 반환한다. #define _CRT_SECURE_NO_WARNINGS #include #include #include #include using namespace std; int n; int map[52][52]; bool visited[52][52][4]; int dx[4] = { -1,1,0,0 }, d..