본문 바로가기

STUDY

파이썬 스터디 3주차(백준)

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

 

1152번: 단어의 개수

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열

www.acmicpc.net

import sys

N = list(sys.stdin.readline().split())
print(len(N))

첫 줄에 문자열이 주어진다. 단어는 공백 한 개로 구분된다. 단어의 개수 출력.

> 처음엔 split(' ')을 썼었으나 마지막 문자에 \n이 같이 들어감을 확인했다. 이를 없애고자 strip을 붙였으나 list에는 strip이 안된다고 한다.

> map도 써봤다. map은 두 가지 이상의 인자를 필요로 한다.

>> ? 도대체 1월의 나는 문제를 어떻게 푼 거지. 해석은 뭐라는거지? map(int, input().split()) 국룰인데.. stdin에서 쓸 수 없다는 건가? 이 부분에 대해서는 추후에 다시 정리해야겠다. (2022 3월 수정)

 

 

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

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

import sys

sent = sys.stdin.readline().strip().upper()
uni_sent = list(set(sent))
ans = []
for a in uni_sent:
  ans.append(sent.count(a))
#여기서 max(ans)하면 4, ans.count(max(ans))하면 2.
#이는 ans의 최빈값의 빈도는 4, 이 최빈값을 가진 값은 2개라는 뜻

if ans.count(max(ans)) > 1:
  print("?")
else:
  print(uni_sent[ans.index(max(ans))])

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

> 하나씩 잘라 리스트에 넣어주려 낑낑대다 최빈값을 찾는 법을 몰라 결국 포기하고 구글링했다.

> sent.count(a)는 sent에 있는 a의 개수를 세 준다. 

> 다음에 한 번 더 풀어보자.

 

 

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

 

2675번: 문자열 반복

문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다

www.acmicpc.net

import sys

T = int(sys.stdin.readline())
for i in range(T):
  R, S = sys.stdin.readline().split()
  for j in S:
    print(j*int(R), end='')
  print()

문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램 작성.

> 'S[i]를 R번 출력 + 공백제외하고 출력'이라는 아이디어는 있었는데 split 활용때문에 또 끙끙대다 결국 구글링했다.

> 반복문 두 개를 활용하는 법에 대해서도 배울 필요가 있어보인다.

> 다음에 한 번 더 풀어보자.

 

 

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

 

2941번: 크로아티아 알파벳

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=

www.acmicpc.net

import sys

sent = sys.stdin.readline().strip()
croatian = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z=']
for i in croatian:
  sent = sent.replace(i, '*')
  #sent에 i(각각의 크로아티아 알파벳)가 있다면 *로 대체됨
print(len(sent))

첫째 줄에 최대 100글자의 단어가 주어진다. 입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력.

> 처음에 각각의 크로아티아 알파벳과 알파벳의 딕셔너리를 만들어 풀려 했는데, 안됐다.

> replace를 쓰는 건 알겠는데, if 입력문자 in croatia_alphabet 이런식으로 풀다 또 막혔다.

> 포인트는 입력문자가 아닌 크로아티아 알파벳을 반복하는 것. if를 쓰지 않아도 된다.

 

 

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

 

1316번: 그룹 단어 체커

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때

www.acmicpc.net

import sys

N = int(sys.stdin.readline())
ans = N
for i in range(N):
  sent = sys.stdin.readline().strip()
  for j in range(len(sent)-1):
    if sent.find(sent[j]) > sent.find(sent[j+1]):
      ans -= 1
      break
      
print(ans)

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성

> 2941과 비슷한 문제인 것 같아 in으로 풀려다 막혀서 또 구글링했다.

> find는 해당 단어를 찾아 index를 알려준다. 다만 값을 지정해주지 않은 경우에는 첫 번째의 위치를 알려주므로, 만약 sent[j]의 인덱스가 sent[j+1]보다 크다면 이는 그룹단어가 아니다(abcabc의 경우 sent[2]는 2(=c), sent[3]은 0(=a)이므로 그룹단어가 아니다)

> 개인적으로 재미있게 잘 만든 문제같다. 이런 문제를 많이 풀다보면 알고리즘 사고능력이 쑥쑥 늘 것 같은 느낌!

> 다음에 한 번 더 풀어보자.

> 참고 :: https://namhandong.tistory.com/67

 

백준 1316번 파이썬 풀이 | 그룹 단어 체커

https://www.acmicpc.net/problem/1316 1316번: 그룹 단어 체커 그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속..

namhandong.tistory.com

 

 

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

 

10809번: 알파벳 찾기

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출

www.acmicpc.net

import sys

S = sys.stdin.readline().strip()
alph = 'abcdefghijklmnopqrstuvwxyz'
for i in alph:
  if i in S:
    print(S.index(i), end=" ")
  else:
    print(-1, end=" ")

알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.

> ans(정답 리스트)를 0이나 -1로만 구성된 것으로 만든 뒤 입력문자에 따라 값을 바꿔 프린트하려 했으나, 리스트는 zeros가 안된다. 리스트 전체 값을 수정하는 방법 또한 찾지못했다. 나중에 리스트 인덱싱으로 시도해볼까 싶다.

> 한 번 더, 리스트는 replace를 쓸 수 없다.

> 너무 오래 고민하는 것 같아 구글링했다.

> 대부분 리스트를 만들 필요 없이 그냥 프린트해 풀더라. 또, 나는 입력문자만큼 반복하는 for문을 만들어 풀고있었으나 다들 알파벳 리스트만큼 반복하는 for문을 만들어 풀더라. '리스트 값이 입력문자에 있다면/없다면'이라는 조건도 나와 구현 방식, 순서가 다른게 조금 슬펐다. 배워가는 과정이니까 뭐.. 괜찮다...ㅠ

> 다음에 한 번 더 풀어보자.

 

 

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

 

11720번: 숫자의 합

첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.

www.acmicpc.net

import sys

N = int(sys.stdin.readline())
temp = sys.stdin.readline().strip()
temp_sum = 0
for i in range(N):
  temp_sum = int(temp[i]) + temp_sum
  
print(temp_sum)

N개의 숫자가 공백 없이 쓰여있다. 이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.

> 분명 원하는 '개수 만큼' 나누는 기능이 있을거라 생각해서 split 툴팁을 읽어봤다. 'maxsplit'은 문자를 나눌 최대 분할수이다. 난 천잰가? 훗 하면서 쓰려는데 구분자가 필요하다고 한다. 어... 구분자..? 없는데... 그래서 못 썼다.ㅋㅋㅋㅋㅋㅋ 문자열 사이에 공백이나 콤마가 있다면 쓰기 좋을 것 같다.

 

 

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

 

5622번: 다이얼

첫째 줄에 알파벳 대문자로 이루어진 단어가 주어진다. 단어의 길이는 2보다 크거나 같고, 15보다 작거나 같다.

www.acmicpc.net

import sys

dials = ['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ']
sent = sys.stdin.readline().strip()
times = 0
for i in range(len(sent)):
  for j in dials:
    if sent[i] in j:
      times += dials.index(j)+3
      
print(times)

상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다. 예를 들어, UNUCIC는 868242와 같다. 할머니가 외운 단어가 주어졌을 때, 이 전화를 걸기 위해서 필요한 최소 시간을 구하는 프로그램을 작성하시오.

> 직접 풀고싶어서 정말 오래 공들였으나 결국 혼자선 풀지못했다.

> 1트:딕셔너리 만들어 .get 활용(실패), 2트:리스트로 만들어 in 활용(실패), 3트:구글링...

> 2트에서 왜 실패했나 보니 다른 건 다 잘 썼는데 for문의 순서를 뒤바꿔 썼더라..ㅎ 예전에는 이런 거 헷갈리지 않았던 것 같은데, 알고리즘 쪽 공부가 필요함을 뼈저리게 느낀다.

> 응애ㅠ