728x90

백준 C언어 공부 2024.11.20
2577번 숫자의 개수

1. 문제
세 개의 자연수 A, B, C가 주어질 때 A × B × C를 계산한 결과에 
0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오.

예를 들어 
A = 150, B = 266, C = 427 이라면 
A × B × C = 150 × 266 × 427 = 17037300 이 되고, 
계산한 결과 17037300 에는 0이 3번, 1이 1번, 3이 2번, 7이 2번 쓰였다.

2. 입력
첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. 
A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다.

3. 출력
첫째 줄에는 A × B × C의 결과에 0 이 몇 번 쓰였는지 출력한다. 
마찬가지로 둘째 줄부터 열 번째 줄까지 A × B × C의 결과에 
1부터 9까지의 숫자가 각각 몇 번 쓰였는지 차례로 한 줄에 하나씩 출력한다.

>>>코드

#include<stdio.h>

int main(){
    int a, b, c;
    scanf("%d", &a);
    scanf("%d", &b);
    scanf("%d", &c);
    
    int result = a*b*c;
    int cnt[10] = {0};
    while (result > 0){
        cnt[result%10]++;
        result /= 10;
    }
    
    for (int i = 0; i<10; i++){
        printf("%d\n", cnt[i]);
    }
    
    return 0;
}



4. 문제링크
https://www.acmicpc.net/problem/2577

728x90
728x90

백준 파이썬 공부 2024.11.13
30802번 웰컴 키트

1) 문제
2024년 2월 3일 개최 예정인 온사이트 그랜드 아레나에서는 
참가자들에게 티셔츠 한 장과 펜 한 자루가 포함된 웰컴 키트를 나눠줄 예정입니다. 
키트를 제작하는 업체는 다음과 같은 조건으로만 주문이 가능합니다.

티셔츠는 S, M, L, XL, XXL, 그리고 XXXL의 6가지 사이즈가 있습니다. 
- 티셔츠는 같은 사이즈의 T장 묶음으로만 주문할 수 있습니다.
은 한 종류로, P자루씩 묶음으로 주문하거나 한 자루씩 주문할 수 있습니다.

총 N명의 참가자 중 S, M, L, XL, XXL, XXXL 사이즈의 티셔츠를 신청한 사람은 
각각 S, M, L, XL, XXL, XXXL명입니다. 
티셔츠는 남아도 되지만 부족해서는 안 되고 신청한 사이즈대로 나눠주어야 합니다. 
펜은 남거나 부족해서는 안 되고 정확히 참가자 수만큼 준비되어야 합니다.

티셔츠를 T장씩 최소 몇 묶음 주문해야 하는지, 
그리고 펜을 P자루씩 최대 몇 묶음 주문할 수 있고, 
그 때 펜을 한 자루씩 몇 개 주문하는지 구하세요.

2) 입력
첫 줄에 참가자의 수 N이 주어집니다. 
(1 <= N <= 10^9) 

둘째 줄에 티셔츠 사이즈별 신청자의 수 S, M, L, XL, XXL, XXXL이 공백으로 구분되어 주어집니다. 
(0 <= S, M, L, XL, XXL, XXXL <= N; S + M + L + XL + XXL + XXXL = N) 

셋째 줄에 정수 티셔츠와 펜의 묶음 수를 의미하는 정수 T와 P가 공백으로 구분되어 주어집니다. 
(2 <= T, P <= 10^9)

3) 출력
첫 줄에 티셔츠를 T장씩 최소 몇 묶음 주문해야 하는지 출력하세요.
다음 줄에 펜을 P자루씩 최대 몇 묶음 주문할 수 있는지와, 
그 때 펜을 한 자루씩 몇 개 주문하는지 구하세요.

4) 코드

n = int(input())
size = list(map(int, input().split()))
t, p = map(int, input().split())

shirts = 0
for i in range(6):
    if size[i] % t == 0:
        shirts += size[i]//t
    else:
        shirts += size[i]//t + 1

print(shirts)
print(n//p, n%p)



간단한 계산 문제

5) 문제 링크
https://www.acmicpc.net/problem/30802

728x90
728x90

6.1 반복문 개요

1. 제어문
- C언어는 순차처리언어로, 특별한 지정이 없으면, 소스코드 첫 줄 부터 차례대로 처리
- 그러나 문제해결 위해 처리 흐름 제어 필요 >> 제어문
- 에시) 조건문, 반복문

2. 반복문
- 특정 조건을 만족하는 동안 계속 반복하여 실행하는 문장
- 루프(loop)라고도 불림
while 문, do-while 문, for 문

6.2 while 문

1. while 문 구조
- 조건식이 참인 동안 중괄호로 둘러싸인 블록 안의 문장 반복
- 조건식이 거짓이 되면 while문 빠져나옴
- 반복할 문장이 하나이면 중괄호 생략 가능

- 코드 구조

while(조건식){
	반복할 문장;
}



6.3 do-while 문

1. do- while 문 구조
- 반복할 문장을 실행한 후에 조건식 검사
- 반복문 내에 있는 문장을 최소한 한번 실행하고자 할 떄 유용
- 마지막에 세미 콜론을 반드시 써야한다

- 코드 구조

do{
	반복할 문장;
} while(조건식);



6.4 for 문

1. for 문 구조
- 일반적으로 반복하는 횟수가 정해진 경우에 사용
- 초기식; 조건식; 증감식으로 구성되고, 세미콜론으로 구분
- 초기식은 처음 한번만 수행
- 이후 조건식 >> 반복할 문장 >> 증감식이 반복적으로 시행

- 코드 구조

for(초기식; 조건식; 증감식){
	반복할 문장;
}



2. for 문의 상세 동작 방식
- 초기식을 수행
- 조건식 검사
- 조건식의 값이 거짓이면 for 문의 실행 종료
- 조건식의 값이 참이면 문장이 실행
- 증감을 실행하고 조건식 검사로 돌아감

3. for 문의 자주 활용되는 형태

1) for( ; 조건식 ; 증감식) : 빈 초기식

2) for( 변수선언 및 초기화 ; 조건식 ; 증감식)
3) for( 여러개의 초기식(콤마 구분) ; 조건식 ; 증감식)
3) for( 초기식 ; 조건식 ; ) : 빈 증감식
4) for( 여러개의 초기식 ; 조건식 ; 여러개의 증감식)
5) for( 초기식 ; ; 증감식) : 빈 조건식 == 무한 루프

6.5 중첩 반복
- 반복문에서 반복 대상은 어떤문장이든 가능
- 반복문 안에 또 다른 반복문이 오는 경우를 중첩 반복이라 함

6.6 반복문 기타
- 반복문의 실행 상태를 직접 제어하고자 break문과 continue문을 사용한다

1. break문
- 현재 사용중인 반복문을 중단하고 제어를 반복문 바깥으로 이동

2. continue문
- 현재 수행중인 반복문에서 현재 조건 값에 대한 처리를 중단하고, 다음 조건 값에 대한 처리를 수행
- 결과적으로 continue문과 반복문 마지막 부분 사이에 있는 문장은 실행되지 않음

3. 무한 반복
- 일반적으로는 반복문에서는 조건을 지정하여 조건에 맞는 경우에만 반복을 시킴
- 경우에 따라서는 반복이 무한히 지속되는 무한 반복을 사용하는 경우도 있음
- continue문과 break문으로 반복문 중간에 제어를 마음대로 조정 가능
- 남용하면 프로그램의 가독성에 악영향을 줌

방법 1) while 반복문 이용

while(1){
	반복할 문장;
}



방법 2) for 반복문 이용

for( ; ; ){
	반복할 문장;
}



4. 반복문 작성시 강력 권장사항
- break문, continue문, 무한반복을 최대한 사용하지 않고 코딩하라
- 반복문의 형식에 맞추어 코드를 작성하라
- 편한대로 코드를 작성하다보면, 반복 조건이나 반복이 종료된 후에 할 일을 반복문 내부에 작성하는 경우 많음

5. 코딩을 잘하려면
가독성 좋은 코드를 작성해야한다
>> 논리구조가 간단해져서 이해하기 쉽다
>> 코드가 단순해진다
>> 버그생길 가능성도 적고, 디버깅하기도 쉽다
>> 결국 프로그램을 정확하고 빠르게 작성할 수 있다.

728x90
728x90

20240523 백준 파이썬 공부
1043번 거짓말

1. 문제
지민이는 파티에 가서 이야기 하는 것을 좋아한다. 
파티에 갈 때마다, 지민이는 지민이가 가장 좋아하는 이야기를 한다. 
지민이는 그 이야기를 말할 때, 있는 그대로 진실로 말하거나 엄청나게 과장해서 말한다. 
당연히 과장해서 이야기하는 것이 훨씬 더 재미있기 때문에, 되도록이면 과장해서 이야기하려고 한다. 
하지만, 지민이는 거짓말쟁이로 알려지기는 싫어한다. 
문제는 몇몇 사람들은 그 이야기의 진실을 안다는 것이다. 
따라서 이런 사람들이 파티에 왔을 때는, 지민이는 진실을 이야기할 수 밖에 없다. 
당연히, 어떤 사람이 어떤 파티에서는 진실을 듣고, 또다른 파티에서는 과장된 이야기를 들었을 때도 
지민이는 거짓말쟁이로 알려지게 된다. 
지민이는 이런 일을 모두 피해야 한다.

사람의 수 N이 주어진다. 
그리고 그 이야기의 진실을 아는 사람이 주어진다. 
그리고 각 파티에 오는 사람들의 번호가 주어진다. 
지민이는 모든 파티에 참가해야 한다. 
이때, 지민이가 거짓말쟁이로 알려지지 않으면서, 
과장된 이야기를 할 수 있는 파티 개수의 최댓값을 구하는 프로그램을 작성하시오.

2. 입력
첫째 줄에 사람의 수 N과 파티의 수 M이 주어진다.

둘째 줄에는 이야기의 진실을 아는 사람의 수와 번호가 주어진다. 
진실을 아는 사람의 수가 먼저 주어지고 그 개수만큼 사람들의 번호가 주어진다. 
사람들의 번호는 1부터 N까지의 수로 주어진다.

셋째 줄부터 M개의 줄에는 각 파티마다 오는 사람의 수와 번호가 같은 방식으로 주어진다.

N, M은 50 이하의 자연수이고, 
진실을 아는 사람의 수는 0 이상 50 이하의 정수, 각 파티마다 오는 사람의 수는 1 이상 50 이하의 정수이다.

3. 출력
첫째 줄에 문제의 정답을 출력한다.

>>>코드

import sys
# n과 m 입력받기
n, m = map(int, sys.stdin.readline().split())
# 거짓을 알고있는 사람의 집합 Truth
truth = set(map(int, sys.stdin.readline().split()[1:]))
# 각 파티에 참가하는 인원 저장 및 진실을 아는 사람과 같은 파티인 경우 Truth에 추가
party = []
for i in range(m):
    people = set(map(int, sys.stdin.readline().split()[1:]))
    party.append(people)
while True:
    check = set(truth)
    for person in party:
        if truth & person:
            truth.update(person)
    if check == truth:
        break
# 진실을 알고있는 사람이 없는 파티의 수만 확인
cnt = 0
for person in party:
    if not (truth & person):
        cnt += 1
print(cnt)



>>>문제링크
https://www.acmicpc.net/problem/1043

728x90
728x90

20240517 백준 파이썬 공부
3040번 백설 공주와 일곱 난쟁이

1. 문제
매일 매일 일곱 난쟁이는 광산으로 일을 하러 간다. 
난쟁이가 일을 하는 동안 백설공주는 그들을 위해 저녁 식사를 준비한다. 
백설공주는 의자 일곱개, 접시 일곱개, 나이프 일곱개를 준비한다.

어느 날 광산에서 아홉 난쟁이가 돌아왔다. (왜 그리고 어떻게 아홉 난쟁이가 돌아왔는지는 아무도 모른다) 
아홉 난쟁이는 각각 자신이 백설공주의 일곱 난쟁이라고 우기고 있다.

백설공주는 이런 일이 생길 것을 대비해서, 난쟁이가 쓰고 다니는 모자에 100보다 작은 양의 정수를 적어 놓았다. 
사실 백설 공주는 공주가 되기 전에 매우 유명한 수학자였다. 
따라서, 일곱 난쟁이의 모자에 쓰여 있는 숫자의 합이 100이 되도록 적어 놓았다.

아홉 난쟁이의 모자에 쓰여 있는 수가 주어졌을 때, 일곱 난쟁이를 찾는 프로그램을 작성하시오. 
(아홉 개의 수 중 합이 100이 되는 일곱 개의 수를 찾으시오)

2. 입력
총 아홉개 줄에 1보다 크거나 같고 99보다 작거나 같은 자연수가 주어진다. 
모든 숫자는 서로 다르다. 또, 항상 답이 유일한 경우만 입력으로 주어진다.

3. 출력
일곱 난쟁이가 쓴 모자에 쓰여 있는 수를 한 줄에 하나씩 출력한다.

>>>코드

little = []
for _ in range(9):
    little.append(int(input()))
x = sum(little) - 100
for i in range(9):
    for j in range(i+1, 9):
        if little[i]+little[j] == x:
            for k in range(9):
                if k != i and k != j:
                    print(little[k])
            break



>>>문제링크
https://www.acmicpc.net/problem/3040

728x90
728x90

202403025 백준 C언어 공부
11658번 소인수분해

1. 문제
정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.

2. 입력
첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.

3. 출력
N의 소인수분해 결과를 한 줄에 하나씩 오름차순으로 출력한다. 
N이 1인 경우 아무것도 출력하지 않는다.

>>>코드

# include <stdio.h>
int main(void){
    int n, copy;
    scanf("%d", &n);
    copy = n;
    for (int i = 2; i<=n; i++){
        if (copy == 1) break;
        while (1){
            if (copy%i == 0){
                printf("%d\n", i);
                copy /= i;
            }
            else break;
        }
    }
    
    return 0;
}



>>>문제링크
https://www.acmicpc.net/problem/11653

728x90
728x90

20240323 백준 C언어 공부
1978번 소수 찾기

1. 문제
주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.

2. 입력
첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 
다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.

3. 출력
주어진 수들 중 소수의 개수를 출력한다.

>>>코드

# include <stdio.h>
int main(void){
    int n, x, flag, cnt = 0;
    scanf("%d", &n);
    for (int i = 0; i<n; i++){
        scanf("%d", &x);
        flag = 1;
        for (int j = 2; j<x; j++){
            if (x%j == 0){
                flag = 0;
                break;
            }
        }
        if (flag == 1 && x != 1) cnt++;
    }
    printf("%d", cnt);
    
    return 0;
}



>>>문제링크
https://www.acmicpc.net/problem/1978

728x90
728x90

20240321 백준 C언어 공부
2501번 약수 구하기

1. 문제
어떤 자연수 p와 q가 있을 때, 만일 p를 q로 나누었을 때 나머지가 0이면 q는 p의 약수이다. 

6을 예로 들면
- 6 ÷ 1 = 6 … 0
- 6 ÷ 2 = 3 … 0
- 6 ÷ 3 = 2 … 0
- 6 ÷ 4 = 1 … 2
- 6 ÷ 5 = 1 … 1
- 6 ÷ 6 = 1 … 0

그래서 6의 약수는 1, 2, 3, 6, 총 네 개이다.
두 개의 자연수 N과 K가 주어졌을 때, N의 약수들 중 K번째로 작은 수를 출력하는 프로그램을 작성하시오.

2. 입력
첫째 줄에 N과 K가 빈칸을 사이에 두고 주어진다. 
N은 1 이상 10,000 이하이다. K는 1 이상 N 이하이다.

3. 출력
첫째 줄에 N의 약수들 중 K번째로 작은 수를 출력한다. 
만일 N의 약수의 개수가 K개보다 적어서 K번째 약수가 존재하지 않을 경우에는 0을 출력하시오.

>>>코드

# include <stdio.h>
int main(void){
    int n, k, cnt = 0;
    scanf("%d %d", &n, &k);
    for (int i = 1; i<=n; i++){
        if (n%i == 0){
            cnt++;
        }
        if (cnt == k){
            printf("%d", i);
            break;
        }
    }
    if (cnt < k) printf("0");
}


>>>문제링크
https://www.acmicpc.net/problem/2501

728x90

+ Recent posts