728x90
반응형

11/ 26 파이썬 공부
1. 백준 11651번 좌표 정렬하기

1) 문제
2차원 평면 위의 점 N개가 주어진다. 
좌표를 y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬한 다음 
출력하는 프로그램을 작성하시오.

2) 입력
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 
둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 
좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

3) 출력
첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.

>>>코드

import sys
# 좌표 저장할 리스트 생성
coordinate = []
for _ in range(int(sys.stdin.readline())):
    # 좌표 입력받기
    x, y = map(int, sys.stdin.readline().split())
    # 저장
    coordinate.append([x, y])
# key lambda 함수로 y좌표 다음 x좌표를 우선순위로 하는 기준으로 오름차순 정렬
coordinate = sorted(coordinate, key = lambda x: (x[1], x[0]))
# 출력
for i in range(len(coordinate)):
    print(coordinate[i][0], coordinate[i][1])



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

728x90
반응형
728x90
반응형

11/ 25 파이썬 공부
1. 백준 1427번 소트인사이드

1) 문제
배열을 정렬하는 것은 쉽다. 수가 주어지면, 그 수의 각 자리수를 내림차순으로 정렬해보자.

2) 입력
첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.

3) 출력
첫째 줄에 자리수를 내림차순으로 정렬한 수를 출력한다.

>>>코드

# 숫자를 문자열 형식으로 입력 받기
n = input()
# 문자열(각 자리수)를 내림차순으로 정렬하기
n = sorted(n, reverse = True)
# 합쳐서 출력하기
print(''.join(n))


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

728x90
반응형
728x90
반응형

11/ 24 파이썬 공부
1. 백준 25305번 커트라인

1) 문제
2022 연세대학교 미래캠퍼스 슬기로운 코딩생활에 N명의 학생들이 응시했다.
이들 중 점수가 가장 높은 k명은 상을 받을 것이다. 이 때, 상을 받는 커트라인이 몇 점인지 구하라.
커트라인이란 상을 받는 사람들 중 점수가 가장 가장 낮은 사람의 점수를 말한다.

2) 입력
첫째 줄에는 응시자의 수 N과 상을 받는 사람의 수 k가 공백을 사이에 두고 주어진다.

둘째 줄에는 각 학생의 점수 x가 공백을 사이에 두고 주어진다.

3) 출력
상을 받는 커트라인을 출력하라.

4) 제한
- 1 ≤ N ≤ 1,000 
- 1 ≤ k ≤ N 
- 0 ≤ x ≤ 10,000 

>>>코드

# n 과 k 입력받기
n, k = map(int, input().split())
# 한 줄에 각 인원의 성적을 입력받아 리스트에 저장 후 내림차순으로 정렬
score = sorted(list(map(int, input().split())), reverse = True)
# 처음에서 k번째 성적 출력
print(score[k-1])


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

728x90
반응형
728x90
반응형

11/ 23 파이썬 공부
1. 백준 2587번 대표값2

1) 문제
어떤 수들이 있을 때, 그 수들을 대표하는 값으로 가장 흔하게 쓰이는 것은 평균이다. 
평균은 주어진 모든 수의 합을 수의 개수로 나눈 것이다. 
예를 들어 10, 40, 30, 60, 30의 평균은 (10 + 40 + 30 + 60 + 30) / 5 = 170 / 5 = 34가 된다.

평균 이외의 또 다른 대표값으로 중앙값이라는 것이 있다. 
중앙값은 주어진 수를 크기 순서대로 늘어 놓았을 때 가장 중앙에 놓인 값이다. 

예를 들어 10, 40, 30, 60, 30의 경우, 크기 순서대로 늘어 놓으면

10 30 30 40 60

이 되고 따라서 중앙값은 30이 된다.

다섯 개의 자연수가 주어질 때 이들의 평균과 중앙값을 구하는 프로그램을 작성하시오.

2) 입력
첫째 줄부터 다섯 번째 줄까지 한 줄에 하나씩 자연수가 주어진다. 
주어지는 자연수는 100 보다 작은 10의 배수이다.

3) 출력
첫째 줄에는 평균을 출력하고, 둘째 줄에는 중앙값을 출력한다. 평균과 중앙값은 모두 자연수이다.

>>> 코드

n = []
for _ in range(5):
    n.append(int(input()))
n = sorted(n)
print(sum(n)//5)
print(n[2])



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

728x90
반응형
728x90
반응형

11/ 22 파이썬 공부
1. 백준 2563번 색종이

1) 문제
가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 
이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 
색종이의 변과 도화지의 변이 평행하도록 붙인다. 
이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 
색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.

<그림>


예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 
검은색 영역의 넓이는 260이 된다.

2) 입력
첫째 줄에 색종이의 수가 주어진다. 
이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 
색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 
색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다

3) 출력
첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.

>>>코드: 몬테카를로 적분법 이용하기

# 0으로 채워진 100 * 100 용지 만들기
paper = [[0] * 100 for i in range(100)]
for _ in range(int(input())):
    x, y = map(int, input().split()) # x, y 좌표 입력받기
    for i in range(x, x+10):
        for j in range(y, y+10):
            paper[i][j] = 1 # 색종이에 해당하는 범위 1로 만들기 
result = 0
# 전체 용지에서 1인 부분의 합 구하기
for i in range(100):
    result += sum(paper[i])
# 출력하기
print(result)

 

 

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

728x90
반응형
728x90
반응형

11/ 21 파이썬 공부
1. 백준 1018번 체스판 다시 칠하기

1) 문제
지민이는 자신의 저택에서 MN개의 단위 정사각형으로 나누어져 있는 M×N 크기의 보드를 찾았다. 
어떤 정사각형은 검은색으로 칠해져 있고, 나머지는 흰색으로 칠해져 있다. 
지민이는 이 보드를 잘라서 8×8 크기의 체스판으로 만들려고 한다.

체스판은 검은색과 흰색이 번갈아서 칠해져 있어야 한다. 
구체적으로, 각 칸이 검은색과 흰색 중 하나로 색칠되어 있고, 
변을 공유하는 두 개의 사각형은 다른 색으로 칠해져 있어야 한다. 
따라서 이 정의를 따르면 체스판을 색칠하는 경우는 두 가지뿐이다. 
하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우이다.

보드가 체스판처럼 칠해져 있다는 보장이 없어서, 
지민이는 8×8 크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야겠다고 생각했다. 
당연히 8*8 크기는 아무데서나 골라도 된다. 
지민이가 다시 칠해야 하는 정사각형의 최소 개수를 구하는 프로그램을 작성하시오.

2) 입력
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 
둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

3) 출력
첫째 줄에 지민이가 다시 칠해야 하는 정사각형 개수의 최솟값을 출력한다.

>>>코드

n, m = map(int, input().split()) # 주어진 체스판 재료의 크기 입력
chess = [] # 체스판 재료를 입력받을 리스트
paint = [] # 필요한 색칠 횟수를 저장할 리스트
for _ in range(n):
    chess.append(input()) # 체스판 재료 입력받기
for i in range(n-7): # 체스판의 크기는 8*8이므로 재료 내에서 가능한 범위 모두 검사
    for j in range(m-7):
        case1 = 0 # 왼쪽 위가 검은색인 케이스
        case2 = 0 # 왼쪽 위가 흰색인 케이스
        for k in range(i, i+8):
            for l in range(j, j+8):
                if (k+l)%2 == 0: # 짝수 번째 칸 검사하기 ex) (0,0) (0,2) (2,2) (1,3)
                    if chess[k][l] == 'B':
                        case1 += 1
                    elif chess[k][l] == 'W':
                        case2 += 1
                elif (k+l)%2 != 0: # 홀수 번째 칸 검사하기 ex) (1,0) (0,1) (3,2) (0,3)
                    if chess[k][l] == 'B':
                        case2 += 1
                    elif chess[k][l] == 'W':
                        case1 += 1
        paint.append(min(case1, case2)) # 그중 가장 적은 횟수로 칠하는 법 리스트에 추가
print(min(paint)) # 최소 경우의 수 출력

 

좀 빡세다. 그래도 기본 틀은 모든 경우의 수를 계산해보는 브루트 포스 방식이다.

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

728x90
반응형
728x90
반응형

11/ 20 파이썬 공부
1. 백준 19532번 수학은 비대면강의입니다

1) 문제
수현이는 4차 산업혁명 시대에 살고 있는 중학생이다. 
코로나 19로 인해, 수현이는 버추얼 학교로 버추얼 출석해 버추얼 강의를 듣고 있다. 
수현이의 버추얼 선생님은 문자가 2개인 연립방정식을 해결하는 방법에 대해 강의하고, 
다음과 같은 문제를 숙제로 냈다.

다음 연립방정식에서 x와 y의 값을 계산하시오.
 
- ax+by=c
- dx+ey=f 

4차 산업혁명 시대에 숙제나 하고 앉아있는 것보다 버추얼 친구들을 만나러 가는 게 더 가치있는 일이라고 생각했던 수현이는 이런 연립방정식을 풀 시간이 없었다. 
다행히도, 버추얼 강의의 숙제 제출은 인터넷 창의 빈 칸에 수들을 입력하는 식이다. 
각 칸에는 -999 이상 999 이하의 정수만 입력할 수 있다. 
수현이가 버추얼 친구들을 만나러 버추얼 세계로 떠날 수 있게 도와주자.

2) 입력
정수 a, b, c, d, e, f가 공백으로 구분되어 차례대로 주어진다. (-999 <= a,b,c,d,e,f <= 999)

문제에서 언급한 방정식을 만족하는 (x,y)가 유일하게 존재하고, 
이 때 x와 y가 각각 -999 이상 999 이하의 정수인 경우만 입력으로 주어짐이 보장된다.

3) 출력
문제의 답인 x와 y를 공백으로 구분해 출력한다.

>>>코드

a, b, c, d, e, f = map(int, input().split())
for i in range(-999, 1000):
    for j in range(-999, 1000):
        if a*i + b*j == c and d*i +e*j == f:
            print(i, j)
            break



x, y로 가능한 수가 -999 ~ 999 까지의 정수로 제한되어있기 때문에 그냥 모든 경우의 수를 검사하는 방법인 브루트 포스로 해결 가능하다.

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

728x90
반응형
728x90
반응형

11/ 19 파이썬 공부
1. 백준 2231번 분해합

1) 문제
어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 
어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 
예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 
따라서 245는 256의 생성자가 된다. 
물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 
반대로, 생성자가 여러 개인 자연수도 있을 수 있다.

자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.

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

3) 출력
첫째 줄에 답을 출력한다. 생성자가 없는 경우에는 0을 출력한다.

>>>코드

n = int(input()) # 숫자 입력 받기
for i in range(1, n+1): # 1부터 n 까지 가능한 경우의 수 다 해보기
    m = sum(map(int, str(i))) # 각 자릿수 더하기
    if n == m + i: # 생성자를 찾은 경우
        print(i)
        break
    elif i == n: # 생성자를 못찾은 경우
        print(0)



처음에는 이를 해결할 수 있는 수학적인 방법이 있을줄 알고 고민했는데,
그냥 하나부터 열까지 다 더해보는 방법으로 푸는 문제였다.

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

728x90
반응형

+ Recent posts