백준/백준 파이썬

백준 파이썬 Today I Learn 2023.05.01

군청레프 2023. 5. 2. 22:40
728x90

5/01 파이썬 공부
1. 백준 2738 행렬 덧셈
첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 
이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다. 
N과 M은 100보다 작거나 같고, 행렬의 원소는 절댓값이 100보다 작거나 같은 정수이다.
첫째 줄부터 N개의 줄에 행렬 A와 B를 더한 행렬을 출력한다. 행렬의 각 원소는 공백으로 구분한다.


>>>코드
n, m = map(int, input().split())
o, p =[], []
for i in range(n):
    a = list(map(int, input().split()))
    o.append(a)
for l in range(n):
    b = list(map(int, input().split()))
    p.append(b)
for i in range(n):
    for l in range(m):
        print(o[i][l]+p[i][l], end=' ')
    print('')

>>> 코드 설명
행렬 크기 n,m  입력 받기
행렬 2개를 저장할 이차원의 리스트 o,p 선언
행의 개수 n만큼 반복하여 리스트를 입력 받고, 그걸 리스트에 요소로 추가
요소끼리 더해서 출력

1) a = list(map(int, input().split()))
공백 구분해서 숫자 입력받기& 리스트 저장

2) print('', end= ' ')
출력시 다음 출력 할 것을 공백을 구분자로 놓고 출력하기


2. 백준 2566 최댓값
첫째 줄부터 아홉 번째 줄까지 한 줄에 아홉 개씩 수가 주어진다. 주어지는 수는 100보다 작은 자연수 또는 0이다.
첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 위치한 행 번호와 열 번호를 빈칸을 사이에 두고 차례로 출력한다. 최댓값이 두 개 이상인 경우 그 중 한 곳의 위치를 출력한다.

>>> 코드
M, m = [], []
for i in range(9):
    a = list(map(int, input().split()))
    k = max(a)
    M.append(k)
    l = a.index(k)
    m.append(l)
MM = max(M)
ii = M.index(MM)
print(MM)
print('{} {}'.format(ii+1, m[ii]+1))

>>>코드 설명
9행 격자이므로
9번 반복하여 크기가 9인 리스트 입력 받기
리스트에서 최대값을 저장하는 리스트 M 만들기
리스트의 최대값의 index를 저장하는 리스트 m 만들기
M 리스트의 최대값(최종 최대값) 구하기
최종 최대값과 그 값의 index 출력

1) a = list(map(int, input().split()))
공백으로 구분하여 정수를 입력받고 리스트에 저장하기

2) 리스트.index('요소')
특정 리스트에서 '요소'가 차지하는 index 반환하기

3) print('%d %d', %( , ))
== print('{} {}'.format( , ))
{}나 %d에 뒤에 %(), .format()에 표기한 요소 출력하기


3. 백준 10798 세로 읽기
총 다섯줄의 입력이 주어진다. 각 줄에는 최소 1개, 최대 15개의 글자들이 빈칸 없이 연속으로 주어진다. 
주어지는 글자는 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’ 중 하나이다. 
각 줄의 시작과 마지막에 빈칸은 없다.
영석이가 세로로 읽은 순서대로 글자들을 출력한다. 이때, 글자들을 공백 없이 연속해서 출력한다.

>>> 코드
total = list(input() for i in range(5))
length = list(len(total[i]) for i in range(5))
ll = max(length)
for i in range(ll):
    for j in range(5):
        if length[j]>i :
            print(total[j][i], end='')

>>> 코드 설명
5번 반복하여 문자열을 입력받아 total 리스트에 저장
total 리스트의 각 요소의 길이를 저장하는 리스트 length 생성
각 요소들을 세로로 출력하는데
각 요소의 길이보다 i(열)가 작을 때만 요소 출력 및 띄어쓰기 생략

1) append 대신 리스트 입력받는 방법
a = list(input() for i in range(원하는 리스트의 길이))


4. 백준 2745 진법 변환
첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36)
B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다.
첫째 줄에 B진법 수 N을 10진법으로 출력한다.

>>> 코드
N, B = input().split()
B = int(B)
print(int(N, B))

1) n 진법 -> 10진법 변환 함수
int(string, base)
string 에는 변환시킬 n 진법 숫자(문자형)
base 에는 n

5. 백준 2444 별찍기 7
예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.
첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.
첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

>>> 예시
       *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *

>>> 코드
n = int(input())
for i in range(n):
    for j in range(n-i-1):
        print(' ',end ='')
    for k in range(2*i+1):
        print('*', end='')
    print()
for i in range(n-1):
    for j in range(i+1):
        print(' ', end = '')
    for k in range((n-i-1)*2-1):
        print('*', end = '')
    print()

>>> 코드 설명
빈칸의 개수는 입력 받은 n-1 부터 0까지 하나씩 줄어든다(예시에선 4,3,2,1,0)
별의 개수는 1부터 2n-1까지 2개씩 증가(예시에선 1, 3, 5, 7, 9)
그리고 다시 역순
이 규칙에만 따라서 반복출력하면 된다

1) print(' ',end='')
다음 것 공백없이 출력

2)print()
아무것도 안쓰면 그냥 출력없이 다음줄로 이동

6. 백준 10812 바구니 순서 바꾸기
첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.
둘째 줄부터 M개의 줄에는 바구니의 순서를 바꾸는 만드는 방법이 주어진다. 
방법은 i, j, k로 나타내고, 왼쪽으로부터 i번째 바구니부터 j번째 바구니의 순서를 회전시키는데, 
그 때 기준 바구니는 k번째 바구니라는 뜻이다. (1 ≤ i ≤ k ≤ j ≤ N)
도현이가 선택한 바구니의 범위가 begin, end이고, 기준이 되는 바구니를 mid라고 했을 때, begin, begin+1, ..., mid-1, mid, mid+1, ..., end-1, end 순서로 되어있는 바구니의 순서를 mid, mid+1, ..., end-1, end, begin, begin+1, ..., mid-1로 바꾸게 된다.
도현이는 입력으로 주어진 순서대로 바구니의 순서를 회전시킨다.
모든 순서를 회전시킨 다음에, 가장 왼쪽에 있는 바구니부터 바구니에 적혀있는 순서를 공백으로 구분해 출력한다.

>>>코드1
N, M = map(int, input().split())
a = list(i+1 for i in range(N))
for o in range(M):
    i, j, k = map(int, input().split())
    b =[]
    for q in range(k-1, j):
        b.append(a[q])
    for q in range(i-1, k):
        b.append(a[q])
    w = 0
    for q in range(i-1, j):
        a[q] = b[w]
        w+=1
for i in range(N):
    print(a[i], end= ' ')

>>> 코드 설명
N,M 에 각각 숫자 입력받기
N의 길이만큼 1부터 N까지 저장되어있는 리스트 저장
M 만큼 반복하면서, i,j,k 입력받고,
순서바꾼 리스트를 새로 생성하고 다시 i,j 구역에 치환하기
공백 구분으로 바뀐 리스트 출력

>>>코드2
N, M = map(int, input().split())
a = list(i+1 for i in range(N))
for o in range(M):
    i, j, k = map(int, input().split())
    a = a[:i-1]+ a[k-1:j]+ a[i-1: k-1]+ a[j:]
for i in range(N):
    print(a[i], end= ' ')

>>>코드 설명
N,M 에 각각 숫자 입력받기
N의 길이만큼 1부터 N까지 저장되어있는 리스트 저장
M 만큼 반복하면서, i,j,k 입력받고,
리스트를 i,j,k 기준으로 구역을 나누어 더하기로 정렬
공백 구분으로 바뀐 리스트 출력

1) a, b, c = map(int, input().split())
공백으로 구분하여 정수를 입력받고 각각 변수에 저장하기

2) append 대신 리스트 입력받는 방법
a = list(input() for i in range(원하는 리스트의 길이))

3) 리스트 + 리스트
a = [1, 2, 3]
b = [4, 5]
a+b = [1, 2, 3, 4, 5]

4) 리스트 슬라이싱
a[:i]: 처음부터 i-1번쨰 요소까지 슬라이싱
a[j:]: j부터 끝 요소까지 슬라이싱
a[i:j]: i번째 요소부터 j-1번째 요소까지 슬라이싱

7. 백준 10988번 팰린드롬인지 확인하기
알파벳 소문자로만 이루어진 단어가 주어진다. 
이때, 이 단어가 팰린드롬인지 아닌지 확인하는 프로그램을 작성하시오.
팰린드롬이란 앞으로 읽을 때와 거꾸로 읽을 때 똑같은 단어를 말한다. 
첫째 줄에 단어가 주어진다. 
단어의 길이는 1보다 크거나 같고, 100보다 작거나 같으며, 알파벳 소문자로만 이루어져 있다.
첫째 줄에 팰린드롬이면 1, 아니면 0을 출력한다.

>>>코드1
s = list(input())
l = len(s)
if l>1:
    for i in range(l//2):
        if s[i] == s[l-i-1]:
            if i == l//2-1:
                print(1)
        else:
            print(0)
            break
else:
    print(1)

>>>코드설명
문자열s 입력받기
문자열의 길이 변수 l에 저장
문자열의 길이가 1보다 큰 경우에 길이의 절반 만큼 반복하여
문자열의 i번째 문자와 l-i번쨰 문자가 같은 것을 전부 반복하여 확인했을때 1출력
아니면 0출력하고 break 
문자열의 길이가 1인 경우는 어떠한 경우에도 팰린드롬이므로 1 출력

>>>코드2
s = list(input())
if s == list(reversed(s)):
    print(1)
else:
    print(0)

>>> 코드설명
문자열s 입력받기
만약 s와 s의 역순 리스트(list(reversed(s)))가 같을 시 1 출력
다를 시 0 출력

1) continue, break
for 이나 while 반복문 시에
continue: 다음 반복으로 넘어가기
break: 반복문 중지

2)len(문자열)
문자열의 길이 반환

3) 역순 반환함수 reversed(s)와 s.reverse()의 차이점
-s.reverse(): 
리스트 제공 함수. 즉, 리스트(문자열 포함)에만 사용가능, 튜플 딕셔너리 사용 불가
값을 반환하지 않는다. 원래 리스트를 변환함. 즉, 변수에 저장이 불가능 하다

-reversed(s): 
파이썬 내장 함수. 리스트(문자열 포함), 튜플 모두 사용가능, 딕셔너리는 순서가 없는 자료형이라 사용 불가
객체 값을 반환한다. 원래 리스트를 변환 하지 않는다. 즉, 변수에 저장이 가능하다.

728x90