파이썬 기초 100제 복습

Kiwoong Park·2023년 4월 8일
0

🚀직장 다니면서 온갖 paper work으로 녹슬고 있는 프로그래밍 뇌 재활운동의 일환
코드업(codeup.kr) 파이썬 100제에서 배우는 Python 기본기 정리하기

줄을 바꿔 입력과 출력하기

파이썬

a, b = input(), input()
print(b)
print(a)
# or 
print(b,a,sep="\n")

C

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

공백을 포함한 입출력

아래와 같이 print,를 통해 공백을 두고 출력할 수 있다.
파이썬

s=input()
print(s, s, s)

c언어

#include <stdio.h>
int main(){
    char a;
    scanf("%c",&a);
    printf("%c %c %c",a,a,a);
}

input().split(':') 를 사용하면 콜론 ':' 기호를 기준으로 자른다.
print(?, ?, sep=':') 를 사용하면 콜론 ':' 기호를 사이에 두고 값을 출력한다.
sep 는 분류기호(seperator)를 의미한다.

a, b = input().split(':')
print(a, b, sep=':')

split과 sep 활용

"연도.월.일"을 입력받아 "일-월-연도" 순서로 바꿔 출력해보자.
참고
y, m, d = input().split('.')
과 같이 변수들을 순서대로 나열하면 구분기호를 기준으로 잘라 순서대로 저장한다.

y, m, d = input().split('.')
print(d,m,y,sep='-')

아무것도 없는 공(empty) 문자는 작은 따옴표(') 2개를 붙여서 '' 로 표현한다.

a,b=input().split('-')
print(a,b,sep='')

단어 1개를 입력받아 나누어 출력하기

알파벳과 숫자로 이루어진 단어 1개가 입력된다.
입력받은 단어의 각 문자를 한 줄에 한 문자씩 분리해 출력한다.
예시
s = input()
print(s[0])
print(s[1])

아래 코드와 같이 s는 단어가 한 문자씩 a로 나뉘어 출력될 수 있다.

s=input()
for a in s:
    print(a)

입력
6자리 숫자로 이루어진 연월일(YYMMDD)이 입력된다.
출력
년도(YY) 월(MM) 일(DD)을 공백으로 구분해 한 줄로 출력한다.
참고

s = input()
print(s[0:2])

를 실행하면 0번째 문자부터 1번째 문자까지 잘라 출력한다.
s[a:b] 라고 하면, s라는 단어에서 a번째 문자부터 b-1번째 문자까지 잘라낸 부분을 의미한다.
다른 자르기 방법도 있다.

s = input()
print(s[0:2], s[2:4], s[4:6], sep=' ')
# or
s=input()
print(s[:2],s[2:4],s[4:])
#어차피 ,로 공백이 나오기 때문에 같은 출력이다.

단어 2개를 입력받아 이어붙이기(concatenate)

주요 개념
단어는 문자(character)들로 만든다.
문자들로 구성된 문장을 문자열(string)이라고 부른다.
문자열에는 공백문자(' ')가 포함될 수 있는데,
문자 1개는 길이가 1인 문자열이라고 할 수 있고, 공백문자(' ')가 없는 문자열은 단어(word)라고 할 수 있다.

일반적인 문장들은 공백으로 구분된 단어들로 만들어지기 때문에,
공백문자로 구분된 문장에서 단어를 잘라내기 위해서는 공백문자(' ')를 기준으로 자르면 된다.
키보드로 입력되는 것들은 기본적으로 문자열로 인식되고, 문자열끼리 더하기(+)를 실행하면,
두 문자열을 합쳐 연결한(concatenate) 결과
를 만들어 낸다.

정수 2개를 입력받아 합을 출력하기, map()의 활용법

정수 2개를 입력받아
합을 출력하는 프로그램을 작성해보자.
예시

a, b = input().split()
c = int(a) + int(b)
print(c)
# or 
a,b=map(int,input().split())
print(a+b)

10진 정수 입력받아 16진수로 출력하기

예시

a = input()
n = int(a) #입력된 a를 10진수 값으로 변환해 변수 n에 저장
print('%x'%n) #n에 저장되어있는 값을 16진수(hexadecimal) 소문자 형태 문자열로 출력

참고
10진수 형태로 입력받고
%x로 출력하면 16진수(hexadecimal) 소문자로 출력된다.
(%o로 출력하면 8진수(octal) 문자열로 출력된다.)

16진 정수 입력받아 8진수로 출력하기

예시

a = input()
n = int(a, 16)      #입력된 a를 16진수로 인식해 변수 n에 저장
print('%o' % n)  #n에 저장되어있는 값을 8진수(octal) 형태 문자열로 출력
### 요약하면 아래와 같음
a=int(input(),16)
print('%o'%a)

영문자를 입력받아 10진수 유니코드값으로 변환하기

예시

n = ord(input())
print(n)

참고
n = ord(input())
입력받은 문자를 10진수 유니코드 값으로 변환한 후, n에 저장한다.

ord( ) 는 어떤 문자의 순서 위치(ordinal position) 값을 의미한다.
실제로 각각의 문자들에는 연속된 정수 값이 순서에 따라 부여 되어 있다. A:65, B:66, C:67 ....
ord(c) : 문자 c 를 10진수로 변환한 값

🚦컴퓨터로 저장되고 처리되는 모든 데이터들은 2진수 형태로 정수화 되어야 하는데,
컴퓨터에 문자를 저장하는 방법으로 아스키코드(ASCII Code)나 유니코드(Unicode)가 자주 사용된다.

예를 들어, 영문 대문자 'A'는 10진수 값 65 로 표현하고,
2진수(binary digit) 값 1000001 로 바꾸어 컴퓨터 내부에 저장한다.

유니코드(unicode)는 세계 여러 나라의 문자를 공통된 코드 값으로 저장할 때 사용하는 표준 코드이다.

정수를 입력받아 유니코드 문자로 변환하기

c = int(input())
print(chr(c))  #c에 저장되어 있는 정수 값을 유니코드 문자(chracter)로 바꿔 출력한다. 

참고
입력은 기본적으로 모두 문자열로 입력되는 것이라고 할 수 있다.
따라서, 입력 값이 문자/문자열/정수/실수인지에 따라서 먼저 정확하게 변환시킨 다음에 사용하거나 계산하는 것이 좋다.

예를 들어 123 이 입력 되었다고 한다면, 이건 정수일까? 문자열일까?
조금 생각해보면, 입력된 것만 보고는 그 값이 어떤 데이터인지 알 수 없다는 것을 쉽게 이해할 수 있다.
따라서, 그 입력 값을 어떻게 해석하고 변환할 지에 대해서 명확하게 작성해 주어야 하는 것이다.

chr( )는 정수값->문자, ord( )는 문자->정수값 형태로 바꿔주는 서로 반대 방향으로 바꾸어 주는 기능을 한다.

print(chr(ord(input())+1))
# 위와 같이 작성하면 문자 1개를 받아 
# 다음 문자를 출력하게 된다.

단어와 문장 여러 번 출력하기

단어와 반복 횟수를 입력받아 여러 번 출력해보자.

w, n = input().split()
print(w*int(n))

문장 여러번 출력하기

print(int(input())*input())

참고
문자열 정수 또는 정수 문자열은 그 문자열을 여러 번 반복한 문자열을 만들어 준다.

나눈 몫과 나머지 계산하기

참고
python에서는 나눈 몫을 계산하는 연산자(//, floor division)를 제공한다.
a//b 와 같이 작성하면, a를 b로 나눈 몫(quotient)을 계산해준다.
프로그래밍언어에 따라 이렇게 몫을 계산해주는 연산자가 없는 경우도 있다.

python 언어에서는 나눈 나머지를 계산하는 연산자(%, remainder)를 제공한다.
a%b 와 같이 작성하면, a를 b로 나눈 나머지(remainder)를 계산해준다.

실수 1개 입력받아 소숫점이하 자리 변환하기

print( format(a, ".2f") )

참고
format(수, ".2f") 를 사용하면 원하는 자리까지의 정확도로 반올림 된 실수 값을 만들어 준다.
여기서 만들어진 값은 소수점 아래 3번째 자리에서 반올림한 값이다.

bool and not

bool()은 정수 값을 받아 0이면 False를, 0 외 다른 정수를 받으면 True를 반환한다.
반대로 출력하고 싶으면 not을 앞에 쓴다.

2개의 정수값이 입력될 때,
그 불 값이 모두 True 일 때에만 True 를 출력하는 프로그램을 작성해보자.
예시

a, b = input().split()
print(bool(int(a)) and bool(int(b)))
### or 
a,b=map(int,input().split())
print(bool(a and b))

비트단위로 AND 하여 출력하기(누구보다 짧게?!)

** 비트단위(bitwise)연산자는,
~(bitwise not), &(bitwise and), |(bitwise or), ^(bitwise xor),
<<(bitwise left shift), >>(bitwise right shift)
가 있다.
예를 들어 3과 5가 입력되었을 때를 살펴보면
3 : 00000000 00000000 00000000 00000011
5 : 00000000 00000000 00000000 00000101
3 & 5 : 00000000 00000000 00000000 00000001

이 연산을 이용하면 어떤 비트열의 특정 부분만 모두 0으로도 만들 수 있는데
192.168.0.31 : 11000000.10101000.00000000.00011111
255.255.255.0 : 11111111.11111111.11111111.00000000

bit연산자 AND 연산의 활용

두 개의 ip 주소를 & 연산하면
192.168.0.0 : 110000000.10101000.0000000.00000000 을 계산할 수 있다.

실제로 이 계산은 네트워크에 연결되어 있는 두 개의 컴퓨터가 데이터를 주고받기 위해
같은 네트워크에 있는지 아닌지를 판단하는데 사용된다.

이러한 비트단위 연산은 빠른 계산이 필요한 그래픽처리에서
마스크연산(특정 부분을 가리고 출력하는)을 수행하는 데에도 효과적으로 사용된다.

입력
2개의 정수가 공백을 두고 입력된다.
-2147483648 ~ +2147483647
출력
두 정수를 비트단위(bitwise)로 and 계산을 수행한 결과를 10진수로 출력한다.

print(eval(input().replace(" ","&")))

3항 연산자

3개의 요소로 이루어지는 3항 연산은
"x if C else y" 의 형태로 작성이 된다.

  • C : True 또는 False 를 평가할 조건식(conditional expression) 또는 값
  • x : C의 평가 결과가 True 일 때 사용할 값
  • y : C의 평가 결과가 True 가 아닐 때 사용할 값

조건식 또는 값이 True 이면 x 값이 사용되고, True가 아니면 y 값이 사용되도록 하는 코드이다.

예를 들어
0 if 123>456 else 1
과 같은 표현식의 평가값은 123 > 456 의 비교연산 결과가 False 이므로 1이 된다.

a,b=map(int,input().split())
print(a if a>b else b)

if, else, elif

점수(정수, 0 ~ 100)를 입력받아 평가를 출력해보자.
평가 기준
점수 범위 : 평가
90 ~ 100 : A
70 ~ 89 : B
40 ~ 69 : C
0 ~ 39 : D
로 평가되어야 한다.

정석 풀이

a=int(input())
if a>=90:
    print("A")
elif a>=70:
    print("B")
elif a>=40:
    print("C")
else:
    print("D")

숏코딩?!
아래와 같은 코드를 중첩 삼항 표현식이라고 한다.

a=int(input())
print("A" if a>=90 else "B" if a>=70 else "C" if a>=40 else "D")

다른 예제
평가를 문자(A, B, C, D, ...)로 입력받아 내용을 다르게 출력해보자.
평가 내용
평가 : 내용
A : best!!!
B : good!!
C : run!
D : slowly~
나머지 문자들 : what?

3항 중첩 연산자 풀이:

a=input()
print("best!!!" if a=="A" else "good!!" if a=="B" else "run!" if a=="C" else "slowly~" if a=="D" else "what?")

dictionary 자료 구조 활용 풀이

a=input()
print({'A': 'best!!!', 'B': 'good!!', 'C': 'run!', 'D': 'slowly~'}.get(a, 'what?'))

The get() method is used to retrieve the value associated with the input key a. If a is not found in the dictionary, the default value "what?" is returned.

월 입력받아 계절 출력하기

월 : 계절 이름
12, 1, 2 : winter
3, 4, 5 : spring
6, 7, 8 : summer
9, 10, 11 : fall

3항 중첩 연산자 활용법

m=int(input())//3
print("spring" if m==1 else "summer" if m==2 else "fall" if m==3 else "winter")

dictionary 데이터 구조 활용

m=int(input())//3
print({1:"spring",2:"summer",3:"fall"}.get(m,"winter"))

while 및 바다코끼리 연산자(:=)

파이썬 3.8이상에서 사용할 수 있는 바다코끼리 연산자는 할당과 동시에 비교를 할 수 있다.

임의의 정수가 줄을 바꿔 계속 입력된다.
-2147483648 ~ +2147483647, 단 개수는 알 수 없다.
0이 아니면 입력된 정수를 출력하고, 0이 입력되면 출력을 중단해보자.

정석 풀이

while True:
    a=input()
    a=int(a)
    if a==0:
        break
    else:
        print(a)

바다코끼리 연산자 이용 풀이

while(a:=int(input())):
    print(a)

정수 1개 입력받아 카운트다운 출력하기 : while, for, exec 활용 버전

정석 풀이

a=int(input())
while a!=0:
    print(a)
    a=a-1

짧은 버전

a=int(input())
while(a): # a가 0이면 알아서 false
    print(a)
    a-=1  # 파이썬의 증감연산자 활용

두줄 버전 - for문 및 range함수 활용

for a in range(int(input()), 0, -1):
    print(a)

두줄 버전#2 - exec 활용

a=int(input())
exec("print(a);a-=1;"*a)

위의 코드를 설명하면,
exec() 함수는 실행할 하나의 문자열 코드를 받아 실행하는 함수로,
문자열 "print(a);a-=1;"*aprint(a)a-=1가 semicolon으로 분리되었고, *a가 전체의 문자열을 반복(곱하기로 쓰인 (asterisk)이다. unpacking이나 가변인자용 가 아니고..)시키는데 쓰인다.

주사위 2개 던지기

1부터 n까지, 1부터 m까지 숫자가 적힌 서로 다른 주사위 2개를 던졌을 때,
나올 수 있는 모든 경우를 출력해보자.
예시 - 정석 풀이

n,m=map(int,input().split())
for i in range(1,n+1):
    for j in range(1,m+1):
        print(i,j)

조금 더 짧은 코드 - using list comprehension

n,m=map(int,input().split())
[print(i,j) for i in range(1,n+1)for j in range(1,m+1)]
  • The second line uses a list comprehension to generate a list of pairs (i, j) for all i in the range 1 to n inclusive and all j in the range 1 to m inclusive.
  • For each pair (i, j) in the list, the print function is called to output the values of i and j separated by a space.

r,g,b

기본 풀이

r,g,b=map(int,input().split())
for i in range(r):
    for j in range(g):
        for k in range(b):
            print(i,j,k)
print(r*g*b)

List comprehension 활용법

r,g,b = map(int, input().split())
[print(i, j, k) for i in range(r) for j in range(g) for k in range(b)]
print(r*g*b)

3의 배수는 통과 -

1부터 입력한 정수까지 1씩 증가시켜 출력하는 프로그램을 작성하되, 3의 배수인 경우는 출력하지 않도록 만들어보자.
예를 들면,
1 2 4 5 7 8 10 11 13 14 ...
와 같이 출력하는 것이다.
while 및 if 문 활용

n,i=int(input()),1
while(i<=n):
    if i%3:
        print(i,end=' ')
    i+=1

for문 및 list comprehension과 *(asterisk) unpacking 활용

print(*[i for i in range(1,int(input())+1) if i%3])

수열

a, b, c, d = map(int, input().split())
print(a * pow(b, d - 1) + c * (pow(b, d - 1) - 1) // (b - 1))

함께 문제 푸는 날(최대공약수 유클리드 호제법)

입력
같은 날 동시에 가입한 인원 3명이 규칙적으로 방문하는,
방문 주기가 공백을 두고 입력된다. (단, 입력값은 100이하의 자연수이다.)

출력
3명이 다시 모두 함께 방문해 문제를 풀어보는 날(동시 가입/등업 후 며칠 후?)을 출력한다.

Brute Force 3항 연산자로 가장 작은 수를 구하고, 가장 작은 수를 배수로 키우면서 최소공배수를 찾는 방법

a,b,c=map(int,input().split())
m = (a if a<b else b) if (a if a<b else b) < c else c
d = m
while(d%a or d%b or d%c):
   d+=m
print(d)

유클리드 호제법

a,b,c=map(int,input().split())
# 두 수 간의 최대공약수(GCD)를 재귀함수로 구하는 방법으로
# a와 b의 최대공약수는 b와 a%b의 최대공약수와 같다는 원리를 이용
# b가 0이 아닐 경우(`if b`) 0이 될 때까지 반복한다.
def gcd(a,b):
    return gcd(b, a%b) if b else a
l1 = a*b//gcd(a,b)
# 세 수의 경우 두 수(a,b)의 최소공배수(lcm)와 c간의 최소공배수를 구하는 방식
l2 = l1*c//gcd(l1,c)
print(l2)

성실한 개미 -

개미는 오른쪽으로 움직이다가 벽을 만나면 아래쪽으로 움직여 가장 빠른 길로 움직였다.
(오른쪽에 길이 나타나면 다시 오른쪽으로 움직인다.)
이에 호기심이 생긴 영일이는 그 개미를 미로 상자에 넣고 살펴보기 시작하였다.
미로 상자에 넣은 개미는 먹이를 찾았거나, 더 이상 움직일 수 없을 때까지
오른쪽 또는 아래쪽으로만 움직였다.
미로 상자의 구조가 0(갈 수 있는 곳), 1(벽 또는 장애물)로 주어지고,
먹이가 2로 주어질 때, 성실한 개미의 이동 경로를 예상해보자.
단, 맨 아래의 가장 오른쪽에 도착한 경우, 더 이상 움직일 수 없는 경우, 먹이를 찾은 경우에는
더이상 이동하지 않고 그 곳에 머무른다고 가정한다.
미로 상자의 테두리는 모두 벽으로 되어 있으며,
개미집은 반드시 (2, 2)에 존재하기 때문에 개미는 (2, 2)에서 출발한다.

입력
10*10 크기의 미로 상자의 구조와 먹이의 위치가 입력된다.

출력
성실한 개미가 이동한 경로를 9로 표시해 출력한다.

반복문(while) 풀이

m=[] # 2d 배열 선언
for i in range(12) :
  m.append([])
  for j in range(12) :
    m[i].append(0)
# 배열에 입력값 넣기
for i in range(10) :
  a=input().split()
  for j in range(10) :
    m[i+1][j+1]=int(a[j])
# 시작점
x = 2
y = 2
while True :
  if m[x][y] == 0 :
    m[x][y] = 9
  elif m[x][y] == 2 :
    m[x][y] = 9
    break

  if (m[x][y+1]==1 and m[x+1][y]==1) or (x==9 and y==9) :
    break

  if m[x][y+1] != 1 :
    y += 1
  elif m[x+1][y] != 1 :
    x += 1
    

for i in range(1, 11) :
  for j in range(1, 11) :
    print(m[i][j], end=' ')
  print()

dfs 풀이

arr=[[0]*10 for _ in range(10)]
for i in range(10):
    arr[i][:] = list(map(int, input().split()))
def dfs(a,b):
    if not arr[a][b]: arr[a][b]=9
    if arr[a][b]==2: 
        arr[a][b]=9
        return
    
    if not arr[a][b+1] or arr[a][b+1]==2: dfs(a,b+1)
    elif not arr[a+1][b] or arr[a+1][b]==2: dfs(a+1,b)
    else: return
dfs(1,1)
for i in range(10):
    print(*arr[i][:])

dfs 짧은 버전

# 입력받은 값 바로 2d 배열로 만들기
arr = [list(map(int,input().split())) for _ in range(10)]

def dfs(a, b):
    if not arr[a][b]:
        arr[a][b] = 9
    if arr[a][b] == 2:
        arr[a][b] = 9
        return
        # 3항 연산자 활용하여 if - elif 문 축약
    dfs(a,b+1) if not arr[a][b+1] or arr[a][b+1]==2 else \
    dfs(a+1,b) if not arr[a+1][b] or arr[a+1][b]==2 else None

dfs(1,1)
for row in arr:
    print(*row)
profile
You matter, never give up

0개의 댓글