백준 1436번 - 영화감독 숌

백준 1436번 바로가기 나의 풀이 count = 1 num = 666 n = int(input()) while count != n: num += 1 if "666" in str(num): count += 1 print(num) CODE REVIEW 브루트 포스방식을 이용해서 문제를 풀어냈다. 사실 규칙성을 찾으려고 해도 잘 안보이길래…ㅎㅎ 숫자 안에 “666"이 있는지 확인하기 위해선 str()로 문자열로 바꿔주고 in을 이용하면 된다!

2023-5-19 · 1 min · 54 words · Junha

백준 7568번 - 덩치

백준 7568번 바로가기 나의 풀이 arr = [] for i in range(n:=int(input())): arr.append(tuple(map(int, input().split()))) ans = [] for i in range(n): count = 1 for j in range(n): if arr[i][1] < arr[j][1] and arr[i][0] < arr[j][0]: count += 1 ans.append(count) print(*ans) 고수의 풀이 x,*y=open(0);z=[[*map(int,i.split())]for i in y] for a,b in z:print(1+sum((a<c)*(b<d)for c,d in z)) 출처 CODE REVIEW 처음에는 정렬해서 문제를 풀어내려 했다. arr.sort(lambda=x:(x[0],x[1])) 그렇지만 다시 원래 순서를 고려해주는것도 귀찮고, 몇 번째로 큰지 결정하는 것에도 은근 신경이 쓰였다. 그래서 그냥 tuple로 (몸무게,키) 정보를 저장하고 각각에 대해서 순위를 결정해주었다. 문제 조건에서 제시했듯이, 자신보다 (몸무게,키) 모두 큰 사람이 있으면 count+=1해주면 된다. 고수의 풀이를 보면 for문 2개 설정해서 index로 불러오는 것이 아닌, (a<c)*(b<d)for c,d in z)처럼 리스트에서 바로 불러와서 사용했다. 이게 더 직관적인 것 같기도…?!

2023-5-19 · 1 min · 121 words · Junha

백준 1018번 - 체스판 다시 칠하기

백준 1018번 바로가기 나의 풀이 score = [] chess = [] n, m = map(int, input().split()) for _ in range(n): chess.append(input()) for x in range(n-7): for y in range(m-7): W_start = 0 B_start = 0 for i in range(x, x+8): for j in range(y, y+8): if (i+j) % 2 == 0: if chess[i][j] != "W": W_start += 1 else: B_start += 1 else: if chess[i][j] != "W": B_start += 1 else: W_start += 1 score.append(B_start) score.append(W_start) print(min(score)) CODE REVIEW 처음에는 브루트포스로 일일히 확인하는 방법을 확인하려했다. 마치 옛날 컴퓨터가 나오기 이전의 OMR 체크 방식처럼 정답틀을 놓고 맞은문제/틀린문제 갯수 세는 것처럼 padding을 1로 놓고 정답 필터를 움직이며 답을 확인하려했다. 하지만 이 방식은 크기가 커지면 커질수록 연산 횟수가 기하급수적으로 늘어서 비효율적이고 당연히 시간 초과… ML에서는 그냥 컴퓨터를 혹사시켜서 이 방식을 택하긴 하지만 ㅋㅋ 도저히 풀이 방법이 생각이 안나서 일주일 정도 붙잡고 있었던 것 같다. 홀짝성 이용하자는 생각이 들었지만 구현하는 방법이 생각이 나지 않아서 다른 포스팅들을 참고했다… 하하… 아직 실력이 부족한듯 많이 배워야겠다. 위치를 (i,j)라고 하면 i+j이 짝수인 경우 “W"만족, 홀수인 경우 “B"만족 OR 짝수인 경우 “B"만족, 홀수인 경우 “W"만족 경우로 나누어 횟수를 세고, 최솟값은 print한다.

2023-5-18 · 1 min · 182 words · Junha

백준 2231번 - 분해합

백준 2231번 바로가기 나의 풀이 def generator(n): return int(n) + sum([int(i) for i in str(n)]) for i in range(n:=int(input())): if n == generator(i): print(i) break else: print(0) 고수의 풀이 N=int(input()) r=0 for i in range(max(0, N-100), N): if sum(map(int,list(str(i))))+i==N:r=i;break print(r) 출처 CODE REVIEW for문 안에서 체크하고 만약 break로 빠져나오는 것이 없으면 else로 넘어가 0을 프린트한다. 고수의 풀이도 논리는 동일하다. 내 코드에서는 else로 예외 처리 해주었지만, ans=0으로 지정해주고 print(ans)를 for문 밖으로 꺼내도 되었다. 3자리가 넘어가게 되면 작은 숫자들로는 애초에 생성자로 불가능하다. 따라서 range(max(0, n-100), n)와 같이 범위 설정해지면 불필요한 연산을 줄일 수 있다. 내 코드 수정… ...

2023-5-18 · 1 min · 119 words · Junha

백준 1747번 - 소수&팰린드롬

백준 1747번 바로가기 생각보다 간단하게 풀린 문제였다. 다만, 문제조건을 잘못 봐서 초기에 조금 헤맸다. n 이상인지 이하인지에 주의하고 범위설정에 유의해야겠다. 이 문제의 경우 1,000,000이 input으로 주어질 경우 output이 없는 문제가 발생하는데 범위를 1,005,000까지 여유있게 잡아주면 문제 없이 실행된다. 그외에는 팰린드롬과 소수판별 알고리즘만 짤 수 있다면 쉽게 해결 가능한 문제였다. import sys def pal(n): return str(n) == str(n)[::-1] def prime(n): if n < 2: return False for i in range(2, int(n ** 0.5) + 1): if n % i == 0: return False return True m = int(sys.stdin.readline()) for i in range(m, 1005000): if pal(i) == True and prime(i) == True: print(i) break

2023-4-19 · 1 min · 102 words · Junha