14681번
반가워요~~ 오랜만에 글을 쓰네요
저번주에 있었던 판교 데이터센터 화재로 인해 카카오의 모든 서비스가 중단되었는데요. 티스토리도 카카오 쪽이라 아예 접속조차 안되고 이틀정도 지나니 글을 보는건 되는데 양식이나 쓰는게 조금 안되서 문제는 계속풀되 시간날때 한번에 올리자 해서 오늘 올리게 됐네요^^
사설이 길었네요 문제를 보면 고등학교 수학시간에 배웠던 1~4분면이 나오는데 여기서 중요한건 x는 오른쪽으로 가면 양수 왼쪽이면 음수 y는 위로가면 양수 아래로 가면 음수인것이죠.
즉 x와 y가 양수이면 1사분면 둘다 음수이면 3사분면 이라고 이해하면 되겠습니다.
이 문제는 정말 간단해요
두개의 값을 입력받아서 음수인지 양수인지만 판별해주면 되거든요.
X = int(input())
Y = int(input())
if X > 0 and Y > 0: print("1")
elif X > 0 and Y < 0: print("4")
elif X < 0 and Y > 0: print("2")
elif X < 0 and Y < 0: print("3")
저는 이렇게 풀었습니다.
x>0 과 y>0 일경우 and를 사용하여 두개의 조건식이 만족할 때 1사분면이 출력되도록 되있습니다.
아래 조건식도 각 1 2 3 4 분면에 맞게 설정하였습니다.
2884번
사실 이 글을 올리는 이유가 여기에 있는데요.
저는 이 문제를 보고 당연히 if문을 사용해서 해야겠다 해서 바로 코드를 짰습니다.
H, M = map(int, input().split())
if(M <45):
H -= 1
M += 60
M -= 45
#위의 코드 두개합쳐서 y+= 15로 할 수 있음!
if(H==-1):
H = 23
print(H,M)
elif(M >=45):
M -= 45
print(H,M)
이렇게 짰고 실제로 정답도 맞았지만 보기 불편하죠? 그래서 혹시나해서 다른 사람이 어떻게 풀었나를 봤는데 충격이었습니다.
그러면 10*60 + 40 = 640이 되겠죠 여기서 -45분을 빼면 595가 나옵니다.
이 595값을 // 연산자를 이용해 60으로 나누면 (//연산자는 나눗셈한 뒤 몫을 구하는 연산자입니다.) 9.9~가 나올텐데 몫만 구하는 것이니 9가 나오고, 595값을 %60 으로 하면 (%(모드)연산자는 나눗셈 한뒤 나머지값을 구하는 연산자) 9로 나누고 나머지인 55가 나오게 되는 것이죠.
//연산자를 이용한 연산을 H값에 %연산을 이용한 값은 %안에 들어가게 하면 시간과 분이 완성됩니다.
정말 이거보고 충격받았어요.
일반적인 if문이 아닌 수학적으로 해결해야 겠다는 생각을 아예 못했거든요.
이 문제를 풀면서 두 가지를 얻을 수 있었는데
첫 번째는 풀고난 뒤에 다른 사람 코드도 한번 보는것이고
두 번째는 자만하지 말자 입니다.
그리고 이 문제를 풀던도중 백준의 알림이 와있길래 뭐지 해서 눌러봤더니
누군가 제 코드를 봤다는게 올라와 있었습니다.. 누구지 하고 봤는데
다이아 4가 왜 제 코드를...
이 분에 대해 궁금해져서 이 분이 쓴 코드를 봤습니다.
제가 전에 if문으로 풀었던 문제를 한 문장으로 풀었더군요.
printf("%c\n", n < 60 ? 'F' : (n == 100 ? 'A' : 'A' + (100 - n - 1) / 10));
이것도 보고 혁명이라 생각했어요 아스키코드값을 이용한다는 생각은 진짜..
코드 해석을 해보자면 60미만일 경우 F, 100일경우 A 그리고 입력받은값을 100-n-1을 한뒤 /10으로 나누면 만약 90이상 이면 9로 0이되고 89일 경우 10이 남게되고 / 10을 하면 1이 남습니다. 근데 왜 1을 'A'에 더하냐? 제가 알고있기로는 문자A의 아스키 코드값은 65입니다. 이 값에 1을 더하면 다음 아스키코드값은 66이 되고 66의 아스키코드값의 문자는 B가 나옵니다.
즉 저 수식으로 79를 넣으면 몫이 2가 남게되고 65+2= 67 아스키코드값의 67은 C가 나오게 되는것이죠.
앞선 두개 문제풀이보고 현타 많이 왔습니다.
생각하는게 아예 달라버리니깐 나는 평범한 사람인게 체감이 되더군요
그래도 아예 주저앉을 수 없으니깐 조금씩 한걸음씩 가보려고 합니다.
힘들때 이 문장을 기억 해주시면 좋겠습니다. "버텨라, 버티면 이긴다!"
다들 화이팅 하자고요!!
2525번
방금 위의 설명 보셨으면 이 문제는 정말 간단하게 풀 수 있습니다.
H, M = map(int, input().split())
C = int(input())
N = (H*60)+M+C
print(N//60%24, N%60)
저는 처음 입력받은 값을 건드는 건 별로 안좋아 합니다. 값이 바뀌면 헷갈리거든요!
그래서 변수 N을 만들어 아까 말했던 방법으로 처리했습니다.
N에 값을 다 더하고 60으로 나누고 몫과 나머지를 구하는 것이죠
그런데 여기서 문제가 발생합니다. 그냥 60으로 나눠서 몫을 구하면 시간이 24시간은 0 으로 표현해야 하는데 0으로 안나오고 24로 나오는 겁니다. 그래서 어떻게 하지 했는데 방법은 간단하더라고요 한번더 24로 나눠 나머지 값을 구해주면 되는 겁니다.
그러면 24미만의 값은 0~23까지 출력이 될거고 24일 경우 0이 출력이 될 것입니다.
정말 이 3문제에서 많이 배웠네요.
그리고 실수였는지 궁금해서 들어오신건지 제 코드를 봐주신 분께도 감사의 말씀을 드립니다.
어떤 방식으로 생각하고 다른 방법은 없는지 알 수 있었던 경험이였어요
앞으로도 문제를 풀고난 뒤에 다른 사람들의 방법도 찾아보고 분석해 볼 예정입니다.
화이팅 하면서 한 걸음씩 나아갑시다!
'IT관련 공부 > 백준(BaekJoon)' 카테고리의 다른 글
2739번, 10950번, 8393번, (0) | 2023.01.13 |
---|---|
2480번 (0) | 2023.01.13 |
1330번, 9498번, 2753번 (0) | 2022.10.14 |
10171번, 10172번, 25083번 (0) | 2022.10.12 |
10430번, 2588번 (0) | 2022.10.12 |