본문 바로가기

코딩테스트

(34)
[백준/C++] 1057번. 토너먼트 문제 1057번: 토너먼트 김지민은 N명이 참가하는 스타 토너먼트에 진출했다. 토너먼트는 다음과 같이 진행된다. 일단 N명의 참가자는 번호가 1번부터 N번까지 배정받는다. 그러고 난 후에 서로 인접한 번호끼리 스타를 www.acmicpc.net 1. 첫 번째 풀이 (마지막 풀이) 사고 과정 - 일단 간단하게 구현으로 시작해보자. - 1부터 시작, i(홀수)와 i+1(짝수)를 서로 대진시킨다. - 이들은 다음에 어떤 번호를 받게 될까? - 일반적인 경우, 짝수 / 2의 번호를 받게 된다. (1, 2)는 1, (3, 4)는 2, (5, 6)은 3... - 홀수는? 홀수 / 2 + 1 번호를 받게 된다. - 경쟁자가 홀수인 경우엔 어떻게 되지? 25명이면 24는 12, 25는 13을 받는다. 문제없을 듯. -..
[백준/C++] 1074번. Z 문제 1074번: Z 한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. N > 1인 경우, 배열을 www.acmicpc.net 1. 첫 번째 풀이 (마지막 풀이) 사고 과정 - 상당히 재귀적인 문제다. - 먼저 4등분으로 나눈다. Z의 순서에 따라, 각각 1, 2, 3, 4평면이라고 하자. - r행 c열은 넷 중 하나에 속하게 된다. - 만약 크기가 4x4고(N = 2), r행 c열이 4평면에 있다고 하자. 탐색이 4평면에 도달하려면, 2x2 칸을 세 번 지나야 한다. - 즉, 2^N 칸을 세 번 지나치므로, 12번 탐색부터 4평면에서 진행된다. (시작이 0이므로) - 이..
[백준/C++] 1072번. 게임 문제 1072번: 게임 김형택은 지금 몰래 Spider Solitaire(스파이더 카드놀이)를 하고 있다. 형택이는 이 게임을 이길 때도 있었지만, 질 때도 있었다. 누군가의 시선이 느껴진 형택이는 게임을 중단하고 코딩을 하기 시 www.acmicpc.net 1. 첫 번째 풀이 사고 과정 - 가장 간단하게 가보자. - int x, y를 입력받고 - int winrate = y / x - 반복문을 돌리면서, (y + 1) / (x + 1)이 winrate와 달라질 때까지 증가 - i 출력 코드 #include int main() { long long int x, y; scanf("%lld %lld", &x, &y); int winrate = (y * 100) / x; if (winrate == 100) {..
[백준/C++] 1092번. 배 문제 1092번: 배 첫째 줄에 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 각 크레인의 무게 제한이 주어진다. 이 값은 1,000,000보다 작거나 같다. 셋째 줄에는 박스의 수 M이 주어진다. M은 10,000보 www.acmicpc.net 1. 첫 번째 풀이 (마지막 풀이) 사고 과정 - 크레인과 박스를 내림차순 정렬한 후, 각 배열의 첫 번째 원소를 비교한다. - 크레인으로 들 수 있다면 해당 박스를 지우고, 없다면 다음 박스를 비교한다. - 크레인이 한 번씩 움직이면 1분을 추가한다. 1. crain, box 배열에 입력받음 2. for문(i)을 생성, 크레인을 한 번씩 돌림. 종료 후 i를 출력 3. for문(j)을 생성, 모든 크레인을 한 번씩 순회함 4. for문(k..
[백준/C++] 1027번. 고층 건물 문제 1027번: 고층 건물 세준시에는 고층 빌딩이 많다. 세준시의 서민 김지민은 가장 많은 고층 빌딩이 보이는 고층 빌딩을 찾으려고 한다. 빌딩은 총 N개가 있는데, 빌딩은 선분으로 나타낸다. i번째 빌딩 (1부터 시작) www.acmicpc.net 1. 첫 번째 풀이 사고 과정 - N이 50밖에 안 됨 -> 모두 돌려보자 - 일단 양 옆 건물은 무조건 보인다. - 왼쪽 먼저 살펴보자. i번째 건물과 i-1번째 건물의 높이 차를 h에 저장해둔다. ([i-1] - [i]) - 비교 방법은 두 가지. 1. i와 i-2의 차이를 2 * h와 비교한다. 2. i-1와 i-2의 차이를 h와 비교한다. - 둘 모두 h보다 크다면 볼 수 있고, 작거나 같다면 볼 수 없다. 볼 수 있는 경우 h를 갱신한다. - 둘 ..
[백준/C++] 1043번. 거짓말 문제 1043번: 거짓말 지민이는 파티에 가서 이야기 하는 것을 좋아한다. 파티에 갈 때마다, 지민이는 지민이가 가장 좋아하는 이야기를 한다. 지민이는 그 이야기를 말할 때, 있는 그대로 진실로 말하거나 엄청나게 www.acmicpc.net 1. 첫 번째 풀이 (마지막 풀이) 사고 과정 - 진실을 아는 사람이 있다면 거짓말을 할 수 없다. 해당 파티는 제외한다. - 해당 파티에 온 사람 역시 진실을 안 사람이 된다. 따라서 그 사람들이 온 파티 역시 제외한다. - 이렇게 계속 제외하며 남은 파티의 개수를 출력한다. - 근데 이거 사실상 그래프 아닌가? - 인접행렬로 그래프를 구현하고 문제를 풀어보자. 큐를 사용하면 될 것 같다. 1. 2차원 벡터 2개 생성, 회원 당 파티 정보와 파티 당 회원 정보 2...
[백준/C++] 1011번. Fly me to the Alpha Centauri 문제 1011번: Fly me to the Alpha Centauri 우현이는 어린 시절, 지구 외의 다른 행성에서도 인류들이 살아갈 수 있는 미래가 오리라 믿었다. 그리고 그가 지구라는 세상에 발을 내려 놓은 지 23년이 지난 지금, 세계 최연소 ASNA 우주 비행 www.acmicpc.net 1. 첫 번째 풀이 사고 과정 - 뒤로 가는 건 볼 필요도 없을 것 같다. 첫 시작에 -1을 가면 -2, -1, 0을 움직일 수 있으니, 앞으로 나아갈 수 없다. - 중간에 1칸 적게 가는 경우는, 해당 칸과 그전 칸의 순서를 바꿔도 유지된다. 그러니 비내림차순이라 생각하자. - 일단 1부터 시작해 답이 어떻게 되는지 알아보자. n칸에 몇 번 움직일까? 1: 1 2: 1 1 3: 1 1 1 4: 1 2 1 5: ..
[백준/C++] 1016번. 제곱 ㄴㄴ 수 문제 1016번: 제곱 ㄴㄴ 수 어떤 정수 X가 1보다 큰 제곱수로 나누어 떨어지지 않을 때, 그 수를 제곱ㄴㄴ수라고 한다. 제곱수는 정수의 제곱이다. min과 max가 주어지면, min보다 크거나 같고, max보다 작거나 같은 제곱ㄴㄴ수 www.acmicpc.net 1. 첫 번째 풀이 사고 과정 - 가장 먼저 떠올린 방법은 범위 내의 수를 모든 제곱수를 나눠보는 것이다. min의 최댓값이 1,000,000,000,000(1조)이기 때문에, 가장 큰 제곱수는 1,000,000(백 만)의 제곱인 1조이다. 최악의 경우 1,000,001개의 수를 각각 1,000,000번씩 나눠봐야 한다. 시간복잡도로 따지면 O(n^2)겠지만, 최대 1조 번의 연산이 필요하므로 다른 방법을 찾기로 했다. - 그 다음으로 떠올..