목록Baekjoon (135)
홍우진의 개발 일기장
문제 링크https://www.acmicpc.net/problem/18870풀이 코드n = int(input())x = list(map(int,input().split()))num = list(set(x)) #중복 제거num.sort()d = {}for i in range(len(num)): d[num[i]] = i # {-10: 0, -9: 1, 2: 2, 4: 3}for i in x: print(d[i], end=' ')코드 해석우선 좌표 압축이란 좌표를 보기 쉽게 크기순으로 출력해 주는 것이다.예시를 들자면 [3, -1, 100]을 [1, 0, 2]로 바꾸는 것이다. 먼저 set을 사용하여 중복을 지워주고 다시 list로 바꿔준다. 그 후 정렬해 주고 딕셔너리를 사용하여 좌표에 순서를 ..
문제 링크https://www.acmicpc.net/problem/25192 풀이 코드name = {}n = int(input())sum = 0for i in range(n): inp = input() if inp == "ENTER": name.clear() elif inp not in name: name.add(inp) sum += 1print(sum)코드 해석set 데이터타입을 이용한다.왜 list 말고 set을 이용하냐??이유는 내부적인 데이터 구조와 탐색 알고리즘의 차이 때문에 시간 차이가 발생하기 때문이다.쉽게말하면 set이 시간이 더 짧게 걸린다. 값을 받은 뒤 값이 ENTER이라면 name을 비워주고만약 아니면서 name에 이름이 없다면 ..
문제 링크https://www.acmicpc.net/problem/2851 풀이 코드jum = [int(input()) for x in range(10)]hap = 0for i in jum: hap += i #버섯을 먹는다. if hap >= 100: #만약 합이 100 이상이라면 if hap - 100 > 100 - (hap - i): #뭐가 더 가까운지 판단 hap -= i #먹기 전이 더 가깝다면 빼기 breakprint(hap)코드 해석점수를 리스트로 만든다.일단 버섯을 먹인 뒤합이 100 이상이 될 경우먹기 전, 먹은 후 중 뭐가 더 100에 가까운지 판단한다.먹기 전이 더 가깝다면 뺀다. 난이도: ★☆☆☆☆
문제 링크https://www.acmicpc.net/problem/13909 풀이 코드n = int(input())print(int(n**0.5))코드 해석열려있는 창문의 수의 규칙성을 찾아야 한다.맨 처음엔 아무 생각 없이 그냥 코딩으로 들이받았는데 답은 맞았지만 메모리 초과가 났다. 규칙을 찾아보자.n에 따른 열린 창문의 수를 구해보자1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16... -> 1 1 1 2 2 2 2 2 3 3 3 3 3 3 4...1,2,3,4... 의 제곱부터 변화한다는 것을 알 수 있다.결국 n의 제곱근을 구하면 된다. 코드가 짧지만 생각보다 머리를 싸맬게 많았다.난이도: ★★☆☆☆
문제 링크https://www.acmicpc.net/problem/1977 풀이 코드jegop = []m = int(input())n = int(input())i = 1while(i 코드 해석브루트포스 알고리즘을 사용한다.값을 1부터 계속 제곱하며 m보다 크고 n보다 작을 경우 jegop 리스트에 추가한다.만약 jegop 리스트에 값이 있다면 총합과 최소값을 출력한다.1부터 구했기때문에 최솟값은 제일 처음에 온다.만약 리스트에 값이 없다면 완전제곱수가 없는것이기 때문에 -1을 출력한다. 난이도: ★☆☆☆☆
문제 링크https://www.acmicpc.net/problem/19532 풀이 코드a, b, c, d, e, f = map(int,input().split())for x in range(-999, 1000): for y in range(-999, 1000): if a*x + b*y == c and d*x + e*y == f: print(x,y)코드 해석단순 브루트포스 알고리즘을 사용하여 해결하였다.이중 for문으로 x와 y에 임의의 값을 삽입하고 a*x + b*y == c와 d*x + e*y == f를 동시에 만족하는 값을 찾을 때까지 for문을 돌렸다.만족한다면? 출력한다. 문제를 처음 봤을 땐 고민이 쫌 됐지만 브루트포스로 간단하게 해결되는 문제였어서 다른 브..
문제 링크https://www.acmicpc.net/problem/10817 풀이 코드print(sorted(input().split(), key = int)[1])코드 해석숏코딩을 해봤다.수를 받은 뒤 띄어쓰기를 기준으로 나누고,sorted 라는 내장 함수를 사용하여 정렬하였다.정렬 기준은 int가 된다.난이도: ★☆☆☆☆
문제 링크https://www.acmicpc.net/problem/13458 풀이 코드x,y,w,h=map(int,input().split())print(min(x, y, w-x, h-y))코드 해석x, y, w-x, h-y 중 최소값이 직사각형의 경계값으로 가는 거리의 최솟값이다. 난이도: ★★☆☆☆코드는 어렵지 않지만 문제해결에서 헷갈릴 수 있다.