본문 바로가기

공부기록/파이썬

[파이썬][CodeUp]기초100문제

CodeUp Python 기초 100제를 풀고 헷갈리는 부분이나 중요한 개념 정리를 하였습니다.

기초 입출력

파이썬에서 print() 하면 그 다음줄로 줄 바꿈 되어 출력된다.

a = input()
b = input()
print(a)
print(b)
입력
a
b
출력
a
b

 

이런식으로 하면 입력 받을 때도 enter 기준으로 입력받게 되고, 출력도 enter 버튼 기준으로 입력받게 된다.

입력 받을 때 공백(띄어쓰기)을 두고 입력받고, 줄을 바꿔 출력하려면 input().split() 을 이용하면 된다.

python의 input()은 한 줄 단위로 입력을 받는다.
input().split() 를 사용하면, 공백을 기준으로 입력된 값들을 나누어(split) 자른다.
a, b = 1, 2
를 실행하면, a에는 1 b에는 2가 저장된다.

 

a,b = input().split()
print(b,a)
입력
a b
출력
b a

이렇게 하면 공백으로 입력받고, 공백으로 띄어 출력할 수 있다

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

print(?,?, sep=":") 사용하면 : 기호 사이에 두고 값을 출력한다
s[a:b] 라고 하면, s라는 단어에서 a번째 문자부터 b-1번째 문자까지 잘라낸 부분을 의미한다.

 

위에서 배운거 이용해보자

 

(6022번)
6자리의 연월일(YYMMDD)을 입력받아 나누어 출력해보자.
입력 200304
출력 20 03 04

s = input()
print(s[0:2],s[2:4],s[4:6],sep=" ")

 

(6024번)
알파벳 문자와 숫자로 이루어진 단어 2개를 입력받아
순서대로 붙여 출력하는 프로그램을 작성해보자.

입력 hello world
출력 helloworld
w1, w2 = input().split()
s = w1 + w2
print(s)

 

16진수 %x (대문자 16진수 %X)
8진수 %o

a = int(input())
print('%x'% a)  

10진수가 아닌 16진수나 8진수로 입력받고 싶을 때

# 16진수를 입력받아 8진수로 출력 
a = input()
n = int(a, 16)
print("%o" %n) 

 

n = ord(input()) #입력받은 문자를 10진수 유니코드 값으로 변환한 후, n에 저장한다.
ord( ) 는 어떤 문자의 순서 위치(ordinal position) 값을 의미한다.

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

 

(6033)
문자 1개를 입력받아 그 다음 문자를 출력해보자.
영문자 'A'의 다음 문자는 'B'이고, 숫자 '0'의 다음 문자는 '1'이다.

a = ord(input())
print(chr(a+1))

 

문자열 정수 또는 정수 문자열은 그 문자열을 여러 번 반복한 문자열을 만들어 준다.
python 언어에서는 거듭제곱을 계산하는 연산자(**)를 제공한다.

몫 출력 //
나머지 %

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

python 프로그래밍을 처음 배울 때 좋은 습관(단계)
1. 입력된 문자열을 정확하게 잘라낸다.(공백, 줄바꿈, 구분문자 등에 따라 정확하게 잘라낸다.)
2. 잘라낸 데이터들을 데이터형에 맞게 변환해 변수에 저장한다. (정수, 실수, 문자, 문자열 등에 따라 정확하게 변환한다.)
3. 값을 저장했다가 다시 사용하기 위해, 변수를 이용해 값을 저장하고, 변수를 이용해 계산을 한다.
4. 원하는 결과 값을 필요한 형태로 만들어 출력한다.(공백, 줄바꿈, 구분자, 등에 따라 원하는 형태로 만들어 출력한다.)

 

*2 를 계산한 값을 출력해도 되지만,
정수를 2배로 곱하거나 나누어 계산해 주는 비트단위시프트연산자 <<, >>를 이용할 수 있다.
컴퓨터 내부에는 2진수 형태로 값들이 저장되기 때문에,
2진수 형태로 저장되어 있는 값들을 왼쪽(<<)이나 오른쪽(>>)으로
지정한 비트 수만큼 밀어주면 2배씩 늘어나거나 1/2로 줄어드는데,

왼쪽 비트시프트(<<)가 될 때에는 오른쪽에 0이 주어진 개수만큼 추가되고,
오른쪽 비트시프트(>>)가 될 때에는 왼쪽에 0(0 또는 양의 정수인 경우)이나 1(음의 정수인 경우)이 개수만큼 추가되고,
가장 오른쪽에 있는 1비트는 사라진다.
** python에서 실수 값에 대한 비트시프트 연산은 허용되지 않고 오류가 발생한다.
(실수 값도 컴퓨터 내부적으로는 2진수 형태로 저장되고 비트시프트 처리가 될 수 있지만, python 에서는 허용하지 않는다.)

a << 1 => a ∗ 21
a << 2 => a ∗ 22
a << b => a ∗ 2b

비교/관계연산자는 <, >, <=, >=, ==(같다), !=(다르다) 6개가 있다.

비교/관계연산자 == (equal sign 2개) 는
왼쪽의 계산 결과값과 오른쪽의 계산 결과값이 같은 경우 True(참)로 계산하고,
그 외의 경우에는 False(거짓)로 계산한다.

비교/관계연산자 <= 는
오른쪽의 계산 결과값이 왼쪽의 계산 결과값보다 크거나 같은 경우 True(참)로 계산하고,
그 외의 경우에는 False(거짓)로 계산한다.

<=, >= 연산자는 같음(==)을 포함한다. 따라서 “작다/크다” 거나 "같다”는 의미를 가진다.
작다(<)/크다(>)/다르다(!) 기호는 등호(=)와 함께 왼쪽에 붙여써야 한다.

비교/관계연산자 != 는
왼쪽의 계산 결과값이 오른쪽의 계산 결과값이 서로 다른 경우 True(참)로 계산하고,
그 외의 경우에는 False(거짓)로 계산한다.

python 언어에서 정수값 0은 False(거짓)로 평가되고, 그 외의 값들은 모두 True(참)로 평가된다.

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

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

and 예약어는 주어진 두 불 값이 모두 True 일 때에만 True 로 계산하고, 나머지 경우는 False 로 계산한다.
이러한 논리연산을 AND 연산(boolean AND)이라고도 부르고, · 으로 표시하거나 생략하며, 집합 기호 ∩(교집합, intersection)로 표시하기도 한다.
모두 같은 의미이다.

or 예약어는 주어진 두 불 값 중에서 하나라도 True 이면 True 로 계산하고, 나머지 경우는 False 로 계산한다.
이러한 논리연산을 OR 연산(boolean OR)이라고도 부르고, + 로 표시하거나, 집합 기호 ∪(합집합, union)로 표시하기도 한다.
모두 같은 의미이다.

참 거짓이 서로 다를 때에만 True 로 계산하는 논리연산을 XOR(exclusive or, 배타적 논리합) 연산이라고도 부른다.

(6056)
2개의 정수값이 입력될 때,
그 불 값(True/False) 이 서로 다를 때에만 True 를 출력하는 프로그램을 작성해보자.

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

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

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

 

비트단위(bitwise)연산자 ~ 를 붙이면 된다.(~ : tilde, 틸드라고 읽는다.)
비트단위(bitwise)연산자 &를 사용하면 된다.(and, ampersand, 앰퍼센드라고 읽는다.)
비트단위(bitwise) 연산자 |(or, vertical bar, 버티컬바)를 사용하면 된다.

| 은 파이프(pipe)연산자라고도 불리는 경우가 있다.

비트단위(bitwise) 연산자 ^(xor, circumflex/caret, 서컴플렉스/카릿)를 사용하면 된다.

주의 ^은 수학식에서 거듭제곱(power)을 나타내는 기호와 모양은 같지만,
C언어에서는 전혀 다른 배타적 논리합(xor, 서로 다를 때 1)의 의미를 가진다.

비트단위(bitwise) 연산자는,
~(bitwise not), &(bitwise and), |(bitwise or), ^(bitwise xor),
<<(bitwise left shift), >>(bitwise right shift)
가 있다.

 

(6063)
입력된 두 정수(a, b) 중 큰 값을 출력하는 프로그램을 작성해보자.
단, 3항 연산을 사용한다.

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

(a if a>b else b) if ((a if a>b else b)>c) else c 와 같은 계산식은 a, b, c 의 값 중 가장 큰 값으로 계산된다.

예를 들어 변수에 어떤 값을 대입하는 대입(assign) 연산자 = 의 우선순위는 가장 낮고, 오른쪽에서 왼쪽의 결합방향을 가진다.

조건문
if 조건식 :
...
...
반복문
while 조건식 :
...
...

 

print(..., end=' ') 와 같이 작성하면 값 출력 후 공백문자 ' '를 출력한다. 즉, 마지막에 줄을 바꾸지 않고 빈칸만 띄운다.
(end='\n'로 작성하거나 생략하면, 값을 출력한 후 마지막(end)에 줄바꿈(newline)이 된다.)

 

range(끝)
range(시작, 끝)
range(시작, 끝, 증감)
형태로 수열을 표현할 수 있다. 시작 수는 포함이고, 끝 수는 포함되지 않는다. [시작, 끝)

 

증감할 수를 작성하지 않으면 +1이 된다.

조건문이나 반복문의 코드블록 안에서 continue 가 실행되면,
반복 블록 안에 있는 나머지 부분을 실행하지 않고, 다음 반복 단계로 넘어간다.
즉, 반복 블록의 나머지 부분은 실행되지 않고, 다음 단계의 반복을 계속(continue)하는 것이다.

 

이런식으로 두 가지 방법으로 표현할 수도 있음

 

print(format(total, ".2f"))
print('%.2f'%total)

조건문이나 반복문의 코드블록 안에서 break 가 실행되면,
반복실행을 중단(break)하고, 가장 가까운 반복 블록의 밖으로 빠져나간다.

 

(6091)
공배수를 이용하여 최소공배수로 다시 같이 만나는 날을 구하는 것 같은데

d = 1
while d%a!=0 or d%b!=0 or d%c!=0 :
  d += 1
print(d)

한 줄에 저 조건식을 쓰는 게 쉽지가 않다.

 

 

리스트

(6092)

n = int(input())      #개수를 입력받아 n에 정수로 저장
a = input().split()  #공백을 기준으로 잘라 a에 순서대로 저장

for i in range(n) :  #0부터 n-1까지...
  a[i] = int(a[i])       #a에 순서대로 저장되어있는 각 값을 정수로 변환해 다시 저장

d = []                     #d라는 이름의 빈 리스트 [ ] 변수를 만듦. 대괄호 기호 [  ] 를 사용한다.
for i in range(24) :  #[0, 0, 0, ... , 0, 0, 0] 과 같이 24개의 정수 값 0을 추가해 넣음
  d.append(0)        #각 값은 d[0], d[1], d[2], ... , d[22], d[23] 으로 값을 읽고 저장할 수 있음.

for i in range(n) :    #번호를 부를 때마다, 그 번호에 대한 카운트 1씩 증가
  d[a[i]] += 1

for i in range(1, 24) :  #카운트한 값을 공백을 두고 출력
  print(d[i], end=' ')

리스트

  • d = [] #어떤 데이터 목록(list) 을 순서대로 저장하기 위해 아무것도 없는 리스트 변수 만들기

d.append(값) #d 리스트의 마지막에 원하는 값을 추가(append)해 넣음

  • d[a[i]] += 1 #2중 리스트 참조 : 만약 a[i]의 값이 1이었다면? d[1] += 1 이 실행되는 것이다. 1번 카운트 1개 증가..

 

 

 

리스트 부분은 아직 어려워서 못풀 것 같아서 백준 문제로 조금 더 파이썬 공부한 뒤에 다시 풀어봐야겠다

어려웠던 문제 (나중에 다시 풀어보자)

6079 [기초-종합] 언제까지 더해야 할까? -> (조건 부분 생각하기가 쉽지 않았음)

  • 6081 [기초-종합] 16진수 구구단 출력하기 -> 저 16진수 구구단 뒷부분 구구단 어떻게 출력하는지 잘 모르겠음
  • 6086 [기초-종합] 거기까지! 이제 그만~
  • 6091 [기초-종합] 함께 문제 푸는 날 -> (저 조건식을 내가 생각해내기가 쉽지않음)