tech.junha.kr

[백준] 1~7단계: 파이썬 기초 문법 정리하기

https://www.acmicpc.net/step

단계별로 풀어보기

1단계: 입출력과 사칙연산

print('\n')  # 줄바꿈
print('\t')  # 수평탭
print('\\')  # \
print("\'")  # '
print('\"')  # "
print("이봐","안녕", sep='\n', end='!') # sep 콤마마다 적용, end 맨 마지막 적용

# 이봐
# 안녕!

문자열 포맷팅

문자열 내에 변수, 값, 표현식 등을 삽입하여 문자열을 동적으로 생성하는 방법

num = 10
name = "John"
print("나는 %d살이고, 내 이름은 %s입니다." % (num, name))

map(적용할 함수, 적용할 요소들)

a = map(int, input().split()))
# input().split() 리턴값: 리스트

# 입력받은 값을 공백으로 구분
# int형으로 변환하여
# map 객체로 만들어
# a에 저장한다.

print(a)

# <map object at 0x7fe322fadb20>
# 맵 오브젝트라고 프린트

b = list(a)
print(b)

# 리스트에 옮겨져 비로소 값들이 출력됨
a,b=map(int, input().split())
print(a,b)

# Destructring 됌

2단계: if문

a, b = map(int, input().split())
if a>b :
    print('>')
elif a<b :
    print('<')
elif a==b :
    print('==')

윤년문제

a=int(input())
if (a%400 ==0 or (a%4==0 and a%100!=0)):
    print('1')
else:
    print('0')

if 조건1 and 조건2 or 조건3 :

h,m = map(int, input().split())
if h==0 and m<45:
    print('23', 15+m)
elif h==0 and m>=45:
    print(h, m-45)
elif h>0 and m<45:
    print(h-1, 15+m)
elif h>0 and m>=45:
    print(h, m-45)

3단계: for문

for i in range(횟수(정수)), i=0부터 시작

# for i in range(변수(X))

N = int(input())
for i in range(N):

for i in range(1, 100) ===>>> i=1~99

N=int(input())
for i in range(1,10):
n=int(input())
for i in range(1,n+1):
    a,b=map(int, input().split())
    print(a+b)

for 요소 in 변수or배열

for i in str(x):
    a.append(int(x))

import sys - input() 실행속도 감축

import sys
input = sys.stdin.readline

// 변수에 저장해야하는 것은 프로퍼티다.
// ...readline() 메소드를 저장하니까 죽어도 안됐다.

n = int(input())

4단계 while문

while True:
    a,b = map(int, input().split())
    if a==0 and b==0 :
        break

print(a+b)

try, except

try에서 오류가 나면 except 블럭이 실행된다.

while True:
    try:
        a,b = map(int, input().split())
        print(a+b)
    except:
        break

26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다. 위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다. N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.

import sys
input = sys.stdin.readline

N = num = int(input())
count = 0
while True:
  fNumber=N//10
  uNumber=N%10
  total = fNumber + uNumber
  N = int(str(uNumber)+str(total%10)) // 문자열 형변환 후 정수로 변환하면 문제 의도대로 가능
  print(N)
  count+=1
  if  num== N:
    break;

print(count)

후기:

10보다 작다면 0을 붙이고...

  1. 문장을 코드로 1:1구현하려고 해서 시간이 많이 걸렸다.

핵심 코드를 치면 자연스레 맞춰지는 것들이였다.

  1. 문제 가독성이 심하게 떨어진다.

독해력과 사고력의 문제일 수 도 있다.

이 기계어 같은 한국어를 제대로 이해하려면 어떻게 해야할까?

  1. 한국어 보충설명은 참고만 한다.

  2. 예시를 먼저 보고 패턴을 이미지로 파악한다.

파악한 이미지를 사고력을 통해 수식으로 변환하여 풀이한다.

5단계 1차원 배열

'{ } { } '.format

n = int(input())
list = list(map(int, input().split()))

print('{} {}'.format(min(list), max(list)))

1) 배열.append('a')

2) 배열.index('값')=값의 인덱스

a = []

for i in range(9):
	a.append(int(input()))

print(max(a))
print(a.index(max(a))+1)

1) 리스트 = list(str( '123456'))

문자열로 따로따로 저장해서 리스트 생성

2) 리스트.count('a')

리스트 안에 'a'를 카운트

a = int(input())
b = int(input())
c = int(input())

result = list(str(a * b * c))

for i in range(10):
  print(result.count(str(i)))

1) 집합 = set( )

2) 집합.add( )

3) 배열.append( )

a=[]

for i in range(10):
    n = int(input())
    a.append(n % 42)

arr=set(a)

print(len(arr))
a = set()

for i in range(10):
	n = int(input())
    a.add(n % 42)

print(len(a))

for 요소 in 배열

이게 돼?...

n = int(input())
list = list(map(int, input().split()))
m =max(list)

new = []

for i in list:
    new.append(i/m*100)
newAvg = sum(new)/len(new)

print(newAvg)
n = int(input())

for i in range(n):

    score = 0
    tScore = 0
    results = list(input())

    for result in results:
        if result =='O':
            score += 1
            tScore += score
        else:
            score = 0
    print(tScore)

for i in scores[1 : ]:

1번 인덱스 부터 for문 돌릴 때

f- string: 문자열 포맷팅 방법

f'문자열 {변수} 문자열'

s = 'coffee'
n = 5
result1 = f'저는 {s}를 좋아합니다. 하루 {n}잔 마셔요.'

print(result1)

.3f: 소숫점 세자리 까지 표기

ratio:.3f => ratio변수를 .3f로 표기하라

c = int(input())

for i in range(c):

    scores = list(map(int, input().split()))
    avg = sum(scores[1:])/scores[0]
    ratio = 0

    for i in scores[1:]:
        if i >avg:
            ratio += 1
    ratio = ratio/scores[0] * 100
    print(f'{ratio:.3f}%')

6단계: 함수

def solve(a):
    ans = sum(a)
    return ans

셀프넘버 개수 세기

def func(n):
    sum = 0
    for x in list(str(n)):
        sum = sum + int(x);
    return n+sum;

c=[]
for n in range(1,10001):
    c.append(func(n))

for d in range(1,10001):
    if d in c: //1-10000에서 해당하는 숫자는 패스해서 여집합 효과내기
        pass
    else:
        print(d)

한수 개수 세기

n = int(input())
a = []
sum = 99

if n< 100:
    sum = n;
else:
    index = 100
    while index != n+1:
    // 210이 n으로 들어왔을때, 210도 비교해서 넣어야하기 때문에 n+1로 기준으로 잡음

        for b in str(index):
            a.append(int(b))    //자릿수를 따로따로 저장, 모듈로 흡수하기

        if a[1] - a[0] == a[2] - a[1]:
            sum += 1

        index +=1
        a = []
print(sum)

7단계

ord( a) = 97 / chr( 122 ) = z

s= input()
a = []
index = 0
check = False

for i in s:
    a.append(ord(i))

for j in range(97,123):
    for k in a:
        if j == k:
            check = True;
            print(index,end=' ')
            break;
        else:
            index = index + 1
    if check != True:
        print("-1",end=' ')
    else:
        check = False
    index = 0

find( ):

  1. 문자열에서만 사용 가능

  2. 문자가 문자열 안에 포함되지 않은 경우 -1을 출력

index():

  1. 문자열, 리스트, 튜플과 같은 반복 가능한 iterable 자료형에서도 찾는 문자의 인덱스를 반환

  2. 문자가 문자열 안에 포함되지 않은 경우 AttributeError가 발생한다.

word = input()
alphabet = list(range(97,123))

for x in alphabet :
    print(word.find(chr(x)))
n = int(input())

for i in range(n):
    cnt, word = input().split()
    for x in word:
        print(x*int(cnt), end='')
    print()

가장 많이 언급된 단어 출력

word = input().upper()
setWord = list(set(word))

cntList = []

for x in setWord :
    cnt = word.count(x)
    cntList.append(cnt)

if cntList.count(max(cntList))>1:
    print('?')
else:
    print(setWord[cntList.index(max(cntList))])

주의

setWord = list(set(word))의 결과

Mississipi
['P', 'M', 'S', 'I']

set함수가 차례대로 인덱스가 저장되질 않으니, setWord[인덱스]를 사용해야한다.

1152번: 단어의 개수

s = input().split(' ')
a = []

for i in s:
  if i !='':
    a.append(i)

print(len(a))

다른 정답 코딩예시를 봤는데 오점투성이다.

띄어쓰기 및 기호까지 단어로 인식한다.

그냥 기초로 생각하고 넘어가자.

arr [0,1,2,3,4,5,6,7,8,9]

arr[::2]
# 처음부터 끝까지 두 칸 간격으로
[0,2,4,6,8]

arr[1::2]
# index 1 부터 끝까지 두 칸 간격으로
[1,3,5,7,9]

arr[::-1]
# 처음부터 끝까지 -1칸 간격으로 ( == 역순으로)
[9,8,7,6,5,4,3,2,1,0]

arr[::-2]
# 처음부터 끝까지 -2칸 간격으로 ( == 역순, 두 칸 간격으로)
[9,7,5,3,1]

arr[3::-1]
# index 3 부터 끝까지 -1칸 간격으로 ( == 역순으로)
[3,2,1,0]

arr[1:6:2]
# index 1 부터 index 6 까지 두 칸 간격으로
[1,3,5]

번외

1. 할당조건문

num = num /2 if num % 2 == 0 else num \* 3 + 1

2. reverse vs reversed

num = 1234
list(map(int, str(num)))

list(map(int, reversed((str(n)))))
# list(map(int, reversed(list(str(n)))))
  • `map(타입, 이터러블)`에서 이터러블에 `str`도 올 수 있다.
  • `array.reverse()`: 리스트 반환 X, 원본만 변형
  • `reversed(이터러블)`: 리스트 반환 O

3. ''.join(li)

def solution(n):
    li = sorted(map(int,list(str(n))),reverse=True)
    str_li = ''.join(li)
    return str_li
  • 숫자만 있는 Array에 `''.join(Array)` 를 하면 숫자가 나오지 않는다.
  • 문자로 바꿔서 처리해줘야한다. `''.join(map(int,Array))`