코딩 문제 47

백준 18870 - 좌표압축

https://www.acmicpc.net/problem/18870 나의 풀이 ==> 시간 초과 발생 사실상 for문 2번을 사용해서 풀면 답이 쉽게 나오는 문제이지만, 시간을 고려하지 않아 백준에서는 시간초과로 오답처리가 된다. for문을 2번 사용하면 O(n^2) 시간 복잡도를 갖으므로 리스트가 아닌 딕셔너리를 통해 문제를 해결해야한다. 다른 사람의 풀이를 참고하여 코드를 작성하였다. 문제 해결 순서는 다음과 같다. 1. 입력받은 숫자들이 들어있는 리스트를 set()으로 만들어 중복을 제거한다. 2. 중복을 제거하여 만든 리스트를 정렬한다. 3. for문을 사용하여 정렬한 리스트의 처음 인덱스부터 마지막 인덱스까지 접근한다. 빈 딕셔너리의 key값으로 리스트의 원소를 넣고 value값으로는 순위를 넣..

코딩 문제 2022.08.04

백준 - 단어정렬 (조건이 있는 정렬)

해당 문제는 정렬 sort 사용시 옵션에 key 값으로 조건을 걸어 해당 조건으로 정렬하면 쉽게 풀리는 문제이다. 리스트명.sort(key=lambda: 적용할 함수) 만약, 다중 조건을 건다면 => (조건1, 조건2) 이렇게 괄호로 묶을 것 위 문제에 대한 풀이는 다음과 같다. import sys n=int(input()) string=[] for i in range(n): string.append(sys.stdin.readline().strip()) string = list(set(string)) string.sort(key= lambda x: (len(x), x)) for i in string: print(i) 정렬의 첫 번째 기준은 단어의 길이순, 두 번째 기준은 사전순 정렬이다. 길이가 같은 단..

코딩 문제 2022.07.21

백준 골드바흐의 추측

2023.01.03 복습 => 실패 이 문제는 결국 구글링의 도움을 얻었던 문제이다. 10000까지의 소수를 모두 구하여 리스트에 담는 것 까지는 쉽게 했다. 하지만, 입력 받은 숫자가 두 소수의 합이 되게끔하는 두 수를 찾는 방법을 생각해내기가 어려웠다. 두 수를 소수 리스트에서 꺼낼 생각만 하고 있었는데, 구글링을 해보니 굳이 두 숫자를 찾을 필요가 없었다. 하나의 소수를 픽한다면, 나머지 하나는 당연히 입력 받은 숫자에서 픽한 소수가 되는 것이다.. 결국엔 소수를 하나 정한 뒤, 입력받은 숫자에서 픽한 소수를 뺀 숫자가 소수인지 아닌지 확인해서 출력하는 문제.. 두 소수의 차이가 가장 적은 것을 출력하라고 했으니 입력받은 숫자를 반으로 나눠 하나씩 줄여가면서 보면 된다. 코드도 매우 간결하다. de..

코딩 문제 2022.07.12

백준 달팽이는 올라가고 싶다/에라토스테네스의 체

2023.01.03. 복습 결과 => 스스로 풀지 못함 a, b, v = list(map(int, input().split())) h = 0 day = 0 while h= v: # 목표 높이 이상 올라간 경우 break h = h - b print(day) 위 문제를 그대로 구현한 코드이다. 당연히 로직은 맞지만, 계산이 오래걸리는 경우에 시간 초과가 나온다. 따라서 다른 로직으로 작성해야한다. 내 코드) split을 사용하여 세 정수를 한 줄에 나눠서 입력받는다. 만약, a==v이면 낮에 올라가는 것만으로도 도착할 수 있으므로 하루가 걸린다. a 아니다. 만약, a가 충분히 크고 b가 매우 작을 경우에는 원하지 않는 결과가 나온다 ex) 100 99 1000000000 달팽이가 올라가기 시작한다는건 반..

코딩 문제 2022.07.07

백준 그룹단어 체커

코드 리뷰) 맨 윗 줄에는 단어의 개수 n을 입력받고, 단어 n개를 입력받기 위해 반복문을 사용하였다. 단어를 입력 받으면, 일단 결과를 0으로 초기화하고 문자열 a의 요소를 하나하나씩 탐색한다. 만약 문자열에 들어있는 문자의 갯수가 1개가 넘는다면, 반드시 연속으로 있어야 그룹단어가 되므로 조건문을 사용하여 해당 문자가 나타나는 맨 처음 인덱스와 맨 마지막 인덱스를 구한다. 그래야 처음 인덱스~ 마지막 인덱스까지 해당 문자만 있는지 확인할 수 있기 때문이다. 여기서 마지막 인덱스를 구하기 위해서 a.rfind(찾고자하는 문자)를 사용하였다. 그 다음, 처음 인덱스 ~ 마지막 인덱스까지 반복문을 사용하여 훑어봤는데, 만약 그 사이에 문자열에 해당 문자가 아닌 문자가 온다면, result=1로 두어 그룹단..

코딩 문제 2022.07.06

백준 더하기 사이클, 크로아티아 알파벳

#방법1 N=input() l=list(map(int, N)) N=int(N) a=N cnt=0 sum=0 while(True): if N>=10: sum=int(l[0]+l[1]) sum=sum%10 new=int(str(l[1])+str(sum)) N = new l=list(map(int, str(new))) cnt=cnt+1 else: new=int(str(N)+str(N)) N=new l=list(map(int, str(new))) cnt=cnt+1 if a==new: break print(cnt) 위의 방법1은 내가 처음 이 문제를 풀었던 방법이다. 그냥 문제에서 주어진대로 각 자릿수를 쪼개어 더하고, 리스트에 넣기도 하고.. 좀 더럽지만 정석대로 풀었다. 아래의 방법2는 다른 사람의 코드를 보..

코딩 문제 2022.07.05

백준 문제 풀이 메모( 7/5 수정)

앞으로 공부해야 될 것 => 한 줄에 여러 개를 입력받기, 여러 줄에 걸쳐 입력 받기 여러가지 라이브러리 함수들.. 참고 https://docs.python.org/ko/3/library/collections.html collections — 컨테이너 데이터형 — Python 3.10.5 문서 collections — 컨테이너 데이터형 소스 코드: Lib/collections/__init__.py 이 모듈은 파이썬의 범용 내장 컨테이너 dict, list, set 및 tuple에 대한 대안을 제공하는 특수 컨테이너 데이터형을 구현합니다. named docs.python.org https://wikidocs.net/22805 1) 리스트 컴프리헨션 ## 리스트 생성하기 기존에 배운 문법으로 1부터 10까지..

코딩 문제 2022.07.05