📄문제 10진수 N이 입력되면 K진수로 변환하여 출력하는 프로그램을 작성하세요. ℹ️ 조건 스택 자료구조를 사용하시기 바랍니다. ⬇️ 입력 첫 번째 줄에 10진수 N(10
[C++] Ugly Numbers 🔥
·
algorithms (C++)
📄문제 어떤 수를 소인수분해 했을 때 그 소인수가 2 또는 3 또는 5로만 이루어진 수를 Ugly Number라고 부릅니다. Ugly Number를 차례대로 적어보면 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, .......입니다. 숫자 1은 Ugly Number의 첫 번째 수로 합니다. 자연수 N이 주어지면 Ugly Number를 차례로 적을 때 N번째 Ugly Number를 구하는 프로그램을 작성하세요. ⬇️ 입력 첫 줄에 자연수 N(3= N) { // 출력 후 종료 printf("%d", arr[N - 1]); return 0; } } } 2, 3, 5를 각각 곱하는 포인터 세개를 만든 후 1부터 2, 3, 4, 5... 의 순서대로 작은 값부터 차례대로 생성하여 해결합니다.
[C++] 영지(territory) 선택 🔥
·
algorithms (C++)
📄문제 세종대왕은 현수에게 현수가 다스릴 수 있는 영지를 하사하기로 했다. 전체 땅은 사각형으로 표시된다. 그 사각형의 땅 중에서 세종대왕이 현수가 다스릴 수 있는 땅의 크기(세로의 길이와 가로의 길이)를 정해주면 전체 땅 중에서 그 크기의 땅의 위치를 현수가 정하면 되는 것이다. 전체 땅은 사각형의 모양의 격자로 되어 있으며, 그 사각형 땅 안에는 많은 오렌지 나무가 심겨져 있다. 현수는 오렌지를 무척 좋아하여 오렌지 나무가 가장 많이 포함되는 지역을 선택하고 싶어 한다. 현수가 얻을 수 있는 영지의 오렌지 나무 최대 개수를 출력하는 프로그램을 작성하세요. 다음과 같은 땅의 정보가 주어지고, 현수가 하사받을 크기가, 가로 2, 세로 3의 크기이면 가장 많은 오렌지 나무가 있는 영지는 총 오렌지 나무의 ..
[C++] 블록의 최댓값
·
algorithms (C++)
📄문제 현수는 블록놀이를 좋아합니다. 현수에게 정면에서 본 단면과 오른쪽 측면에서 본 단면을 주고 최대 블록개수를 사용하여 정면과 오른쪽 측면에서 본 모습으로 블록을 쌓으라 했습니다. 현수가 블록을 쌓는데 사용해야 할 최대 개수를 출력하는 프로그램을 작성하세요. 위에서 봤을 때 각 칸의 블록의 개수입니다. 정면에서의 높이 정보와 오른쪽 측면에서의 높이 정보가 주어지면 사용할 수 있는 블록의 쵀대 개수를 출력하세요. ⬇️ 입력 첫 줄에 블록의 크기 N(3= 0; --i) for (int j = 0; j < N; ++j) { // 두는 블록은 정면과 측면뷰에서 둘 중 작은 값으로 설정 int min = getMin(fView[i], sView[j]); sum += min; } printf("%d", sum)..
[C++] 각 행의 평균과 가장 가까운 값
·
algorithms (C++)
📄문제 9 × 9 격자판에 쓰여진 81개의 자연수가 주어질 때, 각 행의 평균을 구하고, 그 평균과 가장 가까운 값을 출력하는 프로그램을 작성하세요. 평균은 소수점 첫 째 자리에서 반올림합니다. 평균과 가까운 값이 두 개이면 그 중 큰 값을 출력하세요. ⬇️ 입력 첫 째 줄부터 아홉 번째 줄까지 한 줄에 아홉 개씩 자연수가 주어진다. 주어지는 자연수는 100보다 작다. 3 23 85 34 17 74 25 52 65 10 7 39 42 88 52 14 72 63 87 42 18 78 53 45 18 84 53 34 28 64 85 12 16 75 36 55 21 77 45 35 28 75 90 76 1 25 87 65 15 28 11 37 28 74 65 27 75 41 7 89 78 64 39 47 47..
[C++] 봉우리
·
algorithms (C++)
📄문제 지도 정보가 N*N 격자판에 주어집니다. 각 격자에는 그 지역의 높이가 쓰여있습니다. 각 격자판의 숫자 중 자신의 상하좌우 숫자보다 큰 숫자는 봉우리 지역입니다. 봉우리 지역이 몇 개 있는 지 알아내는 프로그램을 작성하세요. 격자의 가장자리는 0으로 초기화 되었다고 가정한다. 만약 N=5 이고, 격자판의 숫자가 다음과 같다면 봉우리의 개수는 10개입니다. ⬇️ 입력 첫 줄에 자연수 N이 주어진다.(1
[C++] 멀티태스킹
·
algorithms (C++)
📄문제 현수의 컴퓨터는 멀티태스킹이 가능하다. 처리해야 할 작업이 N개 들어오면 현수의 컴퓨터는 작업을 1부터 N까지의 번호를 부여하고 처리를 다음과 같이 한다. 1) 컴퓨터는 1번 작업부터 순서대로 1초씩 작업을 한다. 즉 각 작업을 1초만 작업하고 다음 작업을 하는 식이다. 2) 마지막 번호의 작업을 1초 했으면 다시 1번 작업으로 가서 다시 1초씩 후속 처리를 한다. 3) 처리가 끝난 작업은 작업 스케쥴에서 사라지고 새로운 작업은 들어오지 않는다. 그런데 현수의 컴퓨터가 일을 시작한 지 K초 후에 정전이 되어 컴퓨터가 일시적으로 멈추었다. 전기가 들어오고 나서 현수의 컴퓨터가 몇 번 작업부터 다시 시작해야 하는지 알아내는 프로그램을 작성하세요. ⬇️ 입력 첫 번째 줄에 작업의 개수 N(1
[C++] 공주 구하기 (요세푸스 문제)
·
algorithms (C++)
📄문제 정보 왕국의 이웃 나라 외동딸 공주가 숲속의 괴물에게 잡혀갔습니다. 정보 왕국에는 왕자가 N명이 있는데 서로 공주를 구하러 가겠다고 합니다. 정보왕국의 왕은 다음과 같은 방법으로 공주를 구하러 갈 왕자를 결정하기로 했습니다. 왕은 왕자들을 나이 순으로 1번부터 N번까지 차례로 번호를 매긴다. 그리고 1번 왕자부터 N번 왕자까지 순서대로 시계 방향으로 돌아가며 동그랗게 앉게 한다. 그리고 1번 왕자부터 시계방향으로 돌아가며 1부터 시작하여 번호를 외치게 한다. 한 왕자가 K(특정숫자)를 외치면 그 왕자는 공주를 구하러 가는데서 제외되고 원 밖으로 나오게 된다. 그리고 다음 왕자부터 다시 1부터 시작하여 번호를 외친다. 이렇게 해서 마지막까지 남은 왕자가 공주를 구하러 갈 수 있다. 예를 들어 총 8..
[C++] 마구간 정하기 🔥
·
algorithms (C++)
📄문제 N개의 마구간이 1차원 수직선상에 있습니다. 각 마구간은 x1, x2, x3, ......, xN의 좌표를 가지며, 마구간간에 좌표가 중복되는 일은 없습니다. 현수는 C마리의 말을 가지고 있는데, 이 말들은 서로 가까이 있는 것을 좋아하지 않습니다. 각 마구간에는 한 마리의 말만 넣을 수 있고, 가장 가까운 두 말의 거리가 최대가 되게 말을 마구간에 배치하고 싶습니다. C마리의 말을 N개의 마구간에 배치했을 때 가장 가까운 두 말의 거리가 최대가 되는 그 최대값을 출력하는 프로그램을 작성하세요. ⬇️ 입력 첫 줄에 자연수 N(3
[C++] 뮤직비디오 🔥
·
algorithms (C++)
📄문제 지니레코드에서는 불세출의 가수 조영필의 라이브 동영상을 DVD로 만들어 판매하려 한다. DVD에는 총 N개의 곡이 들어가는데, DVD에 녹화할 때에는 라이브에서의 순서가 그대로 유지되어야 한다. 순서가 바뀌는 것을 우리의 가수 조영필씨가 매우 싫어한다. 즉, 1번 노래와 5번 노래를 같은 DVD에 녹화하기 위해서는 1번과 5번 사이의 모든 노래도 같은 DVD에 녹화해야한다. 지니레코드 입장에서는 이 DVD가 팔릴 것인지 확신할 수 없기 때문에 이 사업에 낭비되는 DVD를 가급적 줄이려고 한다. 고민 끝에 지니레코드는 M개의 DVD에 모든 동영상을 녹화하기로 하였다. 이 때 DVD의 크기(녹화 가능한 길이)를 최소로 하려고 한다. 그리고 M개의 DVD는 모두 같은 크기여야 제조원가가 적게 들기 때문..
[C++] 이분검색
·
algorithms (C++)
📄문제 임의의 N개의 숫자가 입력으로 주어집니다. N개의 수를 오름차순으로 정렬한 다음 N개의 수 중 한 개의 수인 M이 주어지면 이분검색으로 M이 정렬된 상태에서 몇 번째에 있는지 구하는프로그램을 작성하세요. ⬇️ 입력 첫 줄에 한 줄에 자연수 N(3 M) // 현재 값이 찾고자 하는 값보다 크면? -> mid를 감소 { rt = mid - 1; } else // 현재 값이 찾고자 하는 값보다 작으면? -> mid를 증가 { lt = mid + 1; } } 이분검색의 정석대로 lt, rt, mid라는 변수를 명시하여 구현한 방법입니다.
[C++] 연속된 자연수의 합 🔥
·
algorithms (C++)
📄문제 입력으로 양의 정수 N이 입력되면 2개 이상의 연속된 자연수의 합으로 정수 N을 표현하는 방 법의 가짓수를 출력하는 프로그램을 작성하세요. 만약 N=15이면, 7+8=15 4+5+6=15 1+2+3+4+5=15 와 같이 총 3가지의 경우가 존재한다. ⬇️ 입력 첫 번째 줄에 양의 정수 N(7
[C++] 교집합(투포인터 알고리즘)
·
algorithms (C++)
투포인터 알고리즘은 두개의 정렬된 배열에서 검색하는데 빠른 접근 방법을 제공합니다. 📄문제 두 집합 A, B가 주어지면 두 집합의 교집합을 출력하는 프로그램을 작성하세요. ⬇️ 입력 첫 번째 줄에 집합 A의 크기 N(1
[C++] 두 배열 합치기
·
algorithms (C++)
📄문제 오름차순으로 정렬이 된 두 배열이 주어지면 두 배열을 오름차순으로 합쳐 출력하는 프로그램을 작성하세요. ⬇️ 입력 첫 번째 줄에 첫 번째 배열의 크기 N(1
[C++] Inversion Sequence 🔥
·
algorithms (C++)
📄문제 1부터 n까지의 수를 한 번씩만 사용하여 이루어진 수열이 있을 때, 1부터 n까지 각각의 수 앞에 놓여 있는 자신보다 큰 수들의 개수를 수열로 표현한 것을 Inversion Sequence라 한다. 예를 들어 다음과 같은 [4 8 6 2 5 1 3 7] 수열의 경우 1앞에 놓인 1보다 큰 수는 4, 8, 6, 2, 5. 이렇게 5개 2앞에 놓인 2보다 큰 수는 4, 8, 6. 이렇게 3개 3앞에 놓인 3보다 큰 수는 4, 8, 6, 5 이렇게 4개이다. 따라서 4 8 6 2 5 1 3 7의 inversion sequence는 [5 3 4 0 2 1 1 0] 이 된다. n과 1부터 n까지의 수를 사용하여 이루어진 수열의 inversion sequence가 주어졌을 때, 원래의 수열을 출력하는 프로그..
[C++] Least Recently Used
·
algorithms (C++)
📄문제 캐시메모리는 CPU와 주기억장치(DRAM) 사이의 고속의 임시 메모리로서 CPU가 처리할 작업을 저장해 놓았다가 필요할 바로 사용해서 처리속도를 높이는 장치이다. 워낙 비싸고 용량이 작아 효율적으로 사용해야 한다. 철수의 컴퓨터는 캐시메모리 사용 규칙이 LRU 알고리즘을 따른다. LRU 알고리즘은 Least Recently Used 의 약자로 직역하자면 가장 최근에 사용되지 않은 것 정도의 의미를 가지고 있습니다. 캐시에서 작업을 제거할 때 가장 오랫동안 사용하지 않은 것을 제거하겠다는 알고리즘입니다. 만약 캐시의 사이즈가 5이고 작업이 [2 3 1 6 7] 순으로 저장되어 있다면, (맨 앞이 가장 최근에 쓰인 작업이고, 맨 뒤는 가장 오랫동안 쓰이지 않은 작업이다.) 1) Cache Miss :..
[C++] Special Sort
·
algorithms (C++)
📄문제 N개의 정수가 입력되면 당신은 입력된 값을 정렬해야 한다. 음의 정수는 앞쪽에 양의정수는 뒷쪽에 있어야 한다. 또한 양의정수와 음의정수의 순서에는 변함이 없어야 한다. ⬇️ 입력 첫 번째 줄에 정수 N(5
[C++] 3등의 성적은?
·
algorithms (C++)
📄문제 N명의 수학성적이 주어지면 그 중 3등을 한 수학성적을 출력하는 프로그램을 작성하세요. 만약 학생의 점수가 100점이 3명, 99점이 2명, 98점이 5명, 97점이 3명 이런식으로 점수가 분포되면 1등은 3명이며, 2등은 2명이며 3등은 5명이 되어 98점이 3등을 한 점수가 됩니다. ⬇️ 입력 첫 번째 줄에 자연수 N(1
[C++] 삽입정렬
·
algorithms (C++)
자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교합니다. 자신의 위치를 찾아 삽입하는 방식으로, 선택돤 arr[i] (temp)가 arr[j]보다 작을경우, 배열을 옆으로 밀어서 옮깁니다. 0에 도달하거나, temp보다 큰 값이 나온다면, 더 이상 진행하지 않고 해당 위치에 temp를 삽입합니다. #include #include int main() { int N; scanf_s("%d", &N); std::vector arr(N); for (int i = 0; i 0; --j) if (arr[j..
[C++] 버블정렬
·
algorithms (C++)
주어진 리스트를 시작하고, 첫 번째 원소부터 마지막 원소까지 순차적으로 비교합니다. 인접한 두 원소를 비교하여, 만약 현재 원소가 다음 원소보다 크다면, 두 원소를 교체합니다. 이 과정을 리스트의 처음에서부터 끝까지 계속 반복합니다. 이로써 가장 큰 원소가 리스트의 마지막으로 이동하게 됩니다. 다시 첫 번째 원소부터 정렬되지 않은 원소까지 같은 과정을 반복합니다. 위의 과정을 리스트에 원소가 한 개 남을 때까지 반복합니다. #include #include void swap(int& a, int& b) noexcept { int temp = a; a = b; b = temp; } int main() { int N; scanf_s("%d", &N); std::vector arr(N); for (int i =..
[C++] 선택정렬
·
algorithms (C++)
주어진 리스트 중에 최소값을 찾습니다. 그 값을 맨 앞에 위치한 값과 교체합니다.(패스(pass)). 맨 처음 위치를 뺀 나머지 리스트를 같은 방법으로 교체합니다. #include #include void swap(int* a, int* b) noexcept { int temp = *a; *a = *b; *b = temp; } using namespace std; int main() { int N; scanf_s("%d", &N); vector numbers(N); for (int i = 0; i < N; ++i) scanf_s("%d", &numbers[i]); for (int i = 0; i < N - 1; ++i) { int idx = i; for (int j = i + 1; j < N; ++j) ..
[C++] 탄화수소 질량
·
algorithms (C++)
📄문제 탄소(C)와 수소(H)로만 이루어진 화합물을 탄화수소라고 합니다. 탄소(C) 한 개의 질량은 12g, 수소(H) 한 개의 질량은 1g입니다. 에틸렌(C2H4)의 질량은 12*2+1*4=28g입니다. 메탄(CH4)의 질량은 12*1+1*4=16g입니다. 탄화수소식이 주어지면 해당 화합물의 질량을 구하는 프로그램을 작성하세요. ⬇️ 입력 첫 줄에 탄화수소식이 주어집니다. 식의 형태는 CaHb 형태이며 (1
[C++] 3의 개수 (large) 🔥
·
algorithms (C++)
📄문제 자연수 N이 입력되면 1부터 N까지의 자연수를 종이에 적을 때 각 숫자 중 3의 개수가 몇 개있는지 구하려고 합니다. 예를 들어 1부터 15까지는 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5으로 3의 개수는 2개입니다. 자연수 N이 입력되면 1부터 N까지 숫자를 적을 때, 3의 개수가 몇 개인지 구하여 출력하는 프로그램을 작성하세요. ⬇️ 입력 첫 줄에 자연수의 개수 N(3 3) // center가 3보다 크다면? { cnt += (left + 1) * digit; // 3을 출력하는 개수는 left 개수 + 1 (자신을 포함) } else if (center < 3) // center가 3보다 작다면? { cnt += left *..
[C++] 3의 개수 (small)
·
algorithms (C++)
📄문제 자연수 N이 입력되면 1부터 N까지의 자연수를 종이에 적을 때 각 숫자 중 3의 개수가 몇 개있는지 구하려고 합니다. 예를 들어 1부터 15까지는 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5으로 3의 개수는 2개입니다. 자연수 N이 입력되면 1부터 N까지 숫자를 적을 때, 3의 개수가 몇 개인지 구하여 출력하는 프로그램을 작성하세요. ⬇️ 입력 첫 줄에 자연수의 개수 N(3
[C++] N!에서 0의 개수 🔥
·
algorithms (C++)
📄문제 자연수 N이 입력되면 N! 값에서 일의 자리부터 연속적으로 ‘0’이 몇 개 있는지 구하는 프로그램을 작성하세요. 만약 5! = 5 × 4 × 3 × 2 × 1 = 120으로 일의자리부터 연속적된 ‘0’의 개수는 1입니다. 만약 12! = 479001600으로 일의자리부터 연속적된 ‘0’의 개수는 2입니다. ⬇️ 입력 첫 줄에 자연수 N(10
[C++] N!의 표현법
·
algorithms (C++)
📄문제 임의의 N에 대하여 N!은 1부터 N까지의 곱을 의미한다. 이는 N이 커짐에 따라 급격하게 커진다. 이러한 큰 수를 표현하는 방법으로 소수들의 곱으로 표현하는 방법이 있다. 먼저 소수는 2, 3, 5, 7, 11, 13... 순으로 증가함을 알아야 한다. 예를 들면 825는 (0 1 2 0 1)로 표현이 가능한데, 이는 2는 없고 3은 1번, 5는 2번, 7은 없고, 11은 1번의 곱이라는 의미이다. 101보 다 작은 임의의 N에 대하여 N 팩토리얼을 이와 같은 표기법으로 변환하는 프로그램을 작성해보자. 출력은 아래 예제와 같이 하도록 한다. ⬇️ 입력 첫 줄에 자연수 N(3
[C++] 마라톤
·
algorithms (C++)
📄문제 KSEA 장거리 달리기 대회가 진행되어 모든 선수가 반환점을 넘었다. 각 선수의 입장에서 자기보다 앞에 달리고 있는 선수들 중 평소 실력이 자기보다 좋은 선수를 남은 거리 동안 앞지르는 것은 불가능하다. 반대로, 평소 실력이 자기보다 좋지 않은 선수가 앞에 달리고 있으면 남은 거리 동안 앞지르는 것이 가능하다. 이러한 가정 하에서 각 선수는 자신이 앞으로 얻을 수 있는 최선의 등수를 알 수 있다. 각 선수의 평소 실력은 정수로 주어지는데 더 큰 값이 더 좋은 실력을 의미한다. 현재 달리고 있는 선수를 앞에서 부터 표시했을 때 평소 실력이 각각 2, 8, 10, 7, 1, 9, 4, 15라고 하면 각 선수가 얻을 수 있는 최선의 등수는 (같은 순서로) 각각 1, 1, 1, 3, 5, 2, 5, 1이..
[C++] 석차 구하기
·
algorithms (C++)
📄문제 N명의 학생의 수학점수가 입력되면 각 학생의 석차를 입력된 순서대로 출력하는 프로그램을 작성하세요. ⬇️ 입력 첫 줄에 N(1
[C++] Jolly Jumpers(유쾌한 점퍼)
·
algorithms (C++)
📄문제 N개의 정수로 이루어진 수열에 대해 서로 인접해 있는 두 수의 차가 1에서 N-1까지의 값을 모두 가지면 그 수열을 유쾌한 점퍼(jolly jumper)라고 부른다. 예를 들어 다음과 같은 수열에서 1 4 2 3 앞 뒤에 있는 숫자 차의 절대 값이 각각 3 ,2, 1이므로 이 수열은 유쾌한 점퍼가 된다. 어떤 수열이 유쾌한 점퍼인지 판단할 수 있는 프로그램을 작성하라. ⬇️ 입력 첫 번째 줄에 자연수 N(3
[C++] 연속 부분 증가수열
·
algorithms (C++)
📄문제 N개의 숫자가 나열된 수열이 주어집니다. 이 수열 중 연속적으로 증가하는 부분 수열을 최대길이를 구하여 출력하는 프로그램을 작성하세요. 만약 N=9이고 5 7 3 3 12 12 13 10 11 이면 “3 3 12 12 13”부분이 최대 길이 증가수열이므로 그 길이인 5을 출력합니다. 값이 같을 때는 증가하는 걸로 생각합니다. ⬇️ 입력 첫 줄에 자연수의 개수 N(5 maxIncrementCnt) maxIncrementCnt = curIncrementCnt; prevInput = curInput; } printf("%d", maxIncrementCnt); } 이전 값을 임시로 저장하고, 현재 입력한 값과 비교하여 이전 값보다 크거나 같다면 증가하는 수열로 생각하여 계산합니다.