본문 바로가기

백준

(81)
2775)부녀회장이 될테야 https://www.acmicpc.net/problem/2775 k층 n번째에 들어갈 사람의 수는 다음처럼 구할 수 있다. 예를들어 1층 4호에 입주할 사람의 수는 아래 그림과 같다. 0층 1호부터 4호까지 입주한 사람들의 합이다.그렇다면 2층 5호에 입주할 사람의 수는?위 그림처럼 1층 1호~ 1층 5호까지 합을 구해야 한다. 그리고 1층 의 각 호실에 입주할 사람의 수를 구해야 한다. 문제를 해결하기 위해 자기 반복 구조를 사용해야 해서 재귀 함수를 작성했다. 123456789101112131415161718192021222324252627282930#include int calculate(int k, int n) { int sum = 0; if (k == 0) return n; else { for..
5622)다이얼 https://www.acmicpc.net/problem/5622 문제를 이해하기 위해 입력을 살펴보자. 입력이 UNUCIC 이고 출력이 36이다 어떻게 해서 36이 나왔을까? 할머니는 숫자를 문자로 기억한다고 했다. 할머니가 기억하는 문자는 위 그림처럼 다이얼 숫자 밑에 있는 문자들을 말한다. 즉 A,B,C가 입력되면 3초를 세어야하고 D,E,F가 입력되면 4초를 세어야 한다. 몇 개만 훑어 보면 규칙이 있는 것처럼 보인다. A,B,C 0+3D,E,F 1+3G,H,I 2+3J,K,L 3+3... 그러니까 A부터 순차적으로 0을 포함한 자연수와 대응시켜가면 규칙이 보인다. 0,1,2 03,4,5 16,7,8 2... 즉 A,B,C에 대응되는 수를 3으로 나눈 몫과 시간이 어떤 관련이 있다고 볼 수 있다...
1316)그룹 단어 체커 https://www.acmicpc.net/problem/1316 단어에서 각 문자가 연속해서 나타날 때 그 단어를 그룹 단어라고 한다. 예를 들어 aaabbc는 a,b,c가 연속해서 나타났기 때문에 그룹 단어이다. 반면 aaabbca는 a가 연속해서 나타나지 않았기 때문에 그룹 단어가 아니다. 이 문제를 살짝 어렵게 풀었다. 문자열을 저장하고 있는 배열을 S라고 하자. aaabbc가 그룹 단어인지 확인하기 위한 알고리즘의 초기 상태는 아래와 같다.S[jump]와 S[j]가 같은지 비교하고 인덱스 차이가 1인지 확인한다.(인덱스 차이가 1이 아니면 문자가 연속해서 나타난 것x) 문자가 연속해서 나타났다면 jump에 j값을 저장한다. (S[j]가 연속한 문자군 중에서 마지막일 때 바로 jump이후로 넘어가..
2920)음계 https://www.acmicpc.net/problem/2920 1~8까지 오름차순인 경우 ascending을 출력하고 내림차순인 경우 desending을 출력한다. 이도 저도 아니면 mixed를 출력한다. 한수 문제를 풀 때 아이디어를 쓰면 될 것같다.. 한수는 각 자리수가 등차수열을 이루는 수이다. 이를 좀 더 쉽게 구하기 위해 한 자리씩 읽어 이전 자릿수끼리 차이와 현재 자릿수끼리 차이를 비교했다. 한 번이라도 달라지면 등차수열이 아니다. 연속된 자연수를 오름 차순으로 정렬했을 때 An-An+1 = -1이다. 내림 차순으로 정렬했을 때 An-An+1 = 1이다. 비교 과정 중 한 번이라도 달라지면 mixed를 출력하면 된다. 1234567891011121314151617181920212223242..
8958)OX 퀴즈 https://www.acmicpc.net/problem/8958 문자열을 받아서 'O'를 세기 전에 point를 하나씩 늘리면 될 것같다. 1234567891011121314151617181920212223242526#include int main() { int N; char tempStr[80]; int score = 0; int point = 0; scanf("%d",&N); for (int i = 0; i
1065)한수 https://www.acmicpc.net/problem/1065 임의의 자연수에서 각 자리의 수가 등차수열을 이루면 그 수를 한수라고 한다. 쉽게 말해서 각 자리 수의 차이가 같으면 한 수이고 하나라도 다르면 한수가 아니다. 주어진 예제를 좀 더 분석해보자. 입력이 110일 때 출력이 99이다. 도대체 무슨 의미일까? 우선 100~110이 한수인지 여부를 알아봐야 한다. 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110 공교롭게도 100~110은 한수가 아니다. 다시 말해 1~99는 한수라는 뜻이다. N보다 작은 한수를 세기 위해 1~99까지 수는 셀 필요가 없다. N이 100보다 작고 100보다 작은 수는 한수이기 때문에 N이 곧 한수의 갯수가 될 것이고..
1012)유기농 배추 https://www.acmicpc.net/problem/1012 이 문제를 어떻게 간단하게 볼 수 있을까? 지렁이는 네 방향으로만 움직일 수 있다. 어떤 특정한 지점에서 네 방향으로만 움직이면서 지나갔던 자리에 표시해두자. 이렇게 만들어진 다각형을 4방향 채움 다각형이라 한다. 왼쪽 그림처럼 4방향으로 이동하면서 색을 채운 다각형의 모습은 오른쪽 그림과 같다. 지렁이는 동서남북 네 방향으로만 이동하기 때문에 위 다각형의 각 셀을 모두 방문할 수 있다.만약 위처럼 두 영역이 인접해 있는 경우에 지렁이는 인접한 영역으로 이동할 수 있을까? 지렁이는 대각선 방향의 이동을 할 수 없기 때문에 인접한 영역으로 이동할 수 없다. 따라서 위 영역에서 지렁이는 두 마리가 필요하다고 볼 수 있다. 문제를 조금 더 쉽게..
4673)셀프 넘버 https://www.acmicpc.net/problem/4673 셀프 넘버란 d(n)로 만들 수 없는 수를 말한다. (n은 자연수) 셀프 넘버를 얻을 수 있는 함수는 제시되지 않았기 때문에 함수를 직접 찾거나 d(n)으로 만들 수 있는 수를 모두 체크하고 체크되지 않은 수가 셀프 넘버일 것이다. 1~9999까지 수를 d()에 넣는다 쳐도 빠짐없이 10000 미만의 d()으로 만들 수 있는 수를 모두 확인한게 맞을까? d(n)으로 만들 수 있는 수들도 자연수이고 10000 미만인것만 다룰 것이기 때문에 모두 확인할 수 있다. d(n)가 수를만들면 그 수로 set[]을 인덱싱하여 체크하면 된다. 1~10000까지 작업이 끝나면 set[]에서 체크되지 않은 인덱스들을 출력하면 된다. 1234567891011..