BAEKJOON : 2447, 11729, 2798

Codren·2021년 6월 19일
0
post-custom-banner

No. 2447

1. Problem




2. My Solution

import sys

def starmake(n,x,y):			# 종료 조건 (최소 출력)
    if n == 3:
        for i in range(3):
            for j in range(3):
                if (i == 1 and j == 1) == False:
                    arr[x+i][y+j] = "*"
    else:				# 재귀 함수 설정
        for i in range(0,n,n//3):
            for j in range(0,n,n//3):
                if (i == n//3 and j == n//3) == False:
                    starmake(n//3,x+i,y+j)
                

n = int(sys.stdin.readline().strip())

arr = [[" "]* n for _ in range(n)] 

starmake(n,0,0)

for i in range(n):
    print(''.join(arr[i]))




3. Others' Solutions

def sta(n):
	if n == 1:
		return ['*']
	sta1 = sta(n//3)
	
	res = []
	for i in sta1:
		res.append(i * 3)
	for i in sta1:
		res.append(i + ' '*(n//3) + i)
	for i in sta1:
		res.append(i * 3)
	
	return res
	
a = int(input())
print('\n'.join(sta(a)))




4. Learned

  • 재귀함수를 이용해서 그림을 출력할 때는 2차원 배열을 사용하자
  • 그림을 출력할 2차원 배열, 재귀함수의 종료조건, 재귀함수 이렇게 3개의 부분을 각각 생각해보기




No. 11729

1. Problem




2. My Solution

  • 시작, 보조, 목적 기둥을 각각 나눔
  • n-1 개의 원반을 보조로 이동시킴
  • 나머지 한 개의 원반을 목적지로 이동시킴
  • 보조에 있는 n-1 원반에 대해서 보조와 시작 기둥을 변경해서 재귀 수행
import sys

def hinoi(n,start,assist,dest):
    global count
    if n == 1:
        result.append(str(start)+" "+str(dest))
        count+=1
    else:
        hinoi(n-1,start,dest,assist)
        hinoi(1,start,assist,dest)
        hinoi(n-1,assist,start,dest)

n = int(sys.stdin.readline().strip())
count = 0
result = []

hinoi(n,1,2,3)
print(count)
for i in result:
    print(i)




3. Learned





No. 2798

1. Problem




2. My Solution

  • itertools 이용 -> itertools.combinations
  • 리스트 요소에서 만들 수 있는 크기 3의 조합을 모두 찾아내서 판단
import sys
import itertools

n,m = map(int,sys.stdin.readline().strip().split())
card_list = list(map(int,sys.stdin.readline().strip().split()))

result = list(itertools.combinations((card_list),3))
result = [m - sum(result[i]) for i in range(len(result))]
result = sorted(filter(lambda x: x >=0 , result))

print(m-min(result))




3. Others' Solutions

  • 3개의 조합을 찾기위해 3중첩 for 문을 돌림
  • i : 0 ~ n-2
    j : i + 1 ~ n -1
    k : j + 1 ~ n
import sys

input = sys.stdin.read


def sol2798():
    n, m, *cards = map(int, input().split())
    answer = 0
    for i in range(n-2):
        for j in range(i+1, n-1):
            for k in range(j+1, n):
                s = cards[i]+cards[j]+cards[k]
                if answer<s<=m:
                    answer = s
    print(answer)




4. Learned

  • 파이썬에서 제공하는 여러 라이브러리 함수들을 이용하자
  • 해당 함수를 이용하지 않고도 구현할 수 있는 방법과 원리에 대해서 알고 있자
post-custom-banner

0개의 댓글