본문 바로가기

프로그래밍/백준

(30)
[백준 C언어] 2292. 벌집 나의 풀이 #include int main(void) { int n, room=1, cnt=1; scanf("%d", &n); while (room < n) { room += cnt * 6; cnt++; } printf("%d", cnt); } 벌집은 한 겹 둘러싸일 때마다 일정한 간격으로 늘어난다. 중앙을 0번째 겹이라고 치고 첫 번째 값은 1, 다음 겹에서 제일 큰 값은 7, 그 다음은 19, ...이런 식인데, 여기에서 규칙성을 찾을 수 있다. 순서(i) 0 1 2 3 4 숫자 1 7 19 37 61 규칙 1+6*0 1+6*1 7+6*2 19+6*3 37+6*4 이전 항+6*i가 되는 것이다. 즉 답을 구하려면 저 규칙에 따라 쭉쭉 올라가며, 값이 문제의 입력값 n을 넘어섰다면 그대로 i를 반환해주..
[백준 C언어] 3052. 나머지 나의 풀이 #include int main(void){ int n, count=0; int modArr[42]={0}; //0~41의 범위에서, 나머지가 존재하는지 여부를 저장할 배열 for(int i=0;i
[백준 C언어] 2908. 상수 나의 풀이 #include int revNum(int n) { int result = 0, i = 0, arr[3] = {100,10,1}; while (n > 0) { result += n % 10 * arr[i++]; n /= 10; } return result; } int main(void) { int a, b; scanf("%d %d", &a, &b); printf("%d", (revNum(a) > revNum(b)) ? revnum(a) : revnum(b)); return 0; } 숫자를 뒤집어주는 기능을 따로 빼서 함수로 만들어주었다. 각 숫자의 위치를 바꿔서 10의 자리에 맞게 곱연산을 해준 후 합을 구하는 로직인데, 곱연산에는 Lookup Array를 사용하였다. 사실 배열을 사용하지 않..
[C언어] 10809. 알파벳 찾기 나의 풀이 #include #include int main(void) { int c, index = 0, arr[26];//arr : 정답을 저장해 줄 배열 memset(arr, -1, sizeof(arr)); //배열 -1로 초기화 while ((c = getchar()) != '\n') {//개행 전까지 단어 한 글자씩 비교 if (arr[c - 97] == -1) { //해당 알파벳이면 인덱스값을 배열에 넣기 arr[c - 97] = index; } index++; } for (int i = 0; i < 26; i++) { printf("%d ", arr[i]); } return 0; } memset()은 string.h에 들어있는 함수다. 메모리를 초기화할 때 편하다. 단순히 0으로 초기화할 때는..
[백준] 1292. 쉽게 푸는 문제 문제 동호는 내년에 초등학교를 입학한다. 그래서 동호 어머니는 수학 선행 학습을 위해 쉽게 푸는 문제를 동호에게 주었다. 이 문제는 다음과 같다. 1을 한 번, 2를 두 번, 3을 세 번, 이런 식으로 1 2 2 3 3 3 4 4 4 4 5 .. 이러한 수열을 만들고 어느 일정한 구간을 주면 그 구간의 합을 구하는 것이다. 하지만 동호는 현재 더 어려운 문제를 푸느라 바쁘기에 우리가 동호를 도와주자. 입력 첫째 줄에 구간의 시작과 끝을 나타내는 정수 A, B(1 ≤ A ≤ B ≤ 1,000)가 주어진다. 즉, 수열에서 A번째 숫자부터 B번째 숫자까지 합을 구하면 된다. 출력 첫 줄에 구간에 속하는 숫자의 합을 출력한다. 나의 풀이 arr=[] for i in range(1000):# 수열 생성 for r..
[백준] 1978. 소수 찾기 문제 주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오. 입력 첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다. 출력 주어진 수들 중 소수의 개수를 출력한다. 나의 풀이 n=int(input()) a=list(map(int, input().split())) # 테스트 케이스 입력 pn=[] for i in a: cnt=0# 약수의 개수를 저장하는 변수 if i>1: for r in range(2,i):# 2부터 i-1까지 반복 if i%r==0: cnt+=1# 약수가 있으면 카운트 if cnt==0: pn.append(i)# 약수가 없으면(카운트가 0이면) 리스트에 저장 print(len(pn))# 리..
[백준] 2693. N번째 큰 수 문제 배열 A가 주어졌을 때, N번째 큰 값을 출력하는 프로그램을 작성하시오. 배열 A의 크기는 항상 10이고, 자연수만 가지고 있다. N은 항상 3이다. 입력 첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 배열 A의 원소 10개가 공백으로 구분되어 주어진다. 이 원소는 1보다 크거나 같고, 1,000보다 작거나 같은 자연수이다. 출력 각 테스트 케이스에 대해 한 줄에 하나씩 배열 A에서 3번째 큰 값을 출력한다. 나의 풀이 t=int(input()) n=3 aa=[] for i in range(t):# 테스트 케이스 입력 a=list(map(int, input().split())) # 띄어쓰기로 슬라이싱하여 리스트화 aa.appe..
[백준] 2609. 최대공약수와 최소공배수 문제 두 개의 자연수를 입력받아 최대 공약수와 최소 공배수를 출력하는 프로그램을 작성하시오. 입력 첫째 줄에는 두 개의 자연수가 주어진다. 이 둘은 10,000이하의 자연수이며 사이에 한 칸의 공백이 주어진다. 출력 첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다. 나의 풀이 1) 시간초과로 실패! a, b=map(int, input().split()) for i in range(min(a,b),0,-1): # 최대공약수 if a%i==0 and b%i==0: print(i) break for i in range(max(a,b),a*b+1): # 최소공배수 if i%a==0 and i%b==0: print(i) break 최대공약수는 두 수..