알고리즘 풀이 354

[백준 3986] 좋은단어 cpp-py

문제 A와 B로만 이루어진 글자가 있다. 단어 중에서 같은 글자끼리 글자위로 아치형 곡선을 그었을 때 아치형 곡선이 교차하지 않으면 좋은단어이다. N개의 단어 중 좋은 단어가 몇 개인지 출력하라. 입력 첫째 줄에 단어의 수 N이 주어진다. 다음 N개의 줄에 A와 B로만 이루어진 단어가 한 줄씩 입력된다. 출력 좋은 단어의 개수를 출력한다. C++ 같은 글자끼리 글자 위로 아치형 곡선을 그었을 때 교차가되지 않는 조건은 가운데를 기준으로 대칭일 때이다. 대칭을 판단하기 위해 스택을 활용한다. 1. N개의 단어를 입력받을 때마다 다음을 반복한다. 2. 글자를 입력받고 처음부터 탐색을 진행한다. 3. 현재 스택이 비어있으면 현재 글자를 push()한다. 3. 비어있지 않다면 스택의 top()과 비교하고 현재 ..

[백준 10773] 제로 cpp-py

문제 재현이는 재민이를 도와서 돈을 관리 중이다. 재현이는 잘못된 수를 부를 때마다 0을 외쳐서 가장 최근에 재민이가 쓴 수를 지우도록한다. 재민이는 이렇게 모든 수를 받아 적은 후 그 수의 합을 구한다. 입력 첫 번째 줄에 정수 K 이후 K개의 줄에 정수가 1개씩 주어진다. 0일 때는 가장 최근의 수를 지우고 아닐 경우 해당 수를 쓴다 출력 최종적으로 적어 낸 수의 합을 출력한다. C++ 숫자를 입력하다가 0이 나오면 가장 최근에 입력한 수를 제거해야한다. 따라서 스택의 특성을 활용할 수 있다. 스택은 데이터를 넣고 빼는 입구가 한 개이다. 그래서 데이터를 넣다가 뺀다면 가장 최근에 넣었던 데이터가 제거된다. 다음은 스택을 이용한 풀이과정이다. 1. 입력된 K만큼 숫자를 입력하여 num에 저장한다. 2..

[백준 7568] 덩치 cpp-py

문제 사람의 덩치를 비교할 때 몸무게와 키를 이용한다. A와 B의 (몸무게, 키)가 각각 (x, y), (p, q)이고 x>p, y>q라면 A는 B보다 덩치가 크다고 할 수 있다. 하지만 xq라면 비교할 수 없다. 따라서 자신보다 몸무게와 키가 큰 사람의 수+1이 자신의 등수가 된다. N명의 사람에 대한 몸무게와 키가 주어질 때 등수를 순서대로 출력해보자 입력 첫 줄에는 전체 사람의 수 N이 주어진다. 그리고 이어지는 N개의 줄에는 각 사람의 몸무게와 키를 나타내는 양의 정수 x와 y가 하나의 공백을 두고 각각 입력한다. 출력 사람의 덩치 등수를 구해서 그 순서대로 첫 줄에 출력해야 한다. 단, 각 덩치 등수는 공백문자로 분리되어야 한다. python 1. 이중 for문으로 탐색한다. 2. 자신보다 큰 ..

[백준 2231] 분해합 cpp-py

문제 어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오. 입력 첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 입력된다. 출력 가장 작은 생성자를 출력하고 생성자가 없으면 0을 출력한다. 1. 1부터 입력된 N까지 for문을 돌린다. 2. while문을 통해 각각의 수의 분해합을 만든다. 3. 분해합이 입력된 N과 같다면 result에 대입하고 for문을 종료한다. python num = int(input()) result = 0 for n in range(1,num): total = n _n = n..

[백준 2309] 일곱 난쟁이

문제 9명의 난쟁이가 있다. 백설공주는 일곱 난쟁이 키의 합이 100이라는 것을 통해 9명 중 진짜 일곱 난쟁이를 판단하려고 한다. 입력 9개의 정수를 입력한다. 출력 조건에 맞는 7개의 키를 오름차순으로 출력한다. 처음 이 문제를 보고 바로 7개의 경우의 수를 구하여 합을 비교하는 식으로 구성을 했다. 하지만 입력받은 9개의 키를 모두 더하고 2개만 빼서 100이 되는지 확인하면 되는 것을 알았다. 1. 입력받은 키를 정렬한 뒤에 모두 합한다. 2. 이중 for문을 통해 2개의 키를 선택해 키의 합에서 뺀다. 3. 2번의 결과가 100이라면 두 개의 키를 리스트에서 제거한다. ==> 이때 if문 안에 바로 인덱스를 활용해 remove()를 실행했다. 하지만 첫 번째 remove()가 실행되면 인덱스가 ..

[백준 2789] 블랙잭

문제 정수가 적혀있는 n개의 카드 중 3장을 골라서 더했을 때 m이하의 값 중 최댓값을 출력한다. 입력 카드의 개수 n과 합 m을 입력 후에 n개의 카드에 적혀있는 정수를 입력한다. 출력 m이하의 수 중 최댓값을 출력한다. n은 3이상 100이하라는 조건이 있다. n개의 카드 중 중복없이 3장의 카드를 선택해야하기 때문에 최대 100 x 99 x 98 = 970,200의 경우의 수가 나온다. 따라서 충분히 모든 경우의 수를 고려할 수 있기 때문에 완전탐색을 통해 풀어본다. 1. 3개의 for문을 통해 3장의 카드를 선택하는 경우의 수를 조합한다. 2. 이때 중복을 제거하기 위해 각각의 range()를 다르게했다. 3. 마지막 for문에서 선택한 인덱스의 수를 모두 더한다. 4. 현재 최댓값보다 크고 m이..

[Level1] 문자열 내림차순으로 배치하기

문제 입력된 문자열을 내림차순으로 정렬하여 출력한다. 소문자는 대문자보다 크다. 입력 문자열이 입력된다. 출력 내림차순으로 정렬된 문자열이 출력된다. 1. 입력된 문자열을 sorted()를 통해 list로 변환하여 내림차순 정렬한다. 2. join()을 통해 리스트의 문자를 문자열로 합쳐서 출력한다. def solution(s): answer = '' _s=sorted(s,reverse=True) answer="".join(_s) return answer

[Level1] 콜라츠 추측

문제 입력된 수가 짝수면 2로 나누고 홀수면 3을 곱한뒤 1을 더한다. 위의 과정을 1이 될때까지 반복하며 반복한 횟수를 출력한다. 이때 500번을 초과하여 반복했을 때도 1이되지 않는다면 -1을 출력한다. 입력 입력되는 정수는 1 이상 8000000 미만인 정수이다. 출력 반복횟수를 출력한다. 1. 500번의 for문을 실행한다. 2. 짝수면 2를 나누고 홀수면 3을 곱한 뒤 +1한다. 3. 위 과정 중 num이 1이라면 바로 횟수를 return한다. 4. for문에서 return하지 못했다면 -1을 return한다. def solution(num): answer = 0 for i in range(500): if num==1: return i if num%2: num=num*3+1 else: num//..

[Level1] 체육복

문제 여벌 체육복이 있는 학생이 도난당한 학생들에게 체육복을 빌려준다. 학생들의 번호는 체격 순으로 매겨져있어 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있다. 체육복을 적절히 빌려 최대한 많은 학생이 체육수업에 들어야한다. 도난당한 사람과 여분의 체육복이 있는 번호는 중복이 없으며, 여분의 체육복이 있는 학생이 도난당할 수도 있다. 입력 전체학생의 수 n, 도난당한 학생들의 번호가 담긴 리스트 lost, 여벌의 체육복을 가져온 학생 reserve가 입력된다. 출력 체육수업을 들을 수 있는 학생의 최댓값을 return 이번 문제에서 주의해야될 사항은 다음과같다. - 전체 학생 중 도난당하거나 여벌의..

[백준 1152] 단어의 개수

문제 영어 대소문자와 띄어쓰기로만 이루어진 문자열이 있을 때 몇 개의 단어로 이루어져있는지 출력한다. 입력 The Curious Case of Benjamin Button 출력 6 1. 입력받은 문자열을 공백을 기준으로 리스트에 저장한다. 2. 리스트에서 공백을 제외한 문자를 카운트한다. 나의 풀이 test=input() word_list=test.split(' ') count=0 for w in word_list: if w=='': continue else: count+=1 print(count) 다른사람의 풀이 - split()으로 공백을 기준으로 나눠서 리스트에 추가할 때 공백은 추가되지 않는다. text=input().split() print(len(text))

728x90
반응형