본문 바로가기

공부/BOJ

백준 알고리즘 문제 풀이 일기 (211127~211204) 일주일 간의 기록

풀다가 인상 깊었던 문제들을 하나씩 포스팅하는 것보다는, 이렇게 글 하나에 간단하게 정리하는 것이 좋다는 생각이 들었다.

현재 기준 이 블로그가 구글 검색에 뜨지 않기도 하고, 검색에 잡힌다고 해도 내 허접한 코드가 타인에게 아직까지는 도움이 되지 않을 것 같다는 판단을 했다.

코딩 실력이 늘기 전까지는 이렇게 기록하려고 한다.

 

2021/11/27

2557번: Hello World (브론즈 5)
10718번: We love Kriii (브론즈 5)

역시 첫 시작은 Hello World다. 두 문제 간단하게 출력만 하면 되는 문제다.


10171번: 고양이
10172번: 개

예제 출력을 그대로 복붙해서 출력했는데 알아서 역슬래쉬가 붙여져서 나왔던...

이 문제들도 기본적인 출력 문제였는데 역슬래쉬를 출력하려면 앞에 역슬래쉬를 한 번 더 입력해야 한다. 큰 따옴표를 출력할 때도 따옴표 앞에 역슬래쉬를 붙이자.


1000번: A+B (브론즈 5)
1001번: A-B (브론즈 5)
10998번: AXB (브론즈 5)
1008번: A/B (브론즈 4)
10869번: 사칙연산 (브론즈 5)

매우 간단한 문제. A/B 같은 경우는 소수점을 출력하려면 Double형을 이용하자.


10430번: 나머지 (브론즈 5)

괄호만 잘 쓰면 틀릴 일이 없는 문제다.


 

2588번: 곱셈 (브론즈 4)

세 자리 자연수가 두 개 주어졌을 때 곱셈 과정대로 출력하는 것. 나머지를 이용해서 풀면 되는 간단한 문제다.

 

역시 단계별로 풀고 있어서 그런지 오늘 풀었던 문제는 매우 쉬웠다.

2021/11/28
1330번: 두 수 비교하기 (브론즈 4)

매우 쉽지만 문제 대충 봐서 한 번 틀렸던 문제다. 두 수가 같을 때 "=="를 출력해야 하는데 "="를 출력하게 하고 제출했기 때문.. 문제를 잘 읽어야 한다! 삼항 연산자를 이용하면 코드 길이를 줄일 수 있다.


9498번: 시험 성적 (브론즈 4)

if문을 이용해서 풀었다. case문으로 풀어도 괜찮을듯.


2753번: 윤년 (브론즈 4)

문제 제대로 안 읽고 풀어서 한 번 틀렸던 문제. 400의 배수일 때를 처리하지 않았기 때문이다. 쉬운 문제라도 이렇게 틀릴 수 있으니 잘 읽어보자.


14681번: 사분면 고르기 (브론즈 4)

x, y점이 양수일 때와 음수일 때를 구분해서 해당하는 사분면의 값을 출력해주면 된다.


2884번: 알람 시계 (브론즈 3)

이 때까지 풀었던 문제는 아무 생각없이 풀었는데, 드디어 머리를 굴릴 수 있는 문제가 나왔다. 간단하게 주어진 시간에서 -45분 하면 되는 문제다.

주어진 시간이 h시 m분이라 치자. m이 45 이상이면 m에서 45를 빼면 되고, 45분 미만이면 h를 1 빼주고 m에 60을 더해준 다음에 45를 빼면 된다. 그리고 한 가지 더 처리해줘야 한다. h가 0일 때는 23으로 넘어가게 한다.

여기서 (m>=45)를 >로 적어버려서 틀렸다가, 바로 고치고 제출해서 맞췄다.


2739번: 구구단 (브론즈 3)

매우 쉬웠던 문제. 브론즈4여도 될듯.


10950번: A+B - 3 (브론즈 3)

주어진 횟수만큼 반복문을 돌리고 자연수 2개를 입력받아 합을 출력해내는 간단한 문제다.

 

2021/11/29

 

8393번: 합 (브론즈 5)

주어진 수 n을 1부터 n까지 더한 합을 구하는 매우 쉬운 문제다. 반복문 안에 sum+=i; 하면 끝나는 문제인데 sum = i+n;으로 해놓고 틀렸다. 정신이 나갔나보다. 계속 풀다보면 이런 실수는 하지 않을 것 같다.


15552번: 빠른 A+B (브론즈 2)

그동안 Scanner와 System.out.println만 사용했는데 BufferedReader와 BufferedWriter로 입출력을 하라는 문제였다. 이를 이용하면 시간이 매우 단축된다. 이후로 BufferedReader로 입력을 받아오는 연습을 하고 있다. 형변환도 일일이 해줘야하며, Scanner를 이용하는 것보다 코드가 꽤 길어지지만 실력있는 개발자가 되기 위해 왠만해선 BufferedReader를 쓰기로 마음먹었다.


2741번: N 찍기 (브론즈 3)
2742번: 기찍 N (브론즈 3)

8393번: 합 문제를 풀었으면 쉽게 풀 수 있는 문제라고 생각한다. 쉬웠다.


11021번: A+B - 7 (브론즈 3)
11022번: A+B - 8 (브론즈 3)

매우 간단했던 출력 문제


2438번: 별 찍기 - 1 (브론즈 3)
2439번: 별 찍기 - 2 (브론즈 3)

재밌는 별찍기 문제가 나왔다! 1은 쉬운데 2는 조금 생각이 필요하다. 다양하게 풀고싶어서 repeat메소드도 사용해봤다.


10871번: X보다 작은 수 (브론즈 3)

간단한 문제인데 마지막의 공백을 제거하겠다고 조금 힘들게 푼 문제다.. 스트링버퍼를 사용해봤다. 근데 공백 제거하지 않고 바로 제출해도 되는 문제였다.


10952번: A+B - 5 (브론즈 3)

while문을 무한으로 돌리다가 입력란에 0두개가 들어오면 반복문을 탈출시킨다. 간단한 문제다.


10951번: A+B - 4 (풀이 실패)

EOF에 대해서 알고있어야 풀 수 있는 문제다. 모르는 상태였기 때문에 풀이를 확인해봤다. 다음에 제대로 이해하고 있을 때 풀어보려고 한다. 그런데 풀어도 잘 모를 것 같아서 계속 북마크 해둔 상태다.


1110번: 더하기 사이클 (브론즈 1)

재미있었던 문제다. 머리를 써야해서 공책에 끄적이면서 풀었다. 딱 이런 난이도의 문제가 적당하게 재밌는 것 같지만.. 이보다 어려운 문제를 풀어서 실력을 향상시켜야 한다.

 

2021/11/30
10818번: 최소, 최대 (브론즈 3)

주어진 수에서 최솟값과 최댓값을 구하면 되는 문제인데 쉬워서 풀긴 했다. 새로운 풀이 방법이 있나싶어서 봤는데 Arrays.sort()를 이용해서 간단하게 푸는 방법도 있었다. 이렇게 풀어보려고 북마크를 해둔 상태다. 다음에 기억 안 날때 쯤에 다시 풀어보는걸로!!!


2562번: 최댓값 (브론즈 2)

최댓값을 출력하고 그 위치도 출력하는 문제다.  쉬웠다.


2577번: 숫자의 개수 (브론즈 2)

AXBXC 했을 때 각 숫자가 몇 번 쓰였는지 출력하는 문제다. 난 한 번 틀리고 조금 복잡하게 풀어서 맞았다. 좀 더 간단하게 풀 수 있는 방법이 있기 때문에 잘 숙지하고 있으면 좋을 것 같다. int를 String으로 바꾸고 문자 값 -48이나 -'0'하면 원하는 자리수를 추출할 수 있는 것 같다.


3052번: 나머지 (브론즈 2)

풀긴 했지만, 다른 분의 풀이 방법을 보니 HashSet을 이용해서 엄청 간단하게 풀 수 있다. 북마크 해두고 다음에 HashSet을 이용해서 풀어봐야겠다.


1546번: 평균 (브론즈 1)

한글을 잘 읽어야한다. 꽤나 풀만했던 문제다. 중간에 형변환도 한 번 해줘야하는데 형변환 방법 잊어버려서 구글에 검색했었다.


4344번: 평균은 넘겠지 (브론즈 1)

한 번 틀리고 두번만에 맞은 문제다. 형변환을 어떻게 하는지 몰라서 검색 후 DecimalFormat을 이용해서 풀었다. 기본적인 걸 잊어버리니 조금 고생했다.


 

2021/12/01
8958번: OX퀴즈 (브론즈 2)

재밌었던 문제다. 보너스 점수를 어떻게 계산할지만 잘 짜면 쉽게 풀리는 것 같다.


15596번: 정수 N개의 합 (브론즈 2)

정수 n개의 합을 구하는 함수를 만들면 되는 매우 쉬웠던 문제다.


1065번: 한수 (실버 4)

완전 막혀버려서 풀이를 봐버린 문제다. 한수라는 개념 자체가 이해가 되지 않았기 때문이다. 힌트를 보고 천천히 풀어보긴 했는데 내 힘으로 푼 것이 아니다. 북마크 해두고 기억이 날라가면 다시 풀어봐야겠다. 

11654번: 아스키 코드 (브론즈 5)

아스키 코드에 관한 기본적인 출력 문제다. 덕분에 한 번 짚고갈 수 있었다.

10809번: 알파벳 찾기 (브론즈 2)

 처음에 문제를 잘못 이해해서 다르게 풀었다가 알아채고 그럭저럭 잘 해결했던 문제다. 꽤나 풀만한 문제다.

2675번: 문자열 반복 (브론즈 2)

주어진 문자열을 주어진 횟수만큼 반복시키는 문제다. 쉬운 문제였던 것 같다.

2021/12/02

 

1157번 단어공부 (브론즈 1)

문제 푸는데 1시간 걸렸다. 구글 검색은 일절 하지 않고 오로지 내 지식으로만 풀었다. 아직 부족하기 때문에 코드가 길어졌는데 신기하게 풀렸다. 아스키코드를 이용하여 풀면 더 쉬웠을 것 같다.

A : 65 ~ Z : 90 / a : 97 ~ z: 122

max 변수를 0으로 초기화 했었는데 대부분 관행상 음수로 초기화 한다고 한다. 앞으로 잘 활용하자.

그리고 입력받을 때 toUpperCase() 함수를 이용해서 대문자쪽만 처리해주는 풀이도 봤는데 괜찮은 것 같다.


1152번 단어의 개수 / 풀이 실패

쉽다고 생각했다. 시간도 얼마 안 걸렸고 코드도 짧았기 때문이다. 예제 전부 정상으로 출력됐는데 제출을 했을 때는 틀렸다고 나왔다.

반례도 찾기 힘들어서 어쩔 수 없이 다른 분들의 풀이를 봤다. 원인을 찾아보니까 공백을 입력했을 때가 반례였다. 나와 같은 상황의 사람들이 굉장히 많았다. 내가 그래도 평범하게 코딩을 해오고 있긴 하구나.. 하는 안도감이 들었다.

그래서 StringTokenizer를 이용한 쉬운 풀이법을 찾아봤다. StringTokenizer 클래스는 하나의 문자열을 여러 토큰으로 분리시켜준다.

이를 배웠으니까 이 문제는 내버려두고 2주 뒤에 다시 새로운 방법으로 풀어봐야겠다.


2908번: 상수 (브론즈 2)

굉장히 쉬웠던 문제. 문제 푸는데 20분도 안 걸렸고 고민도 없이 바로 해냈다.

입력받은 A와 B를 거꾸로 담는 법은 나누기와 나머지를 잘 이용하면 됐고 마지막에 if else문으로 비교해서 값을 도출해내면 됐다. 입력 수가 세자리 수라서 이렇게 쉽게 풀었던 것 같다.

StringBuilder의 reverser() 메소드를 사용하면 더 쉽게 풀어진다고 한다.

다양한 클래스를 알고 있으면 확실히 문제 푸는게 수월해지는 것 같다..


5622번: 다이얼 (브론즈 2)

처음에 문제 보고 어려운 문제인줄 알았는데 문제를 이해하고 나면 굉장히 쉬운 문제다. if문을 이용하여 하나하나씩 처리하는 방법을 이용했는데 나름 잘 접근해서 다행이었다. 너무 쉬워서 딱히 할 말이 없는 문제다.

 


2941번: 크로티아 알파벳 (실버 5)

풀다가 안 되는 부분이 있어서 포기할려 했다. 이렇게 if문으로 쭉 코드를 짜는게 맞나 하다가 풀이를 봤다. 근데 내가 접근한 방식이 맞았다. 한 가지 안 풀리는 부분이 있었는데 문제를 제대로 읽어보니 보였다.

표에 나와있는 알파벳만 크로티아 알파벳이 아니라, 입력된 알파벳이 전부 크로티아 알파벳이었던 것.

전부 내 스스로 푼 문제는 아니지만 if문 작성하느라 눈이 아파서.. 다시 풀지는 않으려고 한다.


2292번: 벌집 (브론즈 2)

처음 풀어보는 기본 수학 카테고리의 문제이다. 문제 읽고 어려울줄 알고 겁이 났는데 육각형으로 이루어져있다는 것만 알면 꽤나 쉽게 접근할 수 있다. 다행히 내 힘으로 간단한 코드를 이용하여 풀 수 있었다.

이번주에 쭉 코딩 공부를 하지 않고 이 문제부터 처음 접했으면 못 풀었을 것이다. 이번주에 계속 코드만 짜고 있다 보니 사고력이 늘어나는 것 같다.


2021/12/03
1712번: 손익분기점 (브론즈 4)

문제 자체는 쉬웠고 출력도 완벽하게 해냈다. 하지만 막상 제출을 해보니 시간 초과가 뜨는 것이었다. 어떤 부분이 잘못 된지 모르겠어서 딱 힌트만 봤다. 

21억 이하의 자연수가 입력값으로 들어가서 반복문을 쭉 돌리면 시간 초과가 일어나는 것 같았다. 그래서 반복문을 사용하지 말고 수식을 사용하라는 것이었다.

그동안 너무 반복문에 의존했던 것 같다. 공책에 수식을 천천히 정리해보니까 간단하게 나오는 문제였다. 문제를 풀기 전에 수식으로 만들 수 있냐를 먼저 생각해보자!


1193번: 분수찾기 / 풀이 실패

1시간 정도 고민해봐서 일부 부분은 처리할 수 있었는데 정확한 규칙을 찾을 수 없었다. 슬프다..

풀이를 봤는데 대각선으로 보면서 문제를 풀면 됐었다. 분모와 분자를 합한 합이 같은 부분끼리 한 그룹으로 묶어주면 된다. 풀이를 봐버렸으니 다음에 푸는 것을 기약했다. 다음에도 풀 수 있을진 모르겠다.


2869번: 달팽이는 올라가고 싶다 (브론즈 1)

위 1712번 문제를 풀고 나서 이 문제도 반복문이 아닌 수식을 풀어야겠다는 생각이 들었다. 수식을 만들어야 하는데 손익분기점 문제보다는 어려웠다.

A만큼 올라가면 B만큼 내려가는데, 처음엔 day = V/(A-B) 이렇게 짰다. 하지만 잘 생각해보니 A만큼 오르기만 하면 굳이 B만큼 내려갈 필요가 없다. 그래서 곰곰이 생각하고 수식을 day = (V-B)/(A-B)로 변경했지만 다른 문제가 발생했다. 소수점으로 나왔을 때 숫자를 1씩 올려줘야 됐다. 이 부분은 예제 입력이 없었다면 생각하지 못 했을 것 같다.

이 부분은 1로 나눴을 때 나머지가 0으로 나오지 않으면 수식에 1을 더해줬다. 중간에 형변환도 해줘야 했었다.

어느정도 힌트를 본 문제기 때문에 북마크 해두고 다음에 풀어봐야겠다. 딱 적당한 난이도의 문제였다.


10250번: ACM 호텔 (브론즈 3)

지문이 길어서 겁이 났지만 분수찾기 문제를 보고 왔다면 이 문제는 쉽게 느껴질 것 같다. 딱 20분만에 풀었다.

항상 보는 풀이 블로그가 있는데 나랑 비슷한 방식으로 알고리즘을 짜셔서 굉장히 뿌듯했다! 다시 풀 일이 없을 정도로 완벽하게 이해한 문제였던 것 같다.


2775번: 부녀회장이 될테야 (브론즈 2)

배열 길이를 실수로 1낮게 초기화시켜서 처음엔 런타임 에러가 났다. 바로 눈치채고 올려줬다.

대충 원리를 알았는데 배열에 먼저 전체적으로 값을 전부 다 넣어준 다음에 해당 위치에 해당하는 값을 출력해냈다. 다행히 범위가 14까지라 괜찮았다. 접근 방법은 좋았는데, 값을 더해줄 때 사용하는 while문은 필요없었다. 그래도 뿌듯하다.


2839번: 설탕 배달 (브론즈 1)

처음에 접근을 잘못 해서 헤맨 문제다. 그래서 거의 두시간을 고민했다. 고민 끝에 혼자서 풀 수 있었다.

조금만 늦었으면 그냥 풀이를 봐버리고 다음에 풀까 싶었는데 다행히 그러지 않아도 됐다. 포기하지 않은 덕이다. 여러 가지 경우가 주어졌을 때를 생각하여 처리하는 것이 중요하다.

풀이를 봤는데 반복문이 필요없었다. 나도 수식을 먼저 만드려고 했는데 도무지 생각이 안 나서 반복문으로 만들었다. 그래도 아직 초보니까 푼 것에 의의를 두도록..

시간이 지난 다음에 반복문 없이 풀어봐야겠다.


 

2021/12/04
10757번: 큰 수 A+B / 풀이 실패

그닥 어려운 문제는 아니었으나 기본 지식이 거의 없어서 풀지 못 했다. 접근을 어떤 방식으로 해야 될지도 떠오르지 않았기 때문에 풀이를 먼저 보았고 다음에 풀으려고 한다.

BigInteger라는 아주 좋은 클래스를 배웠다. Math.max()는 두 수 중 가장 긴 자리 수를 가져온다.


1011번: Fly me to the Alpha Centauri (골드 5)

3시간을 넘게 잡고 있었지만 풀지 못 했다.  반복문을 이용해서 풀긴 했다만... 세상에서 제일 싫은 시간 초과가 떠서 결국 실패했다. 그러면 수식을 만들어야하는 셈이다.

하지만 수식을 아무리 해도 만들 수가 없었다. 정말 경우의 수를 차례대로 어느정도 다 나열한 다음에 규칙을 찾아야하나.. 실제론 그런 여유를 줄까?라는 생각이 든다.

힌트를 보면서 천천히 풀어봤다. 내 힘으로 푼건 아니니 다음에 다시 풀어봐야겠다. 시간 초과라도 반복문으로라도 풀리긴 해서 다행이다. 문제 난이도가 골드 5인걸 보니 어려웠던 것이 정상이었구나.


3009번: 네 번째 점 (브론즈 3)

정답률이 70%를 넘어가는 쉬운 문제였다. 아까까지 좀 난이도가 있는 문제를 풀다보니 너무 어렵게 접근했다. 제곱까지 하고 루트까지 해서 계산하고 있었다. 질문 검색 카테고리에서 조금 살펴보고 바로 방향성을 잡아서 풀었다.

그냥 입력받은 세 개의 좌표중 안 겹치는 좌표를 출력해내면 되는 쉬운 문제다.


4673번: 셀프 넘버 (실버 5)

 며칠 전에 풀려고 시도했다가 어떻게 접근해야 될 지 모르겠어서 풀이 대충 보고 말았던 문제다. 풀이 방법이 기억이 나지 않아서 풀게 되었다. 오늘 풀었던 문제들 보다가 이 문제를 푸니까 엄청 쉽게 느껴졌다. 각 자리 수 구하느라 공책에 많이 끄적이긴 했다.


일주일간 55문제를 해결하고 실버5가 되었다. 아마도 거의 브론즈 문제라 쉬워서 시간이 얼마 안 걸린 것 같다. 다음 주는 아마 해결한 문제 수가 반이나 줄어있을 것 같다ㅠㅠ 열심히 하자!