개발일기

21. [백준] 별찍기 7, 붙임성 좋은 총총이 본문

오류 및 알고리즘정리본

21. [백준] 별찍기 7, 붙임성 좋은 총총이

츄98 2023. 6. 1. 10:08

1. 별찍기 7

https://www.acmicpc.net/problem/2444

 

2444번: 별 찍기 - 7

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

www.acmicpc.net

 

해결 1.

import sys
input = sys.stdin.readline

N = int(input())

# sol)
for i in range(1,N):
    print(' '*(N-i) + '*'*(2*i-1))

for i in range(N,0,-1):
    print(' '*(N-i) + '*'*(2*i-1))

 

해결 2. range(N,0,-1)을  reversed을 이용해 표현해보았다.

# sol2)
for i in range(1,N):
    print(' '*(N-i) + '*'*(2*i-1))

for i in reversed(range(1,N+1)):
    print(' '*(N-i) + '*'*(2*i-1))

 

해결 3. 재귀를 이용

재귀로 문제를 해결하기 위해서 먼저 규칙성을 찾아보았다.

 

# 공백 / *개수
# 4 1
# 3 3
# 2 5  
# 1 7
# 0 9
# 1 7
# 2 5
# 3 3
# 4 1

이 규칙성을 이용해서 재귀로 문제를 풀었다.

def solution(n,i):
    if n-i < 0:
        return 0
    print(' '*(n-i) + '*'*(2*i-1))
    solution(n,i+1)
    if n-1 != 0:
        print(' '*(n-i+1) + '*'*(2*i-3))
        
n = int(input())
solution(n,1)

 

세 풀이 방식 모두 결과값은 아래와 같이 나온다.

 

    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *

 

 

2. 붙임성 좋은 총총이

26069번: 붙임성 좋은 총총이 (acmicpc.net)

 

26069번: 붙임성 좋은 총총이

첫번째 줄에는 사람들이 만난 기록의 수 $N\ (1 \le N \le 1\ 000)$이 주어진다. 두번째 줄부터 $N$개의 줄에 걸쳐 사람들이 만난 기록이 주어진다. $i + 1$번째 줄에는 $i$번째로 만난 사람들의 이름 $A_i$

www.acmicpc.net

문제가 너무 귀여웟...ㅋㅋㅋ 킹받기도 하고..?ㅋㅋㅋ

어쨌든~ 총총이도 두 가지 풀이로 해결해보았다.

 

해결 1 - 집합  set을 이용

import sys; 
input = sys.stdin.readline

danceset = {'ChongChong'}
N = int(input())

for _ in range(N):
    a, b = input().split()
    
    if a in danceset:
        danceset.add(b)
    elif b in danceset:
        danceset.add(a)
    else:
        pass

print(len(danceset))

danceset에는 춤추는 사람들.. 그러니까 총총이에게 전염된 사람들이 원소인 집합이다! 

둘 중 한 명이라도 춤을 추고 있다면 나머지 한 명도 danceset에 넣어주었다.

 

 

해결 2 - defaultdict 이용

import sys; 
input = sys.stdin.readline
from collections import defaultdict

dance = defaultdict(bool)
# 모든 해시에 대해 디폴트 값은 False
dance['ChongChong'] = True # 총총이만 True로
answer = 1

for _ in range(int(input())):
    A, B = input().split()
    if dance[A]:
        if not dance[B]:
            dance[B] = True
            answer += 1
    elif dance[B]:
        dance[A] = True
        answer += 1

print(answer)

 

해결 1이 44초, 해결 2가 64초 정도 소요되며 시간복잡도는 해결 1이 더 좋다.