본문 바로가기

BOJ/C++

(202)
[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..
[BOJ] 1520. 내리막길 *dfs와 dp를 이용하여 풀이 *도착 지점(m-1, n-1)부터 시작해서 (0,0)에 도착하면 1을 리턴하여 갈 수 있는 경로임을 저장한다. *만약, 이미 한 번 지나온 곳을 다시 가게 되면 중복 탐색을 할 필요가 없기 때문에 저장된 값을 리턴해준다. *모두 탐색했을 때 dp[m-1][n-1]에 저장된 값이 정답이다. *길을 중복 탐색하지 않아야 TLE를 피할 수 있다. #define _CRT_SECURE_NO_WARNINGS #include #include #include using namespace std; int m, n, ans = 0; int map[501][501]; int dx[4] = { -1,1,0,0 }, dy[4] = { 0,0,-1,1 }; int dp[501][501]; bool..
[BOJ] 11723. 집합 *비트마스킹을 사용한다. 2019/05/20 - [Computer Science/STL] - 비트마스크 (해당 비트 조회/ 값 바꾸기) 비트마스크 (해당 비트 조회/ 값 바꾸기) jayrightthere.tistory.com #define _CRT_SECURE_NO_WARNINGS #include #include #include using namespace std; int main() { int status = 0; char op[10]; int t; scanf("%d", &t); while (t--) { int n; scanf("%10s %d", op, &n); switch (op[0]) { case 'a': { if (op[1] == 'd') { status |= (1
[BOJ] 10972, 10973 다음 순열 / 이전 순열 *이전 순열의 경우에는 맨 뒤의 인덱스부터 이전 인덱스와 비교하면서 뒤쪽에 나보다 작은 수가 존재하는 경우가 자리를 바꾸는 경우이다. -> 4 자리의 순열일 경우 1 2 3 4 라면 0번 인덱스의 값인 [1]이 가장 작은 값이므로 뒤에 이보다 작은 값이 없다. 즉, 가장 처음 순열이라는 것이다. *이런 특성을 이용해서 idx를 찾는다. *이 idx와 자리를 바꿀 인덱스를 찾아야 한다. 바로 이전이라고 했기 때문에 idx보다 뒤에 있으면서 큰 수를 찾아야 한다. n부터 idx까지 비교하면서 idx의 값보다 작으면서 가장 뒤에있는 수를 찾는다. 4 2 1 3 일 때 idx는 2가 된다. (바로 뒤에 1이라는 작은 수가 있기 때문에) idx2는 2보다 뒤에 있으면서 2보다 작은 수인 1이 된다. *여기까지 i..