오류 및 알고리즘정리본

20. [백준] 인사성 밝은 곰곰이/ 성택이의 은밀한 비밀번호/ 별찍기8

츄98 2023. 5. 30. 21:23

1. 인사성 밝은 곰곰이 : 집합으로 풀었다!

25192번: 인사성 밝은 곰곰이 (acmicpc.net)

 

25192번: 인사성 밝은 곰곰이

첫번째 새로운 사람이 들어온 뒤  pjshwa, chansol, chogahui05은 모두 곰곰티콘으로 인사했다. 두번째 새로운 사람이 들어온 뒤  pjshwa와 chansol은 다시 곰곰티콘으로 인사했다.

www.acmicpc.net

집합은 서로 다른 원소들의 모임이므로, 집합의 성질을 이용하여 이 문제를 풀었다,

 

해결 1

import sys
input = sys.stdin.readline

N= int(input())
cnt = 0 
inputset = set()

for _ in range(N):
    word = input()[:-1]
    # print(word =='ENTER') # True 나옴
    if word != 'ENTER':
        if word not in inputset:
            cnt += 1
        inputset.add(word)
    else:
        inputset.clear()

print(cnt)

 

이 문제를 풀면서 오류가 계속 났던 부분은,

word = input() # ENTER
print(word =='ENTER') # False

이렇게 ENTER를 input한 word랑 ENTER를 비교했을 때 서로 다르다고 나왔다.

print(word, 'ENTER')를 해보니 하나는 ENTER 잘 나오고, 하나는 띄어쓰기+ENTER 나온다.

 

문제의 원인은 input()을 했을 때 그 출력값 뒤에 개행이 추가되서인 것 같다.

 

문제의 해결은,  word = input()[:-1] 이렇게 해주었다. print(word =='ENTER')가 True로 잘 나온다.

이런 해결방법 말고 다른 방법은 없을까 좀 더 멋있게 풀구 싶자나~~~

팀원 분이 좋은 걸 알려주셨당 ㅎ rstrip()을 하면 input()을 할 때 오른쪽에 개행이 생기지 않는다.

 

더 정확히 개념을 살펴보면,

strip([chars]) : 인자로 전달된 문자를 String의 왼쪽과 오른쪽에서 제거한다.
lstrip([chars]) : 인자로 전달된 문자를 String의 왼쪽에서 제거한다.
rstrip([chars]) : 인자로 전달된 문자를 String의 오른쪽에서 제거한다.

인자를 전달하지 않을 수도 있으며, 인자를 전달하지 않으면 String에서 공백을 제거한다.
인자로 문자 1개를 전달하면 그 문자와 동일한 것을 모두 제거한다. 동일하지 않은 문자가 나올 때까지 제거한다.

 rstip()을 사용하여 다음과 같이 풀 수 있다.

 

해결 2

import sys
input = sys.stdin.readline

N= int(input())
cnt = 0 
inputset = set()

for _ in range(N):
    word = input().rstrip()
    # print(word =='ENTER') # True 나옴
    if word != 'ENTER':
        if word not in inputset:
            cnt += 1
        inputset.add(word)
    else:
        inputset.clear()

print(cnt)

 

 

 

 

2. 성택이의 은밀한 비밀번호

25372번: 성택이의 은밀한 비밀번호 (acmicpc.net)

 

25372번: 성택이의 은밀한 비밀번호

부산사이버대학교 학생 성택이는 엄마의 의뢰를 받아 주어진 문자열이 현관문 비밀번호에 사용 가능한지 알아내야 한다. 성택이는 공부해야 하므로 우리가 도와주자! 사용할 수 있는 비밀번호

www.acmicpc.net

해결 1

import sys
input = sys.stdin.readline

N = int(input())
strings = []
for _ in range(N):
    strings.append(input())

# print(strings) # ['asdf\n', 'asdfghh\n', 'asdfhhjjjj\n']
# print(len(strings[0])) # 5

for i in strings:
    if len(i) >= 7 and len(i) <= 10:
        print("yes")
    else:
        print("no")

 

나는 input값들을 리스트로 만들어 문제를 해결했다.

input()을 여러 개를 했기 때문에 input값 오른쪽에 개행이 붙는다. 

그래서 4개짜리 문자열을 5개 길이의 문자열로 인식한다.

print(strings) # ['asdf\n', 'asdfghh\n', 'asdfhhjjjj\n']
print(len(strings[0])) # 5

 

따라서  6부터 9 길이의 문자열인지 파악하기 위해 7부터 10 길이의 문자열인지 확인해주었다.

 

이것도 처음부터 input().rstrip()을 한다면 따로 생각해주지 않고 6부터 9 길이의 문자열인지 확인해주면 된다.

 

해결 2

import sys
input = sys.stdin.readline

N = int(input())
strings = []
for _ in range(N):
    strings.append(input().rstip())

# print(strings) # ['asdfge', 'asdg312dsg', 'asfdfe32']
# print(len(strings[0])) # 6

for i in strings:
    if len(i) >= 6 and len(i) <= 9:
        print("yes")
    else:
        print("no")

 

 

3. 별찍기 8 

2445번: 별 찍기 - 8 (acmicpc.net)

 

2445번: 별 찍기 - 8

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

www.acmicpc.net

 

해결 1 - rjust(), ljust()를 사용하여 문제를 해결했다.

import sys
input = sys.stdin.readline

N = int(input())

for i in range(N):
    star = '*'*(i+1)
    print(star.ljust(N)+star.rjust(N))
    
for i in range(N-1):
    star = '*'*(N-1-i)
    print(star.ljust(N)+star.rjust(N))

 

for i in range(N):
    star = '*'*(i+1)
    print(star.ljust(N)+star.rjust(N))

이것의 결과값은,

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

 

for i in range(N-1):
    star = '*'*(N-1-i)
    print(star.ljust(N)+star.rjust(N))

이것의 결과값은,

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

 

이 두 코드를 합쳐서 다음과 같이 나오면 끝!

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

 

우리 팀원분들의 코드도 너무 좋아서 함께 소개해보려고 한당!!

해결 2

import sys
N = int(sys.stdin.readline().rstrip())
for i in range(1, 2 * N):
    if i <= N:
        i = i
    else:
        i = 2 * N - i
    print("*" * i + " " * (2 * (N - i)) + "*" * i)

 

 

해결 3 - 재귀

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

n = int(input())
solution(n,1)

 

 

 

참고자료

https://codechacha.com/ko/python-string-strip/