목록코팅테스트/백준 문제 모음 (296)
For Programmer
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bOvl8R/btrhWJ1v1Zz/frwpwJhAAZ6kup8KHVTUq0/img.png)
이문제는 코드보다 밑에 설명을 먼저 읽어보고 나서 코드를 보는 것을 추천한다. 기본적으로 문제를 풀기 위해 식이 어떠한 루틴으로 반복되는지를 알아야 한다. 코드 n = int(input()) result = 0 #결과값 출력을 위한 변수 plusNum = "9" #더해줄 값을 9로 선언 minusNum = "" #빼줄 값을 빈 문자열로 선언 if len(str(n)) > 1: #만약 길이가 1이상이라면 for i in range(1,len(str(n))+1): #입력받은 수의 길이만큼 돈다 if i != len(str(n)): #만약 입력받은 str의 길이가 i랑 같지 않다면 result += (i * int(plusNum)) #result값에 i값과 plusnum(9,90,900.....) 곱한 값을 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/0YKDt/btrhTSeifjj/dEi8XSpKhIsUHs5uBHnTSK/img.png)
사실 이문제는 다른 방식으로 아주 쉽게 풀 수 있지만 문제에서 요구하는 식을 찾지 못할 경우 계속해서 시간초과가 발생한다. 다른 블로그들도 찾아보며 코드를 봤지만 이해가 되지 않아 혼자 다시 풀어보며 최대한 이해하기 쉬운 식을 발견했다. 그 코드는 다음과 같다. 코드 import sys def calculate(m, n, x, y): k = x #k를 x로 초기화 while k 이 문제의 가장 중요한 점은 k 값을 찾기 위해 0부터 +1 씩 계산하는 코드가 나온다면 무조건 시간초과가 발생한다. 그렇다면 결국 k값을 찾을 수 있는 간편한 식을 찾아야 한다는 말인데 간단히 설명하겠다. 우선 이문제에서 첫번째로 찾아야 할 식이 바로 (k-x)%m = 0 이면서 (k-y)%n =0 이다. 사실 이식을 찾았으면 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bOqltk/btrhUkN0Ioo/eKTmE8CKI4WwqBTQuHryb1/img.png)
코드 n, m = map(int, input().split()) board = [list(map(int, input().split())) for _ in range(n)] # 각각의 모든 테트로미노의 모양을 좌표로 저장해놓는다. tetromino = [ [(0, 0), (0, 1), (1, 0), (1, 1)], # ㅁ [(0, 0), (0, 1), (0, 2), (0, 3)], # ㅡ [(0, 0), (1, 0), (2, 0), (3, 0)], # ㅣ [(0, 0), (0, 1), (0, 2), (1, 0)], [(1, 0), (1, 1), (1, 2), (0, 2)], [(0, 0), (1, 0), (1, 1), (1, 2)], # ㄴ [(0, 0), (0, 1), (0, 2), (1, 2)], # ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bhN8Tu/btrhTgyr66G/gCU19KafcFSlvf0ISJE650/img.png)
n = int(input()) input_len = len(str(n)) remoteNum = [x for x in range(10)] currentChannel = 100 breakdownButtonNum = int(input()) #만약 고장난 버튼이 0개 이상이라면 if breakdownButtonNum > 0: breakdownButtons = list(map(int, input().split())) # 고장난 리모컨 버튼 제거 for i in breakdownButtons: remoteNum.remove(i) #우선 현재 채널과 입력받은 채널의 차의 절대값을 결과를 출력할 변수에 대입 result = abs(currentChannel - n) #0번부터 999999번까지 채널을 순회한다.(999..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/4Jd8R/btrhMRrJYkC/njGFgWaR964UmboKqKOpc1/img.png)
코드 e, s, m = map(int, input().split()) arrayE = [x for x in range(1, 16)] arrayS = [x for x in range(1, 29)] arrayM = [x for x in range(1, 20)] i = 0 while True: if arrayE[i % 15] == e and arrayS[i % 28] == s and arrayM[i % 19] == m: print(i+1) #i가 0부터 돌기 때문에 +1 해주기 break i += 1 -> 나머지만 잘 이용한다면 쉽게 풀 수 있는 문제이다. 즉, E의 범위가 15가 넘었을때 어떻게 다시 1로 순환할것인지만 생각하면 된다.(나머지 S,M 도동일) 그 방법이 바로 나머지를 이용하는 것이다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/tw596/btrhDGEK7iI/D2B0rGI3dfNsRwfubqDMg0/img.png)
코드 n = int(input()) array = [] for _ in range(n): colors = list(map(str, input())) array.append(colors) maxCount = 0 #최대 사탕 개수를 초기화 # 배열의 행 마다 같은 색의 사탕이 몇개 있는지 계산 def width(): global maxCount for k in range(n): countRow = 1 #초기 개수를 1로 초기화 for l in range(n - 1): if array[k][l] == array[k][l + 1]: #만약 같은 열의 사탕의 색이 같다면 countRow += 1 #사탕 개수 1 증가 maxCount = max(maxCount,countRow) #증가시킨 값과 최대 사탕개수를 비교..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/pygAK/btrhALZ8f5J/hSVNNA6kkIHcMC7T7s0ia0/img.png)
정답코드1 - for문 이용 array = [] for i in range(9): array.append(int(input())) array.sort() sum_ = sum(array) # 만약 모두다 더하고 2명을 뺐을 때 그 값이 100이라면 2개를 뺀 나머지 값들 출력 for i in range(len(array)): for j in range(i + 1, len(array)): if sum_ - array[i] - array[j] == 100: for k in range(len(array)): if k == i or k == j: pass else: print(array[k]) exit() -> 이문제를 잘생각해보면 9명 중에 7명을 뽑아서 그 합이 100이면 그 7개의 값을 보여주면된다. 그런데..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/m48bM/btrhy2OeGye/p5n5we2JdjKmsAexMNSvdk/img.png)
코드 import sys questionRange = 1000000 #문제에서 주어진 n의 범위 array = [True] * (questionRange + 1) #소수를 저장할 리스트를 n의범위+1 만큼 선언 및 초기화 array[0], array[1] = False, False #0,1은 소수가 아니기에 False로 초기화 #에라토스테네스의체 공식으로 소수 구하기 for i in range(2, int(len(array) ** 0.5) + 1): #주어진범위의 제곱근까지만 돌기 j = 2 # 각 인덱스 i에 곱할 j 선언 while True: if array[i]: #만약 리스트의 인덱스가 True라면(소수라면) array[i * j] = False #그의 배수들은 모두 소수가 아니게 된다. j +=..