본문 바로가기
알고리즘/백준

문자열(1152, 2908, 5622, 2941, 1316)

by 수쨔앙 2022. 9. 11.

1152

문제 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.
입력 첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열은 공백으로 시작하거나 끝날 수 있다.
출력 첫째 줄에 단어의 개수를 출력한다.
sentence = input().split()
print(len(sentence))

sentence = input()
print(sentence.count(" ")+1)

이라고 했었는데

문제를 읽어보니 문자열은 공백으로 시작하거나 끝날 수도 있다고 하니 이 방법은 안되겠다..

아니 이렇게 나오면 len으로 개수를 세어주면 되지 않은가...!!!!

sentence = input().split()
print(len(sentence))

이렇게 쉽게.....??? 

다른사람들은 어떻게 풀었나 봤더니 대부분 이렇게 풀었더라!! 오예!

 

 

 

 

2908

문제 상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두 개를 칠판에 써주었다. 그 다음에 크기가 큰 수를 말해보라고 했다.
상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 예를 들어, 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다.
두 수가 주어졌을 때, 상수의 대답을 출력하는 프로그램을 작성하시오.
입력 첫째 줄에 상근이가 칠판에 적은 두 수 A와 B가 주어진다. 두 수는 같지 않은 세 자리 수이며, 0이 포함되어 있지 않다.
출력 첫째 줄에 상수의 대답을 출력한다.
1)
a, b = input().split()
a_list = list(a)
b_list = list(b)

a_list.reverse()
b_list.reverse()

a_list2 = int(''.join(a_list))
b_list2 = int(''.join(b_list))

if a_list2 > b_list2:
    print(a_list2)
else:
    print(b_list2)

2)
a, b = input().split()
a_list = int(a[::-1])
b_list = int(b[::-1])

if a_list > b_list:
    print(a_list)
else:
    print(b_list)
a, b = input().split()
a_list = []
b_list = []

for i in a:
    a_list.append(i)
a_num = a_list[0]
a_list[0] = a_list[2]
a_list[2] = a_num
for i in a_list:
    print(i,end='')

말도 안되는 코드를 무턱대고 짜다가

이게 아니다 싶어서 멈췄다..ㅋㅋ......

첫번째 세번째 값 바꿔주고 비교하려고 했는데

바꿔주고 찍어주기까지는 해도 비교가 안됨........

 

다른 방법을 찾자.

아차 싶었던게 역순 함수가 있었던 것 같아서 구글링을 해봤다.

 

1. 리스트를 역순으로 바꿔주고 리스트를 문자열로 바꿔주는

reverse(), join() 을 사용하는 방법

 

2. 문자열 슬라이싱을 이용하는 

[::-1]을 사용하는 방법!! 

문자열[시작:끝:규칙] 인데 규칙에 -1을 넣으면 역순으로 출력!!

 

 

둘 다 이용해보자.

 

1.방법을 이용하면

# a, b 값 받아와서 list로 바꿔주기
a, b = input().split()
a_list = list(a)
b_list = list(b)

# list 역순 해주기
a_list.reverse()
b_list.reverse()

# list 공백없이 붙여주기
a_list2 = int(''.join(a_list))
b_list2 = int(''.join(b_list))

# 크기비교해서 더 큰거 찍어주기
if a_list2 > b_list2:
    print(a_list2)
else:
    print(b_list2)

 

2. 방법을 이용하면

# 받아와서 역순취하고 정수로 바꿔주기
a, b = input().split()
a_list = int(a[::-1])
b_list = int(b[::-1])

# 비교해서 큰 값 출력하기
if a_list > b_list:
    print(a_list)
else:
    print(b_list)

 

 

 

5622

문제 상근이의 할머니는 아래 그림과 같이 오래된 다이얼 전화기를 사용한다.

전화를 걸고 싶은 번호가 있다면, 숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다. 숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다.
숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.
상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다. 즉, 어떤 단어를 걸 때, 각 알파벳에 해당하는 숫자를 걸면 된다. 예를 들어, UNUCIC는 868242와 같다.
할머니가 외운 단어가 주어졌을 때, 이 전화를 걸기 위해서 필요한 최소 시간을 구하는 프로그램을 작성하시오.
입력 첫째 줄에 알파벳 대문자로 이루어진 단어가 주어진다. 단어의 길이는 2보다 크거나 같고, 15보다 작거나 같다.
출력 첫째 줄에 다이얼을 걸기 위해서 필요한 최소 시간을 출력한다.
lst = ['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ']
word = input().upper()

time = 0
for part in lst:
    for element in part:
        for i in word:
            if i == element:
                time += lst.index(part)+3
print(time)

1. 알파벳과 숫자를 연결시켜줘야한다.

list 에 알파벳을 다이얼에 써있는 알파벳대로 나누어서 담아주고

그걸 for문으로 돌리고 부분을 또 for문으로 돌려서 일치하는 부분을 index로 찾아주자!

 

2 숫자를 초로 바꿔줘야한다.

문자가 2부터 있는데 2는 3초니까 나오는 숫자에 +3을 더해주는게 초가 되겠다!

 

# 다이얼 전화기의 알파벳대로 나눠주고 단어 입력값 대문자로 받아주기
lst = ['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ']
word = input().upper()

# 초 계산할 time 
time = 0

# lst에서 'ABC', 'DEF' ... 로 for 문 돌리고
for part in lst:
    # 'ABC'에서 A,B,C ... 로 for 문을 돌려주자
    for element in part:
        # 입력값 word도 한글자씩 for 문 돌려서 
        for i in word:
            # 그 A,B,C랑 입력값 한글자씩 돌리는 것과 같으면
            if i == element:
                # index를 찾아주는데 주의해야할 점은 i는 part에 들어있는거지
                # lst에 들어있는것이 아니기 때문에 
                # lst의 index 값을 찾아야하기때문에 
                # i가 들어있는 part의 lst index 값을 찾아서 3을 더해줘야한다!
                time += lst.index(part)+3
print(time)

 

 

 

 

2941

문제 예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.
dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.
입력 첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.
단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.
출력 입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.
word = input()
lst = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z=']

for i in lst:
    word = word.replace(i,'❤')
print(len(word))

input() 값을 받아서

크로아티아 알파벳을 찾아주고 count를 세보자!( 문자열.count(찾을문자) 함수 사용!)

이런식으로 나오니까

크로아티아 알파벳을 리스트에 담아주고 for 문으로 돌려서 count를 세주자!!

word = input()
lst = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z=']
count = 0

for i in lst:
    count += word.count(i)

print(count)

이렇게 해줬더니 

예제 ljes=njak를 하니까 3이 나온다!

그렇다..!! 잘못했다..!!!

e, a, k는 세주질 않았다..!!!! 자 그럼 바꿔주자

리스트 안에 있으면 count 세주고 아니면.......? 아닌걸 어캐 확인하지...?

아니다 아니야

뭔가 간단하게 풀 수 있는 함수가 있을것이니 찾아보자

 

하하... 그것은 replace() 함수..!!!

replace는 특정문자를 바꿔주는 함수니까

for 문으로 돌려서 크로아티아 알파벳을 다른 뭐 *이나 !로 바꿔주고

나중에 최종 문자 길이만 출력하면 되겠지..??

함 해보자

아싸뵤~~!!~!

word = input()
lst = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z=']

for i in lst:
    word = word.replace(i,'❤')
print(len(word))

 

 

 

 

1316

문제 그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.
단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.
입력 첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 단어가 들어온다. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.
출력 첫째 줄에 그룹 단어의 개수를 출력한다.
n = int(input())

group_word = 0
for _ in range(n):
    word = input()
    error = 0
    for index in range(len(word)-1):
        if word[index] != word[index+1]: 
            new_word = word[index+1:]
            if new_word.count(word[index]) > 0: 
                error += 1 
    if error == 0:  
        group_word += 1 
print(group_word)

잉...?? 이건 문제 이해가 잘 안됐다.

뭔소리야..!! 오늘은 너무 머리가 안돌아가니 내일 다시한번 봐야겠당!!!!

---

이틀이 지나고 보니 문제 이해가 갔다! 오예~!

 

 

n = int(input())

group_word = 0
for _ in range(n):
    word = input()
    error = 0
    for index in range(len(word)-1):  # 인덱스 범위 생성 : 0부터 단어개수 -1까지 
        if word[index] != word[index+1]:  # 연달은 두 문자가 다른 때,
            new_word = word[index+1:]  # 현재글자 이후 문자열을 새로운 단어로 생성
            if new_word.count(word[index]) > 0:  # 남은 문자열에서 현재글자가 있있다면
                error += 1  # error에 1씩 증가.
    if error == 0:  
        group_word += 1  # error가 0이면 그룹단어
print(group_word)

 

 

 

728x90

댓글