컴퓨터공학 💻 도서관📚

백준 1380번 귀걸이 본문

💣😝알고리즘 문제(CAM)/파이썬

백준 1380번 귀걸이

들판속초록풀 2024. 9. 1. 13:59

이 문제에서 가장 어려운 거  :  입력을 어떻게 받을 것인가?  +  어떻게 저장할 것인가?

 

import sys                     # 밑에서 설명
scenario_number = 0

while True:                    # True 대문자로 써야 함
    n = int(input())
    if n != 0:
        scenario_number += 1
        
    name = [sys.stdin.readline().strip() for i in range(n)]     # 밑에서 설명
        
    list = ['?']*n                 # 리스트 곱셈
    for i in range(2*n - 1):
        a, b = map(str, input().split())      # 밑에서 설명

        tmp = int(a) - 1
        if list[tmp] == '?':
            list[tmp] = b
        elif list[tmp] == 'A' or 'B':
            list[tmp] = 'C'
    for i in range(n):
        if list[i] != 'C':
            print(scenario_number, name[i])

    if n == 0:
        break

 
 
sys 는 System-specific parameters and functions의 약자로, python interpreter가 제공하는 변수와 함수를 직접 제어할 수 있게 해주는 모듈이다.
 
 

* 문자열 n줄을 입력받아 리스트에 저장할 때

import sys
n = int(sys.stdin.readline())
data = [sys.stdin.readline().strip() for i in range(n)]

 

strip()은 문자열 맨 앞과 맨 끝의 공백문자를 제거한다.
 
* sys.stdin.readline() 사용시 주의사항
sys.stdin.readline()은 한줄 단위로 입력받기 때문에, 개행문자가 같이 입력 받아진다.
만약 3을 입력했다면, 3\n 이 저장되기 때문에, 개행문자를 제거해야 한다.
또한, 변수 타입이 문자열 형태(str)로 저장되기 때문에, 정수로 사용하기 위해서 형변환을 거쳐야 한다.
 
 

* 정해진 개수의 정수를 한줄에 입력받을 때

T = int(input()) #Test case
for i in range(T):
        a, b = map(str, input().split())
        print(a+b)

map 함수를 이용하여 입력받는 방법 :
map(A, B)  :  A 함수를  B 행동으로 반복하라

 

import sys

T = int(input()) #Test case
for i in range(T):
        a,b = map(int, sys.stdin.readline().split())
        print(a+b)

sys.stdin.readline() 을 활용하는 방법 : 
반복문으로 여러줄 입력받는 상황에서는 반드시 sys.stdin.readline()을 사용해야 시간초과가 발생하지 않는다

 

 

다른 분의 풀이

answer = []
while True:
    n = int(input())
    if n == 0:
        break
 
    student = []
    for _ in range(n):          # 밑에서 설명
        student.append(input())      # 이렇게도 가능
 
    stack = []                 # 검사단계를 진행하기 위한 새로운 배열 생성
    for i in range(2 * n - 1):
        a, b = input().split()       # 이렇게도 가능
        if a in stack:
            stack.remove(a)     # b 는 쓰지도 않음
        else:
            stack.append(a)
 
    answer.append(student[int(stack[0]) - 1])      # 밑에서 설명
 
for idx, i in enumerate(answer):        # 밑에서 설명
    print(idx+1, i)

 
이 사람은 입력을 좀 다르게 받았다

# 1

for _ in range(n):
        student.append(input())
        
        
# 2

for i in range(2 * n - 1):
        a, b = input().split()

# 1  :  append 함수안에  input 함수를 넣어서 입력 받는 방법
# 2  :  map 함수 없이 정해진 개수의 정수를 입력 받는 방법
 
 
for _ in range(n):
그저 입력만 받기 위한 용도로 사용될 때는  몇 번째 반복인지는 궁금하지 않기 때문에 언더바를 사용한다.
 
 
위 코드에서 stack[0] 만 필요한 이유  :  2n-1 줄에  n명이 돌려받았는지에 대한 정보가 나오기 때문에 못 받은 학생은 한 명밖에 없다는 뜻이다.
 
 
enumerate  :  인덱스와 값을 함께 출력해주는 함수

for i, name in enumerate(['body', 'foo', 'bar']):
     print(i, name)


# 출력
# 0 body
# 1 foo
# 2 bar

enumerate는 ‘열거하다’라는 뜻이다. 이 함수는 순서가 있는 데이터(리스트, 튜플, 문자열)를
입력으로 받아 인덱스 값을 포함하는 enumerate 객체를 리턴한다.
보통 for 문과 함께 사용된다
 
for문 구조  -->  for  변수  in  함수:

 

 

추가 복습 : 직접 코딩 해 본 후

import sys
answer = []            # 정답을 배열로 출력해야 될 것 같으니 미리 만들어 놓기   

while True:           # 0을 입력하기 전까진 반복함 --> while True:가 while보다 더 편함
                      # while True로 첫 번째 while문 진입 조건을 없애기
    n = int(input())

    if n == 0:
        break

    name = [sys.stdin.readline().strip() for i in range(n)]

    tmp = []              # 시나리오가 여러 개 있어서 검사 단계도 여러 개니까 임시배열 만들기
                          # 검사 단계에서 보통 임시변수 필요함
    for i in range(2*n - 1):
        a, b = map(str, input().split())
                          # 검사 단계
        if a in tmp:       # 1번째 테크닉 : 입력 받으면서 저장하고 지우는 테크닉 
            tmp.remove(a)
        else:
            tmp.append(a)
    answer.append(name[int(tmp[0])-1])   # 2번째 테크닉: 답 내는데 학생 이름만 필요함을 알아내기
                                         # , 귀걸이 못 받은 학생은 한 명임을 아는 문제이해력

for idx, i in enumerate(answer):   # 3번째 테크닉 : enumerate 함수를 사용해서 
    print(idx+1, i)                 # 시나리오 개수를 몰라도 됨

입력받는 방법 외우고 계속 연마하기
여기서 필요했던 저장공간들  :  answer[]  ,  name[]  ,  tmp[]
검사 단계 구현 능력을 키우기, 계속 연습하기
문제이해력 기르기
좋은 테크닉은 빠르게 흡수하기  :  enumerate 함수 --> 시나리오 개수 변수가 필요없게 만듦

 

 
참고 )
https://velog.io/@yeseolee/Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%A0%A5-%EC%A0%95%EB%A6%ACsys.stdin.readline

[Python 문법] 파이썬 입력 받기(sys.stdin.readline)

파이썬으로 코딩 테스트를 준비한다면, 반드시 알아야 할 입력방식인 sys.stdin.readline()에 대한 정리 입니다.

velog.io

https://velog.io/@hubsuk/Python-%EB%AC%B8%EB%B2%95-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%A0%A5-%EB%B0%9B%EA%B8%B0sys.stdin.readline

[Python 문법] 파이썬 입력 받기(sys.stdin.readline)

한 두줄 입력받는 문제들과 다르게, 반복문으로 여러줄을 입력 받아야 할 때는 input()으로 입력 받는다면 시간초과가 발생할 수 있습니다.주로 map 함수를 사용해 형 변환을 해줍니다.예제방법예

velog.io

Comments