728x90
반응형

20240310 백준 파이썬 공부
7568번 덩치

1. 문제
우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 
어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 
두 사람 A 와 B의 덩치가 각각 (x, y), (p, q)라고 할 때 x > p 그리고 y > q 이라면 우리는 A의 덩치가 B의 덩치보다 "더 크다"고 말한다. 
예를 들어 어떤 A, B 두 사람의 덩치가 각각 (56, 177), (45, 165) 라고 한다면 A의 덩치가 B보다 큰 셈이 된다. 
그런데 서로 다른 덩치끼리 크기를 정할 수 없는 경우도 있다. 
예를 들어 두 사람 C와 D의 덩치가 각각 (45, 181), (55, 173)이라면 몸무게는 D가 C보다 더 무겁고, 키는 C가 더 크므로, 
"덩치"로만 볼 때 C와 D는 누구도 상대방보다 더 크다고 말할 수 없다.

N명의 집단에서 각 사람의 덩치 등수는 자신보다 더 "큰 덩치"의 사람의 수로 정해진다. 
만일 자신보다 더 큰 덩치의 사람이 k명이라면 그 사람의 덩치 등수는 k+1이 된다. 
이렇게 등수를 결정하면 같은 덩치 등수를 가진 사람은 여러 명도 가능하다. 
아래는 5명으로 이루어진 집단에서 각 사람의 덩치와 그 등수가 표시된 표이다.

이름 (몸무게, 키) 덩치 등수
A (55, 185) 2
B (58, 183) 2
C (88, 186) 1
D (60, 175) 2
E (46, 155) 5

위 표에서 C보다 더 큰 덩치의 사람이 없으므로 C는 1등이 된다. 
그리고 A, B, D 각각의 덩치보다 큰 사람은 C뿐이므로 이들은 모두 2등이 된다. 
그리고 E보다 큰 덩치는 A, B, C, D 이렇게 4명이므로 E의 덩치는 5등이 된다. 위 경우에 3등과 4등은 존재하지 않는다. 
여러분은 학생 N명의 몸무게와 키가 담긴 입력을 읽어서 각 사람의 덩치 등수를 계산하여 출력해야 한다.

2. 입력
첫 줄에는 전체 사람의 수 N이 주어진다. 
그리고 이어지는 N개의 줄에는 각 사람의 몸무게와 키를 나타내는 양의 정수 x와 y가 하나의 공백을 두고 각각 나타난다.

3. 출력
여러분은 입력에 나열된 사람의 덩치 등수를 구해서 그 순서대로 첫 줄에 출력해야 한다. 
단, 각 덩치 등수는 공백문자로 분리되어야 한다.

>>>코드

size = [] # 몸의 크기를 입력받을 리스트 생성
for _ in range(int(input())):
    size.append(list(map(int, input().split()))) # 몸무게와 키 입력받아 저장
rank = [1] * len(size) # 등수를 저장할 리스트 생성
for i in range(len(size)):
    for j in range(len(size)):
        if size[i][0] < size[j][0]: # 만약 몸무게가 더 작고
            if size[i][1] < size[j][1]: # 만약 키도 더 작다면
                rank[i] += 1 # 순위가 하나씩 밀린다
            else:
                continue
        else:
            continue
for i in rank:
    print(i)





728x90
반응형
728x90
반응형

20240309 백준 파이썬 공부
1924번 2007년

1. 문제
오늘은 2007년 1월 1일 월요일이다. 그렇다면 2007년 x월 y일은 무슨 요일일까? 
이를 알아내는 프로그램을 작성하시오.

2. 입력
첫째 줄에 빈 칸을 사이에 두고 x(1 ≤ x ≤ 12)와 y(1 ≤ y ≤ 31)이 주어진다. 
참고로 2007년에는 1, 3, 5, 7, 8, 10, 12월은 31일까지, 4, 6, 9, 11월은 30일까지, 2월은 28일까지 있다.

3. 출력
첫째 줄에 x월 y일이 무슨 요일인지에 따라 SUN, MON, TUE, WED, THU, FRI, SAT중 하나를 출력한다.

>>>코드

month, date = map(int, input().split()) # 달과 날짜 입력받기
M = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] # 각 달의 날짜 수 저장한 리스트 생성
test = (sum(M[0:month-1]) + date) % 7 # 총 날짜 수 계산하기
# 이후 케이스에 따라 출력
if test == 0:
    print("SUN")
elif test == 1:
    print("MON")
elif test == 2:
    print("TUE")
elif test == 3:
    print("WED")
elif test == 4:
    print("THU")
elif test == 5:
    print("FRI")
else:
    print("SAT")


    

728x90
반응형
728x90
반응형

20240109 백준 C언어 공부
2739번 구구단

1. 문제
N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 
출력 형식에 맞춰서 출력하면 된다.

2. 입력
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 9보다 작거나 같다.

3. 출력
출력형식과 같게 N*1부터 N*9까지 출력한다.

>>>코드

# include <stdio.h>
int main(){
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= 9; i++){
        printf("%d * %d = %d\n", n, i, n*i);
    }
}
728x90
반응형
728x90
반응형

20240107 백준 C언어 공부
2438번 별 찍기 - 1

1. 문제
첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제

2. 입력
첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

3. 출력
첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

>>>코드

# include <stdio.h>
int main(){
    int n;
    scanf("%d", &n);
    for(int i = 0; i<n; i++){
        for(int j = 0; j<=i; j++){
            printf("*");
        }
        printf("\n");
    }
}
728x90
반응형
728x90
반응형

20240105 백준 C언어 공부
1008번 A/B

1. 문제
두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.

2. 입력
첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)

3. 출력
첫째 줄에 A/B를 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-9 이하이면 정답이다.

>>>코드1. 실패

# include <stdio.h>
int main(){
     float a, b;
     scanf("%f %f", &a, &b);
     printf("%.9f", a/b);
 }


부동소수형 자료형중 float는 메모리가 4byte로서 유효자리수가 7자리까지 밖에 표현되지 않는다. 
그 이상을 가면 계산에 오류가 생긴다.

>>>코드2. 성공

# include <stdio.h>
int main(){
     double a, b;
     scanf("%lf %lf", &a, &b);
     printf("%.9f", a/b);
 }
728x90
반응형
728x90
반응형

20240103 백준 C언어 공부
1001번 A-B

1. 문제
두 정수 A와 B를 입력받은 다음, A-B를 출력하는 프로그램을 작성하시오.

2. 입력
첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)

3. 출력
첫째 줄에 A-B를 출력한다.

>>>코드

# include <stdio.h>
int main(){
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%d", a-b);
}
728x90
반응형
728x90
반응형

20240102 백준 C언어 공부
1000번 A+B

1. 문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

2. 입력
첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)

3. 출력
첫째 줄에 A+B를 출력한다.

>>>코드

# include <stdio.h>
int main(){
    int a, b;
    scanf("%d %d\n", &a, &b);
    printf("%d", a+b);
}
728x90
반응형
728x90
반응형

20240308 백준 파이썬 공부
18110번 solved.ac

1. 문제
solved.ac는 Sogang ICPC Team 학회원들의 알고리즘 공부에 도움을 주고자 만든 서비스이다. 
지금은 서강대뿐만 아니라 수많은 사람들이 solved.ac의 도움을 받아 알고리즘 공부를 하고 있다.

ICPC Team은 백준 온라인 저지에서 문제풀이를 연습하는데, 백준 온라인 저지의 문제들에는 난이도 표기가 없어서, 
지금까지는 다양한 문제를 풀어 보고 싶더라도 난이도를 가늠하기 어려워 무슨 문제를 풀어야 할지 판단하기 곤란했기 때문에 solved.ac가 만들어졌다. 
solved.ac가 생긴 이후 전국에서 200명 이상의 기여자 분들께서 소중한 난이도 의견을 공유해 주셨고, 지금은 약 7,000문제에 난이도 표기가 붙게 되었다.

어떤 문제의 난이도는 그 문제를 푼 사람들이 제출한 난이도 의견을 바탕으로 결정한다. 
난이도 의견은 그 사용자가 생각한 난이도를 의미하는 정수 하나로 주어진다. 
solved.ac가 사용자들의 의견을 바탕으로 난이도를 결정하는 방식은 다음과 같다.

아직 아무 의견이 없다면 문제의 난이도는 0으로 결정한다.
의견이 하나 이상 있다면, 문제의 난이도는 모든 사람의 난이도 의견의 30% 절사평균으로 결정한다.
절사평균이란 극단적인 값들이 평균을 왜곡하는 것을 막기 위해 가장 큰 값들과 가장 작은 값들을 제외하고 평균을 내는 것을 말한다. 
30% 절사평균의 경우 위에서 15%, 아래에서 15%를 각각 제외하고 평균을 계산한다. 
따라서 20명이 투표했다면, 가장 높은 난이도에 투표한 3명과 가장 낮은 난이도에 투표한 3명의 투표는 평균 계산에 반영하지 않는다는 것이다.

제외되는 사람의 수는 위, 아래에서 각각 반올림한다. 
25명이 투표한 경우 위, 아래에서 각각 3.75명을 제외해야 하는데, 이 경우 반올림해 4명씩을 제외한다.

마지막으로, 계산된 평균도 정수로 반올림된다. 절사평균이 16.7이었다면 최종 난이도는 17이 된다.
사용자들이 어떤 문제에 제출한 난이도 의견 목록이 주어질 때, solved.ac가 결정한 문제의 난이도를 계산하는 프로그램을 작성하시오.

2. 입력
첫 번째 줄에 난이도 의견의 개수 n이 주어진다. (0 ≤ n ≤ 3 × 10^5)

이후 두 번째 줄부터 1 + n번째 줄까지 사용자들이 제출한 난이도 의견 n개가 한 줄에 하나씩 주어진다. 모든 난이도 의견은 1 이상 30 이하이다.

3. 출력
solved.ac가 계산한 문제의 난이도를 출력한다.

>>>코드1 => 실패. 

n = int(input())
level = []
for _ in range(n):
    level.append(int(input()))
if len(level) == 0:
    print(0)
else:
    level.sort()
    m = round(0.15 * n)
    print(round(sum(level[m: n-m])/(n-m-m)))



설마 했으나 역시나 반올림 함수가 문제였다.
파이썬의 round함수는 특이하게 반올림을 하는데, 이를 오사오입이라고 한다.

- 오사오입
5 미만의 숫자는 내림, 5 초과의 숫자는 올림
만약 반올림할 자릿수가 5일 경우 5의 앞자리가 홀수인 경우 올림, 짝수인 경우 내림

예시)
round(0.5)
>>> 0
round(1.5)
>>> 2
round(2.5)
>>> 2

반대로 우리가 해야할 것은 진짜 반올림. 사사오입이다.

-사사오입
4 이하의 숫자는 내림, 5 이상의 숫자는 올림

그래서 반올림 함수를 만들었다.

>>>코드2. 반올림 함수 구현. (Pypy3에서만 시간초과가 안남)

# 사사오입 반올림 함수
def realround(a):
    if a - int(a) >= 0.5:
        return int(a)+1
    else:
        return int(a)
# 숫자 입력받고 level 리스트에 난이도 저장
n = int(input())
level = []
for _ in range(n):
    level.append(int(input()))
# 입력받은 난이도가 0개면 0 출력    
if len(level) == 0:
    print(0)
# 아닌 경우 절사평균 구하기   
else:
    level.sort()
    m = realround(0.15 * n)
    print(realround(sum(level[m: n-m])/(n-m-m)))
728x90
반응형

+ Recent posts