분류 전체보기 113

백준1525 퍼즐 - C++

굉장히 유명한 퍼즐이다. 이거.. 논란이 좀 있었던 문제인데 내부 사정이니 그러려니 하고 넘어간다.. 1.모든 경우의 수를 미리 계산 해놓고 주어진 상황에 맞는 수를 뱉는 방식이 있고, 2.완전탐색을 통해 제일 빠르게 원상태가 만드는 방식이 있고 3.손으로 풀듯이 최적의 방향으로 가산점을 부여하면서 움직일 수도 있겠다. 가장 쉬운 방식인 2번이.. 이번에 핫이슈였으므로 2번으로 완전탐색한다. #include #include #include #include using namespace std; int dy[] = { 0,-1,1,0 }; int dx[] = { -1,0,0,1 }; queue q1; map visited; #define initstate 123456789 //완전탐색 int findZero..

알고리즘 2023.03.03

백준15686 치킨 배달 - C++

모든 집의 치킨 거리의 합이 가장 작게 되도록 치킨집 M 개를 고르면 된다. 조금 더 빠르게 하기 위해서 각 집과 치킨집의 거리를 distmap [집][치킨집]으로 정해놓자. 이때 집과 치킨집을 지도에 직접 뿌릴 필요는 없다. 우리가 볼 건 지도를 직접 볼 필요가 없고 좌표만 가지고 계산하면 되기 때문이다. 그 후 완전 탐색을 이용하여 모든 경우의 수를 살핀다. 이 때 치킨집은 M개만 남기기 때문에 M개를 고른 후 distmap을 순회하여 가장 작은 값만 남기고 Min 값을 찾으면 된다. 집이 최대 2N = 100개고 치킨집이 M = 13 개 이므로 경우의 수는 13C5 * 100 * 13 이므로 시간이 오래 걸리지 않는다. #include int n,m; int ch, h;//치킨집 개수, 집 개수 i..

알고리즘 2023.03.01

SQL 한 컬럼에 있는 여러 값을 여러 컬럼으로 분리해서 합치기

오늘은 또 SQL 때문에 헤맸습니다. 제 상황은 이랬습니다. TABLE TEMP_TABLE NUMBER STATCODE NAME DATE USEYN 3002352 10 해운대 20120101 y 3002352 20 해운대 20120101 y 3002352 30 해운대 20120101 y 3003001 10 인천앞바다 20131111 y 3003001 20 인천앞바다 20131111 null 3003010 10 속초해수욕장 20221001 n 3003010 20 속초해수욕장 20221001 y 3003010 40 속초해수욕장 20221001 y 여기서처럼 number statCode 와 useYn 만 다르고 다른 필드들은 동일한 경우가 많았습니다. 위 상황을 number 와 date, name 으로 묶고,..

백앤드 2023.02.28

java.time.format.DateTimeParseException: Text could not be parsed at index 0

오늘은 짜-증나는 exception을 겪었다. 프론트에서 연도와 월을 픽한 후 백으로 날리는 과정인데, 'yyyyMM'의 String으로 날려주고 있었다. 나는 당연히 LocalDateTime과 DateTimeFormatter를 사용하여 String을 DateTime 형식으로 바꿔주려고 했으나 index0 오류 때문에 도저히 진행할 수가 없었다. 기존 실행했던 함수는 다음과 같다. String frontDate="201212"; LocalDateTime localDateTime; localDateTime = LocalDateTime.parse(frontDate, DateTimeFormatter.ofPattern("yyyyMM")); 당연히 에러가 났다. Unable to obtain LocalDateTi..

백앤드 2023.02.27

Sw Expert Academy 1494 사랑의 카운슬러 - C++

지렁이가 이동하는 총스칼라가 최소가 되게 하면 됩니다. 벡터의 크기는 편의상 루트를 없앤 x^2 + y^2로 계산합니다. 지렁이는 최대 20마리까지 존재하며 짝수입니다. 모든 좌표값은 -10만 c 벡터를 더하면 b 벡터이니, c 벡터는 b 벡터 - a 벡터입니다. 고로 두 점 사이의 거리는 (4,1) - (1,3) = (3, -2)이고, (0,0)과 (3,-2)의 거리는 3^2 + (-2)^2 = 13입니다. 다만, 다른 지렁이 벡터들도 모두 합한 후 거리를 구해주어야 합니다. 여기서 가장 가까운 지렁이로 가야 한다는 조건 때문에 가장 가까운 지렁이를 찾는 과정을 넣으시면 시간초과가 날 확률이 높습니다. 벡터의 합을 구하는 것이고, 벡터의 합은 완전히 더하기 빼기로만 이루어져 있으므로 자연스럽게 결합법칙..

알고리즘 2023.02.27

SW Expert Academy 4408 자기 방으로 돌아가기 - C++

아주 간단한 설명의 문제이다. 추억의 상황설정도 있고 문제 자체도 흥미롭다. 우선, 건너편 방으로 건너갈 때를 생각해보자. 만약 1번 학생이 400번 방에 들어간다면 1 ~ 400 번에 해당하는 동선이 막혀버린다. 만약 398 번에 들어간다면 1 ~ 398 번에 해당하는 동선이 막힌다. ... 만약 2번에 들어간다면 1 ~ 2번에 해당하는 동선이 막힌다. 만약 2번 학생이 399번 방에 들어간다면 1 ~ 400번에 해당하는 동선이 막힌다. 397번 방에 들어간다면 1 ~ 398번 동선이 막힌다. ... 1번 방에 들어간다면 1 ~ 2번 동선이 막힌다. 그럼, 같은 편 방으로 건너갈 때를 생각해보자. 만약 1번 학생이 399번으로 들어간다면 1 ~ 400번 동선이 막힌다. 397번으로 들어간다면 1 ~ 3..

알고리즘 2023.02.25

SW Expert Academy 1247 최적 경로 - C++

이 문제는 그 유명한 외판원의 순회와 비슷하다. 문제에도 대놓고 적혀 있는 만큼, 문제를 효율적으로 푸는 것이 중요한 것이 아니다. 비트 마스킹과 DP를 이용하면 조금 더 빨리 풀 수 있지만, 가벼운 완전탐색으로도 풀리는 문제이다. 가독성을 위해 거리를 구하는 함수를 따로 뺐고, 구현의 간편함을 위해 dfs로 구현한다. #include #include using namespace std; int T, N; int x[12], y[12]; bool used[12]; int tmpMax; int absDist(int x1, int y1, int x2, int y2) { int ret = 0; ret += x1 > x2 ? x1 - x2 : x2 - x1; ret += y1 > y2 ? y1 - y2 : y2..

알고리즘 2023.02.25

SW Expert Academy 5653 줄기세포배양 - C++

삼성의 대표 시뮬레이션 문제이다. 모의 SW 역량테스트에도 나온 만큼 최신 트렌드 시뮬레이션에 맞는 문제라고 할 수 있으며, 그만큼 문제를 제대로 읽고 제한 조건을 정확히 구현하는 연습에 아주 좋은 문제이다. 여기서 SW 역량테스트는 삼성 공채 SW 검정을 뜻한다. 구현하기 힘든 포인트는 다음과 같다. 1. 생명력 수치가 X인 세포는 X시간 동안 비활성화고 X시간이 되었을 때 활성된다. 2. 세포는 활성화된 후 X시간 살아있으며, 죽으면 그 자리를 그대로 차지한다. 3. 동시에 같은 셀에 번식하면 생명력 수치 X가 높은 줄기 세포가 혼자 차지한다. 4. 배양 용기 크기는 무한하다. 우선 1번, 생명력 수치X는 고정되어 있어야 하므로 (한 번 1이면 영원한 1!) 생명력 수치 X 와 세포의 나이 X` 을 ..

알고리즘 2023.02.25

백준14003 가장 긴 증가하는 부분 수열5 - C++

가장 긴 증가하는 부분 수열 시리즈 중 난이도가 높은 5이다. 일반적인 방법으로 풀 수 없는 제한 조건이 있다. 수열의 크기가 100만이고, 숫자가 -10억부터 10억까지이므로 기존에 2에서 쓰던 방법들은 시간이 너무 오래 걸린다. 배열을 한 번 순회하면서 O(N) 논리적으로 저장하는 방식이 O(logN)이라면 NlogN ~ 2천만 회 정도로 1초 안에 풀이가 가능하다. 사용할 방법은 백트레킹이다. 이름이 어려워 보이지만, 단순히 내가 한 행동을 저장해 놓고 나중에 다시 꺼내보겠다는 얘기이다. 방식은 다음과 같다. 1. 주어진 수열(A)을 순회한다. 2. 가장 긴 부분 수열을 저장하는 수열(B)에 저장한다. 3. 가장 긴 수열이 저장되었다면, 저장한 값이 A에서는 몇 번째인지 백트레킹으로 추적한 후 저장..

알고리즘 2023.02.24

백준3190 뱀 - C++

오락실에 있는 고전 뱀 게임이다. 사과 먹으면 뱀 길이가 길어지는데 벽이나 자신의 몸에 부딪히면 죽는다. 게임이 총 몇 초(몇 회)만에 끝나는지 구하면 된다. 이 문제는 뱀의 처음 위치(1,1)에서 시작하며, 오른쪽으로 출발한다. 가장 헷갈리게 만든 점은 X 초 후에 방향을 90도 꺾는다는 정보였는데, 방향을 바꾸고 나서 그 다음 X 초 후에 꺾는다는 소린 줄 알고 삽질하다가, 게임 경과 시간이 X초 일 때 방향을 전환한다는 것이라는 것을 겁나 늦게 깨닫고 고쳤다. ㅋㅋ 여하튼 주의하자. 1. 위치는 (행, 열) 로 주어진다 = (y, x)로 생각하면 편함 2. 게임은 반드시 끝난다. (X는 10000까지 이므로 10000초가 넘어가면 언제든 벽에 머리 박고 죽는다) 3. 본인이 바라보는 방향 기준 왼쪽..

알고리즘 2023.02.24