'Algorithm' 카테고리의 글 목록

문제 번호 문제 힌트 문제 제목 링크
10869 사칙연산 사칙연산 https://www.acmicpc.net/problem/10869
2588 사칙연산 곱셈 https://www.acmicpc.net/problem/2588
2884 if 문 알람 시계 https://www.acmicpc.net/problem/2884
1110 while 문 더하기 사이클 https://www.acmicpc.net/problem/1110
4344 1차원 배열 평균은 넘겠지 https://www.acmicpc.net/problem/4344
4673 함수 셀프 넘버 https://www.acmicpc.net/problem/4673
1157 문자열 단어 공부 https://www.acmicpc.net/problem/1157
2941 문자열 크로아티아 알파벳 https://www.acmicpc.net/problem/2941
2869 기본수학 1 달팽이는 올라가고 싶다 https://www.acmicpc.net/problem/2869
1929 기본수학 2 소수 구하기 https://www.acmicpc.net/problem/1929
11729 재귀 하노이 탑 이동 순서 https://www.acmicpc.net/problem/11729
11651 정렬 좌표 정렬하기 https://www.acmicpc.net/problem/11651
2805 이분탐색 나무 자르기 https://www.acmicpc.net/problem/2805
4949 스택 균형잡힌 세상 https://www.acmicpc.net/problem/4949
1874 스택 스택 수열 https://www.acmicpc.net/problem/1874
1021 회전하는 큐 https://www.acmicpc.net/problem/1021
2606 DFS와 BFS 바이러스 https://www.acmicpc.net/problem/2606
7576 DFS와 BFS 토마토 https://www.acmicpc.net/problem/7576
1003 동적계획법 피보나치 함수 https://www.acmicpc.net/problem/1003
11053 동적계획법 가장 긴 증가하는 부분 수열 https://www.acmicpc.net/problem/11053

 

1. 크로아티아 알파뱃

이 문제는 결과적으로 엄청 짧은 코드로 해결했지만, 어떻게 접근해야 할지 몰라서 꽤 오랜 시간을 잡아먹었다.

처음에는 그냥 1글자씩 반복을 돌려서 1,2 글자를 비교해서 배열에서 찾으면 되겠다 싶어서 코드를 짯다.

 

<실패코드>

croatia = ["c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="]

text = input()
count = 0

while(True):
    if (len(text) == 0):
        break
    if (len(text) > 1):
        word = text[0] + text[1]
    else:
        word = text[0]
    if word in croatia:
        count += 1
        text = text.replace(word, "", 1)
    else:
        count += 1
        text = text.replace(text[0], "", 1)

print(count)

그러나 이렇게 짜고 보니 3글자에 대한 처리는 전혀 안되어 있어서 3글자까지 고려하면 코드가 괜히 골때려지겠다 싶어서 코드를 한번 엎었다.

이게 막히자 도저히 생각이 안나서 어떻게 해야할지 10분넘게 고민해봤는데, 코드를 두 번정도 틀린 뒤 답을 맞추는데 성공했다.

 

<정답코드>

croatia = ["dz=", "c=", "c-", "d-", "lj", "nj", "s=", "z="]

text = input()

for x in croatia:
    if x in text:
        text = text.replace(x, "?")

count = len(text)

print(count)

 

풀고 나니 너무 짧게 풀리는 코드였다...

 

2. 달팽이는 올라가고 싶다.

이 문제는 접근이 아주 쉬웠다.

그래서 엄청 쉬운줄 알았는데, 실행 시간이 0.25초로 러닝타임을 신경 써야 하는 문제였다.

 

<틀린 코드>

#a,b,v = map(int, input().split())
# a = 낮에 올라가는 높이
# b = 밤에 미끄러지는 높이
# v = 올라갈 높이


a = 100
b = 99
v = 100000

meter = 0
count = 0

while(True):
    count += 1
    meter += a
    if (meter >= v):
        break
    meter -= b

print(count)

 

그래서 시간을 어떻게 단축시킬까 고민이 필요했다.

이 연산을 줄이기 위해 나눗셈과 나머지를 활용해보자고 생각했다.

 

<정답코드>

a,b,v = map(int, input().split())
# a = 낮에 올라가는 높이
# b = 밤에 미끄러지는 높이
# v = 올라갈 높이

meter = 0
count = 0
after_v = v - a

count = after_v / (a-b)
rest = (after_v % (a-b)) + a

while(True):
    count += 1
    meter += a
    if (meter >= rest):
        break
    meter -= b

print(int(count))

 

위와 같이 코드를 짜서 정답을 맞추긴 했는데 영 찜찜해서 더 짧게 할 방법이 있을까 생각해보았다.

 

<정답코드2>

import math

a,b,v = map(int, input().split())
# a = 낮에 올라가는 높이
# b = 밤에 미끄러지는 높이
# v = 올라갈 높이

print(math.ceil((v-b) / (a-b)))

 

단순히 완전히 내가 푼 것은 아니고, 인터넷 검색을 통해 좀 알아보았다. (백준에서도 정답자 코드를 볼 수 있지만, 이유는 안 써있어서 해설까지 포함된 설명을 보았다)

https://yoonsang-it.tistory.com/9

 

백준 2869번 파이썬 풀이: 달팽이는 올라가고 싶다

백준 2869번 달팽이는 올라가고 싶다 알고리즘 분류: 수학 링크: https://www.acmicpc.net/problem/2869 2869번: 달팽이는 올라가고 싶다 문제 땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대

yoonsang-it.tistory.com

 

이렇게 간단한 문제를 저렇게 복잡하게 짯었다니 ㅠㅠ...

알고리즘 오늘부터 조금씩 공부해서 올리려고 했는데 귀찮아서 못하고 있다.

문제를 일단 다 풀어보고 막히는 시점에서 공부해도 되지 않을까..?

어차피 항해2주차에도 공부해야 하고 말이다.

 

그리고 위 블로그 글을 보면서 sys.stdin.readline()을 왜 쓰나 해서 좀 알아보았는데,

파이썬으로 알고리즘 문제를 풀 때에는 input()이 아닌 sys.stdin.readline()으로 하는게 좋다고 한다.

아래글 참고!

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

 

 

'Algorithm' 카테고리의 다른 글

알고리즘 문제 풀기 - 2  (0) 2022.04.12
알고리즘 문제 풀기 - 1  (0) 2022.04.11

앞으로 이미지 하나씩은 넣어 놓으려고 픽사베이에서 가져옴 ㅋㅋ

 

저번에 구해온 항해99 2주차 알고리즘 이미지를 토대로 링크를 작성했다.

문제 번호 문제 힌트 문제 제목 링크
10869 사칙연산 사칙연산 https://www.acmicpc.net/problem/10869
2588 사칙연산 곱셈 https://www.acmicpc.net/problem/2588
2884 if 문 알람 시계 https://www.acmicpc.net/problem/2884
1110 while 문 더하기 사이클 https://www.acmicpc.net/problem/1110
4344 1차원 배열 평균은 넘겠지 https://www.acmicpc.net/problem/4344
4673 함수 셀프 넘버 https://www.acmicpc.net/problem/4673
1157 문자열 단어 공부 https://www.acmicpc.net/problem/1157
2941 문자열 크로아티아 알파벳 https://www.acmicpc.net/problem/2941
2869 기본수학 1 달팽이는 올라가고 싶다 https://www.acmicpc.net/problem/2869
1929 기본수학 2 소수 구하기 https://www.acmicpc.net/problem/1929
11729 재귀 하노이 탑 이동 순서 https://www.acmicpc.net/problem/11729
11651 정렬 좌표 정렬하기 https://www.acmicpc.net/problem/11651
2805 이분탐색 나무 자르기 https://www.acmicpc.net/problem/2805
4949 스택 균형잡힌 세상 https://www.acmicpc.net/problem/4949
1874 스택 스택 수열 https://www.acmicpc.net/problem/1874
1021 회전하는 큐 https://www.acmicpc.net/problem/1021
2606 DFS와 BFS 바이러스 https://www.acmicpc.net/problem/2606
7576 DFS와 BFS 토마토 https://www.acmicpc.net/problem/7576
1003 동적계획법 피보나치 함수 https://www.acmicpc.net/problem/1003
11053 동적계획법 가장 긴 증가하는 부분 수열 https://www.acmicpc.net/problem/11053

 

 

오늘 풀어볼 문제는 바로

1. 셀프 넘버

함수 문제라고 하던데, 나는 함수를 어떻게 써야 할까 고민해보다가 일단은 내 꼴리는 대로 풀어보기로 했다.

아직 뒤로 14문제가 남았는데 6번째 문제부터 벌써 어떻게 접근해야 할까 고민되기 시작했다.

 

처음에는 숫자 1 부터 하나씩 앞의 수가 있는지 체크하는 방식으로 생각을 해봤는데, 도저히 떠오르는 방법이 없어서 아예 1부터 결과물을 리스트에 저장한 뒤, 숫자 1부터 비교해서 없는 값을 출력하면 되겠다고 생각했다.

 

have_number = [] # 셀프넘버가 아닌 값들
result = 0

for num in range(10000): # 셀프 넘버가 아닌 값들을 찾아보기
    result = num
    string_num = str(num)
    for x in string_num:
        result += int(x) 
        # 61 + 6 + 1 해서 68이 나왔다면 이 68이라는 수는 셀프 넘버가 아닐 것이다

    have_number.append(result) # 셀프 넘버가 아닌 값들 저장

for num in range(10000):
    # 1부터 10000까지 반복하며 have_number에 이 숫자가 있는지 체크
    if num not in have_number:
        print(num) # 없는 숫자만 출력

 

일단 이렇게 짜고 통과하긴 했는데 무식한 방법을 쓴 것 같아 약간 찜찜하다.

자료구조나 알고리즘에 대한 학습을 조금 해봐야 할 것 같다! (옛날에 공부 제대로 해보려다 재미없어서 때려쳤다)

나중에 공부하고 나서 좀 수정하는 과정을 거쳐야 겠다.

+ ) 함수를 어떻게 써야 할지 마지막까지도 떠오르지 않았다. 아 몰랑 통과만 하면 장땡이지

 

2. 단어 공부

위의 셀프 넘버보다는 어떻게 접근해야 할지 빠르게 답이 나왔다.

일단 가장 많은 문자를 찾는 것과, 가장 많은 문자가 여러개 일 경우 '?'표시를 하는 것이 관건이었다.

text = input().upper() # 대문자끼리 비교할 것이므로 모든 문자를 대문자로
count = {}

for x in text: # 모든 문자들의 개수를 계산해서 딕셔너리에 저장
    if (x in count):
        count[x] += 1
    else:
        count[x] = 1

best_key = ''
best_key_count = 0
for x in count: 
    # 저장된 문자들의 개수에서 가장 높은 값을 best_key, best_key_count에 저장함
    if (best_key_count < count[x]):
        best_key = x
        best_key_count = count[x]
    elif (best_key_count == count[x]): 
        # 현재 가장 많은 문자와 동일한 개수를 가진 문자가 있을 경우 문자를 '?'으로 변경
        best_key = '?'

print(best_key)

 

 

시간적으로는 오래 안걸리긴 했는데 벌써부터 어지러우므로 오늘은 여기까지 하고 알고리즘 책을 한번 읽어보기로 했다.

알고리즘 책 내용은 내일 언급하도록 하겠다!

'Algorithm' 카테고리의 다른 글

알고리즘 문제 풀기 - 3  (0) 2022.04.13
알고리즘 문제 풀기 - 1  (0) 2022.04.11

항해99를 대비하여 항해99 2주차의 알고리즘 문제를 검색해보니 나왔다.

그래서 각 문제들을 한번씩 풀어보려고 한다.

언어는 파이썬으로 하기로 했다.

 

출처 : https://leedaeho1188.tistory.com/34

 

항해 99 2주차 알고리즘 [WIL]

2주차 알고리즘 항해99 2주차는 알고리즘을 공부하는 주간이다. 3주차까지 포함하여 총 2주동안 알고리즘에대해서 전혀 몰랐던 사람도 2주 후에는 코딩테스트 시험을 보고 통과 할 수 있도록 만

leedaeho1188.tistory.com

 

 

정리

문제 1. (10869) 사칙연산

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

 

10869번: 사칙연산

두 자연수 A와 B가 주어진다. 이때, A+B, A-B, A*B, A/B(몫), A%B(나머지)를 출력하는 프로그램을 작성하시오. 

www.acmicpc.net

+ ) 나누기 빼고는 int 할 필요 없는데 귀찮아서 짯던 코드 그대로 올림. 통과만 하면 장땡이니까~

if __name__ == "__main__":
    a = input().split()
    b = int(a[0])
    c = int(a[1])
    print(int(b+c))
    print(int(b-c))
    print(int(b*c))
    print(int(b/c))
    print(int(b%c))

 

문제 2. (2588) 곱셈

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

 

2588번: 곱셈

첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.

www.acmicpc.net

 

if __name__ == "__main__":
    a = int(input())
    b = input()

    print(a * int(b[2]))
    print(a * int(b[1]))
    print(a * int(b[0]))
    print(a * int(b))

 

문제3. (2884) 알람 시계

 

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

 

2884번: 알람 시계

상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만,

www.acmicpc.net

상근이 참 힘들게 산다

if __name__ == "__main__":
    data = input().split()
    h = int(data[0])
    m = int(data[1])

    if (m >= 45):
        m = m - 45
    else:
        h = h - 1
        m = 60 - (45 - m)

    if (h == -1):
        h = 23

    print(h, m)

 

문제4. (1110) 더하기 사이클

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

 

1110번: 더하기 사이클

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,

www.acmicpc.net

이때부터는 귀찮아서 메인함수 안씀!

origin_data = input()
after_data = origin_data
count = 0

while(True):
    if (len(after_data) < 2):
        x = 0
        y = int(after_data[0])
    else:
        x = int(after_data[0])
        y = int(after_data[1])

    z = x + y
    z = str(z)
    if (len(z) >= 2):
        z = z[1]
    after_data = str(y) + str(z)

    count += 1
    if (int(after_data) == int(origin_data)):
        break

print(count)

 

문제5. (4344) 평균은 넘겠지

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

 

4344번: 평균은 넘겠지

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

www.acmicpc.net

 

# Input Time
num_case = int(input())
data_input = []

for x in range(num_case):
    data_input.append(input())

# Run Time
for x in range(num_case):
    data = data_input[x].split()
    num_students = int(data[0])
    num_points = 0
    for y in range(1, len(data)):
        z = int(data[y])
        num_points += z
    avg = int(num_points / num_students)
    best_students = 0
    for y in range(1, len(data)):
        z = int(data[y])
        if (avg < z):
            best_students += 1
    
    percent = best_students / num_students * 100
    print(str(format(round(percent, 3), ".3f"))+"%")

 

 

휴 오늘은 여기까지...

 

새로 알게 된 것

round는 반올림 함수.

format은 글자의 포맷을 맞춰준다.

'Algorithm' 카테고리의 다른 글

알고리즘 문제 풀기 - 3  (0) 2022.04.13
알고리즘 문제 풀기 - 2  (0) 2022.04.12

+ Recent posts