목록코팅테스트/백준 문제 모음 (296)
For Programmer
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/SMoK8/btreCUslR7a/83CjqXlSPFw4oh8PxqY3s1/img.png)
-> 이 문제의 키포인트는 무엇일까? 입력받는 수의 범위가 10억까지인데 시간제한은 0.15초이다. 즉, 반복문으로 풀라는 소리가 아니다. 그러면 수학적 식을 찾아야하는데 식을 어떻게 찾을 수 있을까? a(낮에올라가는높이) , b(밤에 미끄러지는 높이) , v(올라가야되는 높이),count(마지막날을 제외한 올라간 횟수) 를 놓고 식을 짜보겠다. v
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/d6TkXJ/btreCe4D0zd/oIeHLnzdsfs1vKLm5SUrvk/img.png)
나의 코드 input_num = int(input()) line = 0 # 사선 라인 max_num = 0 # 입력된 숫자(input_num 변수)의 라인에서 가장 큰 숫자(1 -> 1, 2-> 2 , 3 -> 4 , 4-> 7 ...) min_num = 1 # 입력된 숫자(input_num 변수)의 라인에서 가장 작은 숫자(1 -> 1 , 2 -> 3 , 3 -> 6 , 4 -> 10 ...) i = 0 while input_num > max_num: # 조건: 입력한 x번째 수가 해당 라인의 최대값보다 작거나 같다면 빠져 나온다. line += 1 # 해당 input_num이 존재하는 라인 위치 min_num += i # 각 라인에서의 최솟값 i += 1 # 라인에서의 최소값,최대값을 찾기 위한 증가..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/EktlX/btrevah85Az/PlzkrdBrOu6WMzax1Zyo4k/img.png)
나의 코드 n = int(input()) a = 1 i = 1 if n == 1: print(1) else: while True: if n 해당 코드는 급하게 시간내에 푼다고 정신없이 쓴 코드이다. 결국 이문제는 조건만 찾으면 되는데 구간이 6의 배수 만큼 증가한다는 것이다. 그것을 어떻게 코드로 구현할지에 대한 것만 본다는 것이다. 이 코드를 더 간결하게 만들 수 있다. n = int(input()) a = 1 count_six = 1 i = 1 while n > a: count_six = 6 * i a += count_six i += 1 print(i)
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dU3off/btreo4JCcUA/aODEoHfbtv52UP3LctxwPK/img.png)
나의 코드 (오답) import sys a,b,c = map(int,sys.stdin.readline().split()) count = 0 if b >= c: count -= 1 else: while True: count += 1 if a + b * count 아마 대다수의 사람들이 이런식으로 코드를 짰을 거라고 생각한다. 브론즈 4문제임에도 불구하고 정답률이 25%밖에 안되는 굉장히 난해한 문제이다. 이런식으로 코드를 짜면 무조건 시간초과 판정이난다. 그렇다면 우리는 무엇을 해야할까? a,b,c 가 21억이하의 자연수인 범위에서는 반복문을 돌면서 찾는것이 아닌 일반식을 찾아야 한다는 것이다. a + b * count < c * count 식..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bRdTIq/btretcNfP9s/5ij1emDzQZnTfZZdeaLpUK/img.png)
n = int(input()) count = 0 for i in range(n): s = input() if len(s) == 1: # s가 만약에 한자리면은 무조건 그룹단어이다. count += 1 #따라서 +1 해준다. else: #2자리 이상이라면 for j in range(1, len(s)): #2번째 인덱스부터 마지막 인덱스까지 if s[j - 1] == s[j]: #문자 두개씩 비교를 해서 만약 같다면 pass #아무것도 하지않는다. elif s[j - 1] in s[j:]: #만약 문자 두개가 다르고 앞의 문자가 뒤 문자부터 마지막 인덱스 안에 또 등장한다면 break #반복문을 빠져나간다. if j == len(s) - 1: #만약 위의 반복문 break없이 다돌고 마지막 인덱스까지 왔다면..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b3wKDX/btreoUmpixz/ykVSk4EUeE7ZxXrFoOLakK/img.png)
s = input() croatiaAlphabet = ["c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="] #크로아티아 알파벳 설정 for j in croatiaAlphabet: #크로아티아 알파벳내부 리스트 원소에 접근 if j in s: #만약 입력한 문자열중에 크로아티아 알파벳이 있다면 s = s.replace(j,"1") #그것을 1개의 길이를 가진 문자(여기서는 "1")로 변경 print(len(s)) 길이출력 -> replace만 잘활용한다면 쉽게 풀수 있는 문제이다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dBhCv8/btrevX9s8jo/XlSiZa4z0Qv21IS9A9bbk1/img.png)
나의 코드 s = input() temp = 0 for i in range(s.__len__()): if s[i] == "A" or s[i] == "B" or s[i] == "C": temp += 3 elif s[i] == "D" or s[i] == "E" or s[i] == "F": temp += 4 elif s[i] == "G" or s[i] == "H" or s[i] == "I": temp += 5 elif s[i] == "J" or s[i] == "K" or s[i] == "L": temp += 6 elif s[i] == "M" or s[i] == "N" or s[i] == "O": temp += 7 elif s[i] == "P" or s[i] == "Q" or s[i] == "R" or s[i]..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/UWQ7i/btreotWCpLw/aiLFTkfO1zvHyEBiiWkt8k/img.png)
나의 코드 s1, s2 = input().split() s3, s4 = "", "" for i in range(len(s1) - 1, -1, -1): #마지막 문자부터 역순으로 인덱스 돌가 s3 += s1[i] #마지막 문자부터 새로운 문자열에 대입 s4 += s2[i] #마지막 문자부터 새로운 문자열에 대입 print(max(s3, s4)) -> 파이썬스럽게 해결하지 못한 코드이다. 이는 간단한 문제이기 때문에 상관없지만 만약 메모리 제한이 타이트하게 잡혀있다면 공간복잡도에서 걸릴 수도 있다. 따라서 다음코드를 간단하게 변경할 수 있다. s1, s2 = input().split() s1 = s1[::-1] #1st,2nd 생략하면 자동으로 첫번째와 마지막 인덱스로 설정 ,step에 -1 설정씨 역순으로..