Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions Hongjoo/백준/병든나이트.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
"""
실버3
https://www.acmicpc.net/problem/1783

#문제 : 그래프탐색(DFS , BFS)
- NxM 의 왼쪽 아래 칸 시작
- 4가지 방법으로 이동
(1) 2칸 위 , 1칸 오른쪽
(2) 1칸 위로 2칸 오른쪽
(3) 1칸 아래로 , 2칸 오른쪽
(4) 2칸 아래 , 1칸 오느ㅜㄹ쪽
- goal) 방문할 수 있는 "최대 칸 개수" 구하기

# 조건
- <이동횟수가 4번 이상 -> 이동 방법 모두 사용
- < 4번 이하 - 제약 없음


"""
n, m = map(int, input().split())

result = 0
# n이 1일 때 무조건 1
if n == 1:
result = 1
# n이 2일 때
elif n == 2:
if m >= 1 and m <= 6: #m이 1~6일 때
result = (m + 1) // 2
elif m >= 7: #7이상일 때
result = 4
# n이 3 이상일 때
elif n >= 3:
if m <= 6: #m이 1~6일 때
result = min(m, 4)
elif m >= 7: #m이 7 이상일 때
result = m - 2
print(result)
25 changes: 25 additions & 0 deletions Hongjoo/백준/쉬운계단수.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
"""
https://www.acmicpc.net/problem/10844
"""
n = int(input())
# dp [총 길이 i ][마지막 자리수가 j] = 인 개수
Mod = 1000000000
# 1. 초기화
#(1) 0을 시작하는 수는 계단수가 아닌다 - dp[1][0]
# (2) N=1 인 계단수
dp = [[0]*10 for _ in range(n+1)]
dp[1][0] = 0
for j in range(1,10):
dp[1][j]= 1

# (3) 점화식 N>=2
for i in range(2,n+1):
for j in range(10):
if j== 0 :
dp[i][j] = dp[i-1][j+1]
elif j==9:
dp[i][j] = dp[i-1][j-1]
else :
dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1]

print(sum(dp[n])%Mod)
20 changes: 20 additions & 0 deletions Hongjoo/백준/저울.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
"""
https://www.acmicpc.net/problem/2437

# 문제
- 저울 N개의 조합의 합으로 구현할 수 없는 양의 최소값 구하기
- N<=1000개
- 1개 무게 >= 1,000,0000
유형 : 그리디 , 정렬

"""
#1. 입력 저울추 & 오름차순 정렬
N = int(input())
weights = sorted(list(map(int, input().split())))
target = 1
for w in weights :
if target < w :
break

target += w
print(target)
34 changes: 34 additions & 0 deletions Hongjoo/백준/한국이그리울땐서버에접속하지.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
"""
https://www.acmicpc.net/problem/9996
"""
N = int(input())
# Q. a*b는 asbasd도 정답인가?
# 1. 변수 입력 받기
pattern = list(input().split('*'))
cmstr = [[] for k in range(N)]

for i in range(N):
# cmstr[i] = [x for x in input()]
cmstr[i] = input()
#2.

for i in range(N):
# 패턴 앞, 뒤 매칭하기
if cmstr[i][:len(pattern[0])] != pattern[0] or cmstr[i][-len(pattern[-1]):] != pattern[-1]:
print("NE")
continue
# 안 맞음

flag = [False * len(pattern[1:-1])]
point = len(pattern[0])
for p in pattern[1:-1] : # 패턴 내부
cnt = cmstr[i][point:].find(p)
if cnt < 0 : #없으면
print("NE")
break
# 있으면 - 그 이전에 있음
point = cnt

print("DA")


150 changes: 150 additions & 0 deletions Hongjoo/코드트리/고대문명유적탐사.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
"""
#2024삼성 상반기 오전1번 문제 / 고대문명유적탐사
#링크 : https://www.codetree.ai/ko/frequent-problems/problems/ancient-ruin-exploration/description?introductionSetId=&bookmarkId=


"""
"""
# 유형 : 걍 구현
- . 5x5위 7가지 유물(1-7)
1. 탐사 진행 - 지정된 3x3회전 시계방향으로 [90,180 , 270] 중 하나의 각도로 회전
=> 각 회전시 "각도| 획득가치 | 중심좌표" 저장
- (1) 유물 1차 획득 가치 최대화
- (2) 회전 각도 최소화
- (3) 회전 중심 좌표 열(row)이 최소 -> 행 최소


2. 유물 획득
- 3개 같은 종류 이웃하면 -> 사라지는 조각 개수 = 유물 가지 => 필트에 빔
- 생성 순서는 유적 벽면 순서 -> 열이 작은 쪽 -> & 행 큰것 순서 up
- 조각 고갈 문제는 없음, 단 사용한 조각은 재활용 x >

3. 탐사 반복 (출력조건)
- K번 (1번 : 탐사진행 -> 유물획득) => 획득 유물 가치 출력
- 중간 획득 유물 방법 존재 x -> 종료 (출력 : x )

"""

"""
<전체 flow>
# 0. 변수 입력 : 탐사 회수 K , 유물 스페어 개수 M
### K 번 반복
# 중심좌표 후보군 9개 / 각도 후보군 3개 -> 27번 반복
#1. def 회전(중심좌표, 각도)

#2. 유물 획득 -> 유물 가치 저장
#-> 27번 반복
#3. 해당 턴에서 Best choice 인 상황 결정
# 3.유물 업데이트
###
"""
"""
input : 중심 좌표, angle , field
ouptut : 변환된 field

위치 idx :
[[i-1 , j-1], [i-1, j],[i-1,j+1],[i+1,j-1] , [i,j] [ i,j+1], [i+1,j-1],[i+1,j],[i+1,j+1]]
90 = [7,5,1,8,5,2,9,6,3]
80 = [7,8,9,4,5,6,1,2,3]
270 = [1,4,7,2,5,8,3,6,9]
"""
"""
# 유물 획득 함수 : BFS
# 현 field 상황에서 얻을 수 있는 경우의 수
def get_old (field):
"""

# 중심 좌표 후보군 +
# 0. 입력 변수 입력 받기
K , M = map(int, input().split())
# 0-1. 초기 필드 값 받기

sfield = [list(map(int,input().split())) for _ in range(5) ]
wall = list(map(int, input().split()))
# 상하좌우
dy = [-1,1,0,0]
dx = [0,0,-1,1]


# (1) 90/180/270 회전 함수
def rotate(i,j, angle ,field) :
old_33=[[i-1 , j-1], [i-1, j],[i-1,j+1],[i+1,j-1] , [i,j] ,[ i,j+1], [i+1,j-1],[i+1,j],[i+1,j+1]]
ro_pos =[]
if angle == "90":
ro_pos = [6,4,0,7,4,1,8,5,2]
elif angle == "180":
ro_pos = [6,7,8,3,4,5,0,1,2]
else:
ro_pos = [0,3,6,1,4,7,2,5,8]
new_field = [row[:] for row in field]
for p in range(0,9):

old = field[old_33[p][0]][old_33[p][1]]
new_field[old_33[ro_pos.index(p)][0]][old_33[ro_pos.index(p)][1]] = old
return field

# 현 field 상황에서 가치 업데이트
def get_old (field):
del_pos = []
visited = [] # 방문 여부
oldest = [] # 각 start point에서 연결된 유물 위치
for i in range(5):
for j in range(5):
if [i,j] not in visited :
# start point와 같은 종류의 유물만 획득 가능
q = []
q.append([i,j])
visited.append([i,j])
while q :
cy,cx = q.pop()
for d in range(4) :
ny , nx = cy + dy[d] , cx + dx[d]
if 0 <= ny < 5 and 0 <= nx < 5 :
if [ny,nx] not in visited and field[ny][nx] == field[cy][cx]:
q.append([ny,nx])
visited.append([ny,nx])
oldest.append([ny,nx])

# 획득 있으면 -> 유물 개수 + 위치 누적
if len(oldest) >= 3 : # 3개 이상 연결시 획득 가능
del_pos.extend(oldest)
# print(del_pos)
oldest.clear()

return len(del_pos) , del_pos
# best 상황 선택
def cur_best(current_case):
arr = sorted(current_case , key=lambda x : (-x[0] , x[1] , x[2], x[3]))
return arr[0]


answer = []

for k in range(K):
current_case = [] # 27경우 [유물가지, 각도 , 열, 행 ,삭제 위치 ]
# 9개의 중심좌표 후보군
ro_sub = [90,180,270]
center_sub= [[1,1], [1,2],[1,3],[2,1] ,[2,2] ,[2,3],[3,1],[3,2],[3,3]]
for center_y , center_x in center_sub :
for ro_angle in ro_sub :
sub_field = rotate(center_y,center_x, ro_angle ,sfield)
value_sub , del_sub = get_old (sub_field)
current_case.append([value_sub, ro_angle, center_y, center_x, sub_field ,del_sub])

#3. 해당 턴에서 베스트 상황 1개 선택
# value 가 없는 경우 -> 끝
if len(current_case) <= 0 :
break
best_sit=cur_best(current_case)
answer.append(best_sit[0])
#4. fiedl 상황 업데이트
# 유물 매꾸기 - sort로 삭제된 위치 정렬 후 wall(유물벽면) 수행
arr = sorted(best_sit[-1] , key = lambda x : (x[0] , -x[1])) # 사라진 유물 위치
sfield = best_sit[-2]
pointer = 0
for y,x in arr :
node = wall[pointer]
sfield[y][x] = node
pointer= (pointer+1)%len(wall)

print(answer)
Loading