본문 바로가기

분류 전체보기54

PS) 백준 1720번 (타일 코드) 너ㅓㅓㅓㅓㅓㅓㅓ무 하기 싫고 안풀리는날인데 짜증나아 백준 1720번 타일코드 계속 등장하는 타일 문제... 이번 문제는 중간에 헷갈려서 시간을 많이 허비했다. 처음에는 좌우 대칭인 코드의 수, 좌우 대칭이 아닌 코드의 수를 따로 계산하려고 했는데, 좌우 대칭인 코드를 구하는 것은 쉽다. 길이-2의 경우에 각각 앞뒤에 2*1사각형 추가, 길이-4인 경우에 각각 앞뒤에 2*2, 1*2*2인 사각형 추가해주면 된다. 반면에 좌우 대칭이 아닌 코드의 수를 어떻게 구할지 막막했다. 규칙도 없고 이전 상황을 저장할 수도 없고,,, 그러나 조금 더 생각해보니 그냥 전체 경우의 수에서 좌우 대칭인 경우의 수를 빼면 바로 나오는 것 아닌가.... 아 이걸 왜 크게 고민한걸까 ㅠㅠ 좌우 대칭인 코드는 전체에서 하나만 존재하고, 좌우 대칭이 아닌 코드는 뒤집을 시 짝이 하나.. 2021. 5. 6.
PS) 3/23 공부 시작, 3-4월의 기록 (78sol, 브론즈 5로 시작하다) 알고리즘 공부는 휴학 후 3월부터 바로 시작하려고 했으나, 3주간 운전면허학원 다니고, 여러 시범과외 다니느라 늦어졌다. 블로그는 4월 말에 개설했으니, 3월 말부터 4월 말 한달까지의 공부 기록을 요약해서 지금이라도 남겨본다. 처음 대학교에 입학했을 때 들어갔던 알고리즘 공부 동아리에서는 단 한번도 제대로 수업을 들어본적이 없었다. 대학교 2학년 때 알고리즘 과목을 수강하면서 비로소 기초적인 알고리즘 개념들을 습득했고, 이제는 이를 바탕으로 PS를 공부해 보려고 한다. PS를 공부하는 이유는 알고리즘 복습 겸 코테 대비이다. 코딩테스트는 먼 미래지만, 지금부터 꾸준하게 공부해나가는 것이 유리할 것 같아 내린 결정이다. 오랜만에 컴퓨터 앞에 앉아 코딩을 하려니 눈앞이 캄캄했다. 분명히 저번 학기에 배운 .. 2021. 5. 5.
PS) 백준 2718, 2591, 2631, 2698번 (타일 채우기, 숫자카드, 줄 세우기, 인접한 비트의 개수) 골드 3으로 승급! 백준 2718 타일 채우기 음 ,, 어 바로 맞았네? (왜??.? 놀람요) 이전에 비슷한 타일 채우기 문제를 접해본 적 있었기 때문에, 이전과 비슷하게 풀었다. 뒤에서 추가될 수 있는 타일의 종류를 찾고, 더해주는 방식이다. 그러나 이렇게 문제가 복잡해지면 뒤에서 추가될 수 있는 타일의 종류가 많아지므로, 놓치는 타일이 있을 수 있어 비효율적이다. (야매임..) 조금 더 세분화된 dp를 이용해서 풀어보자!! #include long long dp[30]; int main() { int t; scanf("%d", &t); int n; dp[1] = 1; dp[2] = 5; int a; int b; for (int i = 3; i 1,1 이전에 연결지어 카드를 만든 경우와, 그렇지 않은 경우에 따라서 이후에.. 2021. 5. 5.
PS) 백준 1958, 2225, 17069, 17070, 1655번 (LCS3, 합분해, 파이프 옮기기1, 2, 가운데를 말해요) 백준 1958번 LCS3 문자열 3개의 가장 긴 부분수열을 구하는 프로그램 문자열만 하나 많아졌을 뿐 구현하는 방법은 2개일때와 같음! dp[i][j][k] => 문자열 1의 i번째 문자, 문자열 2의 j번째 문자, 문자열 3의 k번째 문자까지 중에서 lcs의 길이 배열을 3차원으로 설정하고 구현해주면 됨. 모든 문자가 같은 경우 이전 문자열의 최장수열길이에서 1을 더해준것을 기록하고, 문자가 다른 경우 이전 탐색한 수열의 최댓값을 기록한다. #include #include #include #include using namespace std; int dp[105][105][105]; //문자열 3개의 LCS를 구하는 프로그램 int main() { string str1, str2, str3; cin >>.. 2021. 5. 4.
PS) 백준 1309, 10164번 (동물원, 격자상의 경로) 오늘은 토요일이라 안하려 하다가 양심에 찔려서 몇문제라도 풀어본다.. 1309번 동물원 처음에 생각을 잘못해서,,,,,,,,, 삽질한 문제이다. 3차원 배열을 선언해서, i번째 열의, n행의 방의 동물의 여부에 따라서 계산을 해주었더니 구현이 되지 않았다. 깊게 생각하지 않고 가볍게 생각해보니 그렇게 어렵게 들어가지 않아도 되는 문제였다... i번째 열에서 올 수 있는 동물의 경우는 1) O 2) X 3) X X O X 이 세가지이다. 따라서 dp를 2차원으로 구현한다. dp[n][3] => n열에서 올 수 있는 경우는 세가지 경우 첫번째 경우는 이전 열에서 2,3번의 경우일 때 가능 두번째 경우는 이전 열에서 1,3번의 경우일 때 가능 세번째 경우는 이전 열에서 1,2,3번의 경우일 때 가능 그림으로 .. 2021. 5. 2.
PS) 백준 10844, 1965, 1946, 2854, 1563 (쉬운 계단 수, 상자 넣기, 신입 사원, 문제 출제, 개근상) 10844번 쉬운 계단 수 별로 안어려웠다. 하지만 한번 틀렸다. 그 이유는 정수 자료형 때문. [놓친점] 각 값을 계산해 줄 때 10억으로 나눈 나머지를 넣어주었기 때문에 자동적으로 10억 미만의 값이 나올 것이라고 착각했지만. dp[n][0] ~ dp[n][9]를 더한 값은 최대 100억이 되므로 long long자료형으로 변경해주어야 한다. 값이 커질 때, 최대 데이터를 확인하고 자료형을 체크하자! #include int dp[105][15]; //dp[n][i] => 길이가 n이고, i로 끝나는 계단수의 개수 int main() { int n; scanf("%d", &n); for (int i = 1; i 2021. 5. 1.