본문 바로가기

BOJ/Python

(192)
[BOJ/백준] 4447 - 좋은놈 나쁜놈 (Python) 문제문제링크히어로의 이름이 주어질 때 이름에서 'g'의 수개 'b'보다 많으면 좋은 놈, 같으면 중립, 적으면 나쁜 놈이다. (대문자 포함)히어로를 판별하라. 풀이이이름에서 알파벳을 셀 때 대소문자를 포함해야하므로 lower()로 모두 소문자로 바꾼 채로 처리한다.count()를 사용해 각 문자열에서 알파벳의 개수를 세 비교한다. 코드n=int(input())for _ in range(n): default='GOOD' name=input() s=name.lower() b=s.count('b') g=s.count('g') if b>g: default='A BADDY' elif b==g: default='NEUTRAL' print(f'{na..
[BOJ/백준] 3040 - 백설 공주와 일곱 난쟁이 (Python) 문제문제링크일곱 난쟁이의 모자에 쓰인 수의 총합은 100이고 서로 수가 겹치지 않는다.난쟁이 9명이 있을 떄, 일곱 난쟁이를 찾아라. 풀이이 문제는 브루트포스 알고리즘에 속하는 문제라 중첩 for문으로 풀면 되지만 이 방법은 시간복잡도가 크므로 더 간단한 방법을 사용했다.9명 난쟁이의 모자의 총합에서 100을 빼면 나머지 두 명의 합과 같다.이를 토대로 for문을 돌려 위에서 구한 차가 모자의 쓰인 값들 중 하나이고 현재 난쟁이 모자의 값과 겹치지 않는다면(sum_wrongs != 2*i) 잘못 돌아온 난쟁이 두 명을 구할 수 있다.이 난쟁이들의 모자의 값을 난쟁이들 리스트에서 제거하고 남은 일곱 난쟁이들의 값을 출력한다. 코드def find_correct(nums_list, sum_wrongs): ..
[BOJ/백준] 3035 - 스캐너 (Python) 문제문제링크신문기사는 글자로 이루어진 R*C행렬로 나타날때, 각 문자의 크기를 1*1에서 ZR*ZC 크기로 확대해 출력하라. 풀이기사를 한줄씩 입력을 받아 처리한다. 문자를 하나씩  ZR*ZC 크기로 확대해야 하므로 중첩 for문을 사용한다. 한 줄을 ZR줄로 늘려 출력할것이므로 for z in range(zr):을 사용하고, 가로로는 ZC개씩 출력할 것이므로 [s * zc for s in ss]을 사용했다.만약 이 리스트는 문자열로 이루어진 리스트이므로 각 요소 간 공백이 없게 하나의 문자열로 만들어 출력할 것이므로 ''.join()을 사용했다. 코드r,c,zr,zc=map(int, input().split())for i in range(r): ss=input() for z in range(..
[BOJ/백준] 2966 - 찍기 (Python) 문제문제링크상근이( Adrian )는 A, B, C, A, B, C, A, B, C, A, B, C, ...로, 창영이( Bruno )는 B, A, B, C, B, A, B, C, B, A, B, C, ...로,현진이( Goran )는 C, C, A, A, B, B, C, C, A, A, B, B, ...로 문제의 답을 찍는다.문제의 수와 정답이 주어질 떄, 가장 많이 맞힌 사람과 그 수를 구하라. 풀이각 사람이 찍는 방식에 따라 if문을 구성하여 문제가 맞으면 각 사람의 value값에 1을 더한다.이때 나중에 사람 이름과 맞힌 문제 수를 모두 출력해야 하기 편리하도록 dictionary를 사용했다.모든 문제와 사람에 대해 정답 판단이 끝난 후 dictionary의 value값에 대해 최대값을 구한다.v..
[BOJ/백준] 2947 - 나무 조각 (Python) 문제문제링크바로 앞뒤의 나무조각의 수를 비교하여 앞의 수가 더 크다면 둘의 위치를 바꾼다.앞뒤의 순서가 바뀌면 조각의 순서를 출력하고 조각의 순서가 1 2 3 4 5가 될 때까지 진행한다. 풀이for문을 통해 바로 앞뒤의 조각의 수를 비교해 다르다면 바꾸고 출력하는 과정을 거친다.만약 맨 앞에서부터 끝까지 한 페이즈를 다 돌았을 때도 순서가 정렬된 상태가 아니라면 다시 과정을 반복해야 한다.이때 함수를 다시 불러오게 된다.  이 과정들을 반복해 결국 순서가 1 2 3 4 5가 된다면 종료된다. 코드def change_wood(wood_list): for i in range(4): if wood_list[i]>wood_list[i+1]: wood_list[i], woo..
[BOJ/백준] 2846 - 오르막길 (Python) 문제문제링크오르막길의 크기는 부분 수열의 첫번째 숫자와 마지막 숫자의 차이이다.길이가 n인 수열에서 가장 큰 오르막길의 크기를 구하라. 풀이바로 앞 뒤의 값을 비교하면서 뒤의 값이 더 크다면 오르막이다. (동일한 경우는 오르막길 아님)이때 뒤의 값으로 up값을 갱신해주고 계속 진행한다.그러다 뒤의 값(roads[i])이 더 크거나 앞의 값과 같아지는 경우, 이 길은 내리막 혹은 평지가 된다.이 경우에 현재 상태에서의 up값과 down값의 차이를 리스트에 추가하고 up, down값을 현재 값(roads[i])으로 갱신한 다음 앞의 과정을 반복한다.for문이 종료되면 리스트에는 수열에서의 모든 오르막길의 크기가 담겨있다.문제에서는 가장 큰 오르막길의 크기를 원하므로 max(리스트)을 이용하면 된다. 코드n=..
[BOJ/백준] 12605 - 단어순서 뒤집기 (Python) 문제문제링크스페이스로 띄어진 단어들이 입력될 때, 단어들을 반대 순서로 출력하라. 풀이이 문제는 스택에 해당하는 문제이지만 리스트 자체를 뒤집는 것이 더 간단한 방법이므로reverse()로 뒤집고 요소를 출력하는 방법을 택했다. 코드n=int(input())for i in range(1,n+1): s=list(input().split(" ")) s.reverse() print(f"Case #{i}:", *s)
[BOJ/백준] 2775 - 부녀회장이 될테야 (Python) 문제문제링크k층 n호에 살기 위해서는 아래층의 1호부터 b호까지의 사람들 수의 합만큼의 사람을 데려와야 한다.0층 1호부터 있으며, 0층 i호에는 i명이 산다.주어진 집에 총 몇 명이 들어와야 하는지 구하라. 풀이계산이 쉽게 하기 위해 n이 주어지면, 이 아파트에는 1호부터 n호까지만 존재한다고 가정한다.0층 각 호의 사람들의 수를 리스트로 저장한다.이후 for문으로 k층이 될 때까지 저장된 people list에서 1호부터 i호까지의 사람 수의 합으로 리스트를 갱신한다.for문이 종료되면 리스트의 n-1번째 (호수는 1부터 시작이므로) 요소를 return한다.  코드def come_with(k,n): people=[i for i in range(1, n+1)] for _ in range(k)..