tot = 4400
size = 20
group = tot/size
print("전체 {0}명의 인원으로 {1}명씩 그룹지으면 {2}조가 생성".format(tot, size, group))
📌 반복문
pass, continue, break
pass : 주로 if문에서 딱히 할 것이 없을 때 사용한다.
continue : 주로 for문에서 현재 분기를 뛰어넘어 다음 분기로 가기 위해 사용한다.
break : break가 등장한 순간, 반복을 마치고 나오게 된다.
enumerate 함수
리스트의 인덱스와 데이터를 동시에 접근할 수 있는 함수
for i,v in enumerate(a):
print(i)
print(v)
List comprehension
값들을 반복을 통해 돌려가며 모으는 역할을 수행한다.
# i의 모든 원소에 "h"를 붙여 출력
a = [ i + "h" for i in a ]
print(a)
# i 값이 c가 아닌 경우만 출력
b = [ i for i in a if != "c"]
print(b)
2차원 list 접근
a = [ ["a","b","c","d"],"f","g",["c","i"] ]
b = []
for i in range(len(a)):
for j in range(len(a[i])):
if a[i][j] != "c":
b.append(a[i][j])
print(b)
📌 함수
함수란?
무엇을 할지에 대한 정의라고 할 수 있다. (기능 중심)
구성요소 : 입력(x), 출력(y), 입출력간 관계(f)
함수의 형태
def 함수명(입력인자들 #x):
입력인자들로 무엇을 해서 어떤 값을 내보낼지 정함(입출력간 관계) #f
return 출력들 #y
#example
def hap(a,b):
result = a + b
return result
가변입력인자 처리
args : 여러 개의 변수를 받아주는 리스트라고 생각하면 된다.
def hamsu(*args):
result = 0
for i in args:
result += i
return result
lambda 함수
데이터 전처리나 정렬 기준 세팅시 주로 활용되는 간략함수
result = (lambda a,b : a+b)(10,20)
print(result)
⚙️ 연습문제
📝 Q1. 간단한 입출력 & 산수 문제
Q) 4400명의 사람이 모였는데, 이들을 대상으로 20명씩 조를 만들려고 한다. 이 때 생성되는 조의 수는 몇 개인가? A) 4400 의 인원으로 20 명씩 그룹을 지으면 220.0 의 조가 생성됩니다
people = 4400
count = 20
print("%d 의 인원으로 %d 명씩 그룹을 지으면 %.1f 의 조가 생성됩니다" %(people, count, float(people/count)))
📝 Q2. 간단한 산수 문제
Q) 4400명의 사람이 모였는데, 이들을 대상으로 30명씩 조를 만들려고 한다. 이 때 생성되는 조의 수와, 편성이 안 되는 사람의 수는? A) 146.66666666666666 146 20
people = 4400
count = 30
print(people/count)
print(people//count)
print(people%count)
📝 Q3. 간단한 산수 문제
Q) 국어 80점, 수학 55점, 영어 75점, 사회 80점 --> 이 사람의 평균을 구하는 코드를 작성하시오 A) 72.5
kor = 80
math = 55
eng = 75
soc = 80
avg = (kor+math+eng+soc) / 4
print("%.1f" %avg)
📝 Q4. 간단한 입출력 & 산수 문제
Q) 국어 80점, 수학 55점, 영어 75점, 사회 80점 --> 이 사람의 평균을 구하는 코드를 작성하시오(단, 이번에는 input을 활용하여 입력받는 점수를 바탕으로 평균을 구하세요!) A) 한국어 점수를 입력해주세요!!!1 수학 점수를 입력해주세요!!!!2 영어 점수 입력해주세요!!!!3 사회 점수 입력해주세요1!!4 4과목 평균 점수 : 2.5
kor = int(input("한국어 점수를 입력해주세요!!!"))
math = int(input("수학 점수를 입력해주세요!!!"))
eng = int(input("영어 점수를 입력해주세요!!!"))
soc = int(input("사회 점수를 입력해주세요!!!"))
avg = (kor+math+eng+soc) / 4
print("4과목 평균 점수 : %.1f" %avg)
💡 입력 과정을 반복문으로 간추린 코드
subject = ["한국어", "수학", "영어", "사회"]
sum = 0
for sub in subject:
txt = sub + " 점수를 입력해주세요!!!"
sum += int(input(txt))
avg = sum / 4
print("4과목 평균 점수 : %.1f" %avg)
📝 Q5. 점의 위치 판별문제
Q) 한 점을 구성하는 (x,y)의 좌표를 입력받고, 이 점이 (50,40), (50,80), (100,40), (100,80)을 꼭지점으로 하는 사각형 안에 있는지 판단하세요!!! A) x의 값을 입력하세요10 y의 값을 입력하세요22 밖에 있습니다.
💡 기준 사각형이 직사각형이므로, (50,40)을 기준으로 가로 50, 세로 40 안에 들어있는 점이면 된다.
x = int(input("x의 값을 입력하세요"))
y = int(input("y의 값을 입력하세요"))
if x >= 50 and x <= 100 and y >= 40 and y <= 80:
print("안에 있습니다.")
else:
print("밖에 있습니다")
⚙️ 실전문제
📝 Q1. 상하좌우 [ 이것이 코딩 테스트다 p.110 ]
💡 여행가 A는 N by N 크기의 정사각형 공간 위에 서 있다. 이 공간은 1 by 1크기의 정사각형으로 나누어져 있다. 가장 왼쪽 위 좌표는 (1,1)이며, 가장 오른쪽 아래 좌표는 (N, N)이다. A는 L(왼쪽으로 1칸 이동), R(오른쪽으로 1칸 이동), U(위쪽으로 1칸 이동), D(아래쪽으로 1칸 이동) 이렇게 4가지 방향만 이동이 가능하다. 시작 좌표는 항상 (1,1)이며, N by N의 공간을 벗어나게 된다면, 그 움직임은 무시가 된다. 예: (1,1)에 있는데, U이 나오면 움직임을 하지 않고 무시한다.
⚒️ 입력 조건 : 첫재 줄에 공간의 크기를 나타내는 N이 주어진다. ( 1 ≤ N ≤ 100) 둘째 줄에 A가 이동할 계획서 내용이 주어진다. (단, 1 ≤ 이동횟수 ≤ 100)
⚒️ 출력 조건 : A의 최종적인 도착지점의 좌표(X,Y)를 출력하세요. 공백으로 표시해서...
🎲 입력예시 : 5 R R R U D D 🎲 출력예시 : 3 4
✅ 풀이 1
a = list(input().split())
n = int(a[0])
x = 1
y = 1
for i in range(1, len(a), 1):
if a[i] == "U":
if y != 1:
y -= 1
elif a[i] == "D":
if y != n:
y += 1
elif a[i] == "L":
if x != 1:
x -= 1
elif a[i] == "R":
if x != n:
x += 1
print(y, x)
💡 직관적으로 U,D,L,R이 들어올 때마다 좌표가 맨 끝쪽인지 판단한 후에 필요한 이동을 수행하도록 짜봤다. 근데 그냥 딱 봐도 실제로 저 답안 제출하면 시간초과 뜰 것 같다💦💦
✅ 풀이 2
a = list(input().split())
n = int(a[0])
x = [1, 1]
move_dict = {
"L": [0, -1],
"R": [0, 1],
"U": [-1, 0],
"D": [1, 0]
}
for i in range(1, len(a), 1):
dx = x[0] + move_dict[a[i]][0]
dy = x[1] + move_dict[a[i]][1]
if dx >= 1 and dx <= n and dy >= 1 and dy <= n:
x[0], x[1] = dx, dy
print(x[0], x[1])
💡 강의에서 배운 dictionary 기반 방법
✅ 풀이 3
a = list(input().split())
n = int(a[0])
x = [1, 1]
move_types = ["L", "R", "U", "D"]
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
for i in range(1, len(a), 1):
idx = move_types.index(a[i])
mx = x[0] + dx[idx]
my = x[1] + dy[idx]
if mx >= 1 and mx <= n and my >= 1 and my <= n:
x[0], x[1] = mx, my
print(x[0], x[1])
💡 강의에서 배운 list 기반 방법
📝 Q2. 왕실의 나이트 [ 이것이 코딩 테스트다 p.115 ]
💡 왕실의 정원은 체스판과 같이 생긴 8 by 8평면. 왕실 정원의 특정한 한 칸에 나이트가 서 있음. 나이트의 이동 : L자 형태로만 이동을 할 수 있음(아래 1,2경우) & 정원 밖으로는 나갈 수 없음. 1) 수평으로 2칸 이동 뒤 수직으로 1칸 이동 2) 수직으로 2칸 이동 뒤 수평으로 1칸 이동 아래 그림과 같이 8by8에서는 행 : 1~8, 열 : a ~ h로 표시
⚒️ 입력 조건 : 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자를 받아서 처리할 것 : 순서는 문자열, 숫자행(예 : a1) 출력 조건 : 이동할 수 있는 경우의 수 출력
🎲 입력 예시 : a1 출력 예시 : 2 ------------ 입력 예시 : c2 출력 예시 : 6
예시 상황 : a1에 위치해 있다면, 이동할 수 있는 경우의 수는 2가지이다. 1) 오른쪽으로 2칸 이동 후 아래로 1칸 이동하여 : c2 2) 아래로 2칸 이동 후 오른쪽으로 1칸 이동하기 : b3
예시 상황 : c2에 위치해 있다면, 이동할 수 있는 경우의 수는 6가지이다. 1) 오른쪽으로 2칸 이동 후 아래로 1칸 이동 : e3 2) 오른쪽으로 2칸 이동 후 위로 1칸 이동 : e1 3) 왼쪽으로 2칸 이동 후 아래로 1칸 이동 : a3 4) 왼쪽으로 2칸 이동 후 위로 1칸 이동 : a1 5) 아래로 2칸 이동 후 오른쪽으로 1칸 이동 : d4 6) 아래로 2칸 이동 후 왼쪽으로 1칸 이동 : b4 위로 2칸은 정원의 범위를 넘어가서 안 된다;;;
✅ 풀이 1
chess = input()
x = ord(chess[0]) - ord("a") + 1
y = int(chess[1])
count = 0
movements = {
"a" : [2, 1],
"b" : [2, -1],
"c" : [-2, 1],
"d" : [-2, -1],
"e" : [1, 2],
"f" : [1, -2],
"g" : [-1, 2],
"h" : [-1, -2]
}
for items in movements:
dx = x + movements[items][0]
dy = y + movements[items][1]
if dx >= 1 and dx <= 8 and dy >= 1 and dy <= 8:
count += 1
print(count)
💡 Q1에서 사용한 dictionary를 사용한 풀이를 응용하여 풀어보았다. 움직임을 하나하나 직접 지정하지 않고도 for loop 등으로 쉽게 지정할 수 있지 않을까 생각된다. ord()로 유니코드를 사용해 문자를 정수형으로 바꾸었다. 나이트의 위치가 갱신되는 것이 아니라, 가능성만 카운팅하면 되어 비교적 간단한 문제라고 느꼈다.
✅풀이 2
in_text = input()
row = int(in_text[1])
col = ord(in_text[0]) - ord("a") + 1
count = 0
l_moves = [
[-2,-1],
[-2,1],
[2, -1],
[2, 1],
[-1, 2],
[-1, -2],
[1, 2],
[1, -2]
]
for move in l_moves:
next_row = row + move[0]
next_col = col + move[1]
if next_row>=1 and next_row<=8 and next_col>=1 and next_col<=8:
count += 1
print(count)
💡 강의에서 배운 list 기반 방법
📝Q3. 키패드 누르기 [ 2020 카카오 인턴쉽 ]
💡 스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.
사용 손가락 : 왼손 & 오른손의 엄지손가락만 사용해서 숫자만을 입력하고자 함!!
시작점 : 왼손 엄지손가락은 * 키패드, 오른손 엄지손가락은 # 키패드 위치에서 시작!
엄지손가락 사용 규칙 - 엄지손가락은 상/하/좌/우 4가지 방향으로만 이동할 수 있으며, 이동 한 칸은 거리 1에 해당. - 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때에는 왼손 엄지손가락을 사용 - 오른쪽 열의 3개의 3,6,9를 ㅇ비력할 때에는 오른손 엄지손가락을 사용 - 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때에는 두 손 중에서 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용을 함. - 만약에 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락을, 왼손잡이는 왼손 엄지손가락을 사용함.
⚒️ 입력조건 : 순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이 or 오른손잡이인지 나타내는 문자열 hand가 매개변수 출력조건 : 각 번호를 누른 엄지손가락이 왼손 or 오른손인지 나타내는 연속된 문자열 형태로 return하도록.
[제한사항] - numbers 배열의 크기는 1이상 1000이하 - numbers 배열 원소의 값은 0이상 9이하인 정수 - hand는 "left" or "right"임 (left : 왼손잡이, right : 오른손잡이) - 왼손 엄지손가락을 사용한 경우 : L 문자열 사용 - 오른손 엄지손가락을 사용한 경우 : R 문자열 사용
✅풀이
def solution(numbers, hand):
answer = ''
array = [[1,2,3],[4,5,6],[7,8,9],['*',0,'#']]
num = 1
l = [1, 4, 7]
r = [3, 6, 9]
lf = [3,0]
rf = [3,2]
point = [0,0]
for items in numbers:
if items in l:
answer += 'L'
lf = [l.index(items), 0]
elif items in r:
answer += 'R'
rf = [r.index(items), 2]
else:
point = [[i, j] for i in range(4) for j in range(3) if array[i][j] == items][0]
ld = abs(point[0]-lf[0]) + abs(point[1]-lf[1])
rd = abs(point[0]-rf[0]) + abs(point[1]-rf[1])
if ld > rd:
answer += 'R'
rf = point
elif rd > ld:
answer += 'L'
lf = point
else:
if hand == 'right':
answer += 'R'
rf = point
else:
answer += 'L'
lf = point
print(lf, rf)
return answer
💡 자나깨나 인덱스 조심.. 인덱스 바꿔써서 왜 안되나 하고 엄청 머리가 아팠다.. 왼손가락의 위치를 lf, 오른손가락의 위치를 rf, 그리고 눌러야 할 가운데 라인 번호의 위치를 point로 초기화 하였다. [1,4,7], [3,6,9]를 누르는 경우는 간단하니까 생략하고, [2,5,8]을 누르는 경우가 문제였는데, 이 부분은 아래 코드를 사용해서 해결했다.
"[[i, j] for i in range(4) for j in range(3) if array[i][j] == items][0]" [2,5,8]이 위치하고 있는 인덱스를 리스트 형태인 [i,j]로 반환해주는 코드다. 반환받은 인덱스와 현재 왼손, 오른손의 위치간 거리를 계산해서 이후 작업을 구현했다.
왜 자꾸 인덱스 에러가 나나 했더만.. 행과 열의 인덱스를 바꿔쓰는 만행을 저질러버렸다..😂😂😂 그래도 해결해서 기분은 좋다!