컴퓨터공학 💻 도서관📚
백준 1380번 귀걸이 본문
이 문제에서 가장 어려운 거 : 입력을 어떻게 받을 것인가? + 어떻게 저장할 것인가?
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 함수 --> 시나리오 개수 변수가 필요없게 만듦
'💣😝알고리즘 문제(CAM) > 파이썬' 카테고리의 다른 글
백준 1436번 영화감독 숌 : 풀이 아이디어 (복습) (0) | 2024.08.25 |
---|---|
백준 1247번 부호 (해결과정) (0) | 2023.10.11 |