백준 문제풀이 63

[백준 1764번 문제] 듣보잡

이 문제는 미리 입력받은 문자열 리스트에 나중에 입력한 문자열이 있는지 확인하는 문제이다. 중복인 경우가 발생할 수도 있으므로 리스트 대신 집합을 이용해서 풀었다. 입력받은 값들을 집합에 넣어주고 for문을 통해서 집합안에 존재하면 결과를 저장할 리스트에 추가해 주었다. 그 다음에 결과를 저장한 리스트 길이를 len 함수를 이용해서 출력해주고 for문을 통해서 결과 문자열들을 출력해 주었다. end=""는 입력할 때 개행문자를 포함해서 저장이 되어서 출력할 때 \n이 두번 발생해서 사용하였다. import sys input = sys.stdin.readline n, m = map(int, input().split(' ')) hear = set() for i in range(n): name = input(..

백준 문제풀이 2022.09.15

[백준 11659번 문제] 구간 합 구하기 4

이 문제는 정해진 수만큼 값을 입력받은 후에 i번째부터 j번째 수까지의 합을 구하여 출력하는 문제이다. 처음에 값을 입력받아서 리스트에 저장한 후에 for문으로 입력받은 인덱스에 직접 접근해서 sum이란 변수에 값을 더하여 출력하는 방법으로 구현했더니 시간초과 문제가 발생했다. 그래서 왜 시간 초과가 나는지 검색해보니 내가 한 방식 즉 매번 연산처리를 할 때마다 배열에 직접 접근을 하게되면 시간 복잡도가 O(NM)이 되기 때문에 1초이내에 풀 수 없다. 그래서 다른 방법을 고민해보다가 미리 리스트에 각 구간의 합들을 저장해 놓고 나중에 입력받은 구간마다의 합만 출력해준다면 훨씬 시간이 덜 걸릴거라는 생각이 들었다. temp = 0 pre_sum = [0] for i in num: temp += i pre..

백준 문제풀이 2022.09.03

[백준 1920번 문제] 수 찾기

이 문제는 미리 입력 받은 수안에 다음 입력받은 숫자들이 존재하는지 확인하는 문제이다. 존재한다면 1을 출력하고 존재하지 않으면 0을 출력하는 조건이다. 처음에 숫자들을 입력받아서 리스트에 저장하는 방식으로 했는데 시간초과 문제가 발생하였다. 그래서 중복되는 숫자가 있는 경우가 있어서 그런가? 싶어서 미리 입력받은 숫자를 set함수를 이용해서 중복을 제거하려했는데 역시나 시간초과 발생,,,ㅠ a = list(map(int, input().split(' '))) a = set(map(int, input().split(' '))) 위에 리스트 형식을 set 형식으로 바꾸었더니 해결되었다! 마지막으로 결과값 출력은 for문을 통해서 미리 입력받은 값안에 있다면 조건문을 통해 0 또는 1을 출력하도록 구현하였다..

백준 문제풀이 2022.08.31

[백준 10773번 문제] 제로

이 문제는 원하는 숫자만큼 수를 입력받는데 0을 입력했을 때는 전에 입력받은 숫자를 지운후에 남은 숫자들의 합을 구하는 것이다. 그래서 for문을 이용해서 입력받은 숫자가 0이 아닌경우에는 빈리스트에 숫자를 넣어주고 0인 경우에는 pop을 해주어서 리스트에서 삭제하도록 구현하였다. 마지막으로 리스트에 남은 숫자들의 합을 구해서 출력해주면 끝! import sys input = sys.stdin.readline n = int(input()) num = [] for i in range(n): number = int(input()) if number == 0: num.pop() else: num.append(number) # print(num) sum = 0 for i in num: sum += i print..

백준 문제풀이 2022.08.28

[백준 2164번 문제] 카드2

이 문제는 큐의 원리를 응용한 문제이다. 입력받은 숫자만큼의 카드가 1부터 있고 맨앞에 있는 카드를 없앤 후에 나머지 카드 중 맨앞에 있는 카드를 맨위로 옮기는 방식이다. 이렇게 카드가 1개가 남을 때까지 반복한 후에 1장 남은 카드의 숫자를 출력하면 된다. 먼저 for 반복문을 이용해서 1부터 입력받은 N까지의 숫자카드를 빈 리스트에 저장해주었다. for i in range(1,n+1,1): card.append(i) 그 다음 아래와 같은 원리로 카드놀이가 진행된다. 123456 23456->34562 4562 -> 5624 624 -> 246 46 -> 64 4 맨앞에 있는 숫자를 pop시키고 모든 숫자를 왼쪽으로 옮겨주는 과정을 어떻게 구현할까 고민했었는데 며칠전에 풀었던 deque를 이용해서 po..

백준 문제풀이 2022.08.26

[백준 14425번 문제] 문자열 집합

이 문제는 주어진 문자열에 입력한 문자열이 몇개가 있는지 출력하는 문제이다. N개 만큼의 문자열을 미리 리스트에 넣고 M개 만큼 문자열을 입력받아서 집합에 있는지 확인하고 총 몇개가 있는지 출력하면된다. 두 번의 for문을 이용해서 첫번째는 빈 리스트에 문자열을 저장해 놓는다. 그 다음 for문을 이용해서 집합에 입력받은 문자열이 있으면 0으로 초기화된 cnt의 값을 1씩 증가시켜주는 방식으로 풀었다. import sys input = sys.stdin.readline n, m = map(int, input().split()) s = [] for i in range(n): s.append(input()) # print(s) cnt = 0 for i in range(m): sentence = input()..

백준 문제풀이 2022.08.26

[백준 18258번 문제] 큐 2

이 문제는 큐를 구현하는 문제이다. 각 명령어를 입력할 때마다 주어진 조건에 맞게 결과를 출력하면 된다. 처음에 for문안에 조건문을 이용해서 문제를 풀었는데 push 1 이렇게 문자열과 숫자가 같이 있는 경우를 어떻게 해야할지 고민이였다. if "push" in msg: m, num = map(str, msg.split(' ')) num = int(num) 이런식으로 msg = input()으로 입력받아서 split메소드를 이용해서 숫자를 따로 저장할 생각이였다 그리고 "push" in msg 이런식으로 입력받은 값안에 명령어를 확인해서 조건문으로 처리했는데 시간초과가 발생하였다ㅠ 그래서 다른 방법을 검색해 보니깐 deque를 사용하는 방법이 있어서 해결했다. 나머지 명령어 조건문은 동일한데 pop을 ..

백준 문제풀이 2022.08.21

[백준 2477번 문제] 참외밭

이 문제는 ㄱ자 모양의 밭 모양의 길이를 입력받아서 넓이를 계산한 후에 제곱미터당 수확되는 참외의 갯수를 곱해 총 생산되는 참외 갯수를 구하는 문제이다. 처음에 어떻게 풀지 고민을 하다가 큰 사각형 넓이에서 작은 사각형 넓이를 빼주면 되겠다고 생각했다. 그래서 입력값을 받아서 가로와 세로로 구분해서 각 리스트에 저장한 후에 최대값끼리 곱하고 최소값끼리 곱해서 빼주면 되겠다고 생각했는데 틀렸다고 떴다ㅠ 다시 생각해보니깐 작은 사각형 길이가 항상 최소값이지 않을 경우도 있는게 문제였다. 작은 사각형의 가로세로 길이를 어떻게 구할지가 고민이였는데 입력받은 값대로 total리스트에 넣어주고 세로왁 가로의 최대값 인덱스를 구해서 -1과 -5한 인덱스값을 빼준 후에 절대값을 계산하면 작은 사각형의 변의 길이가 나온..

백준 문제풀이 2022.08.19

[백준 10814번 문제] 나이순 정렬

이 문제는 입력한 숫자만큼 사람들의 나이와 이름을 입력받아서 나이순으로 정렬하는 문제이다. 이번 문제는 풀 때 약간 까다로운 조건들이 있었다. 처음에 두개의 값을 딕셔너리에 쌍으로 저장해서 정렬하는 방식으로 풀려고 했는데 딕셔너리는 중복키를 가질 수 없어서 동일한 나이가 입력된 경우에 나중에 입력한 value값으로 바뀌게 된다. 그래서 2차원 배열을 사용해서 풀기로 하였다. n = int(input()) members = [[0 for x in range(2)] for y in range(n)] for i in range(n): age, name = input().split(' ') members[i][0] = int(age) members[i][1] = name 2차원 배열을 어떻게 초기화 해야할지 방..

백준 문제풀이 2022.08.13

[백준 4153번 문제] 직각삼각형

이 문제는 세 변의 길이를 입력받아서 직각삼각형인지 아닌지 판별하는 문제이다. 문제를 풀기위해서는 직각삼각형을 만족하는 조건을 알아야하는데 바로 피타고라스의 정리이다. 가장 긴 변의 제곱은 나머지 두변의 제곱의 합과 같다는 원리이다. 위의 공식을 이용해서 먼저 세 변의 길이를 입력받아서 리스트에 저장해주었다. 그리고 sort() 함수를 이용해서 오름차순으로 정렬한 후에 조건문을 통해 결과값을 출력해 주었다. 입력값이 0 0 0인 경우에는 프로그램을 종료해야 하므로 while 반복문안에 조건문을 넣어주어서 리스트안의 값이 0만 존재하는 경우에는 break를 통해 반복문을 탈출하도록 구현하였다. import sys input = sys.stdin.readline while(True): triangle = l..

백준 문제풀이 2022.08.12