여담
이번에 코테스터디에 참여하게 되면서 연습도 해볼겸 오랜만에 백준 문제를 풀었더니,
생각보다 잘 풀리지 않아서 현타 아닌 현타를 느꼈다... ㅋㅋ
2학년 문해프 과목 들을 때부터 꾸준히 하루에 한두문제씩 푸는 습관을 들였어야 했는데
그간 이것저것 병행하다보니 코딩 문제 푸는 것에 소홀히 하게 된 점이 후회된다.
근데 뭐...어쩌겠나 해야지 이제라도
스터디에 함께 해보지 않겠냐고 제안해준 센빠이들에게 무한의 감사를 표함니다 하하
백준 시뮬레이션(구현) 문제
1157번
https://www.acmicpc.net/problem/1157
1157번: 단어 공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
www.acmicpc.net
package 구현;
import java.io.*;
public class b1157 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
int len = input.length();
int arr[] = new int [26];
for(int i = 0; i < len; i++) {
if( 'A' <= input.charAt(i) && input.charAt(i)<= 'Z')
arr[input.charAt(i)-'A']++;
else
arr[input.charAt(i)-'a']++;
}
char ch = '?';
int max = -1;
for(int i = 0; i < 26; i++) {
if (arr[i] == max) {
ch = '?';
}
else if (arr[i] > max){
max = arr[i];
ch = (char)(i + 65);
}
}
System.out.println(ch);
}
}
방법 2:
toLowerCase 사용하여 불필요한 배열 추가 생성X
마지막에만 대문자로 바꿔주기
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine().toLowerCase();
int len = input.length();
int arr[] = new int [26];
for(int i = 0; i < len; i++) {
arr[input.charAt(i)-'a']++;
}
char ch = '?';
int max = -1;
for(int i = 0; i < 26; i++) {
if (arr[i] == max) {
ch = '?';
}
else if (arr[i] > max){
max = arr[i];
ch = (char)(i + 65);
}
}
System.out.println(ch);
}
}
10431번
https://www.acmicpc.net/problem/10431
10431번: 줄세우기
초등학교 선생님 강산이는 아이들을 데리고 단체로 어떤 일을 할 때 불편함이 없도록 새로 반에 배정받은 아이들에게 키 순서대로 번호를 부여한다. 번호를 부여할 땐 키가 가장 작은 아이가 1
www.acmicpc.net
문제를 보자마자 든 생각
1. 배열을 써야할까 ArrayList를 써야할까?에 대한 고민
2. 그냥 삽입정렬 문제인듯...
조건이 엄청 길어서 괜히 복잡하게 생각했다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int tc = Integer.parseInt(br.readLine());
for(int t = 1; t <= tc; t++) {
String input = br.readLine();
StringTokenizer st = new StringTokenizer(input);
Integer.parseInt(st.nextToken());
int students[] = new int[20];
int count = 0;
for(int i = 0; i < 20; i++) {
students[i] = Integer.parseInt(st.nextToken());
}
for(int i = 0; i < 20; i++) {
for(int j = 0; j < i; j++) {
if(students[j] > students[i])
count++;
}
}
System.out.println(t + " " + count);
}
}
}
1138번
https://www.acmicpc.net/problem/1138
1138번: 한 줄로 서기
첫째 줄에 사람의 수 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이 왼쪽에 몇 명이 있었는지 주어진다. i번째 수는 0보다
www.acmicpc.net
1. 이미 사람이 들어간 자리에 다른 사람은 못 들어가므로 boolean형 배열인 visited를 사용함
2. <자신의 왼쪽에 사람이 얼마나 서있었는지 = 즉, 맨 왼쪽을 기준으로 자신이 이동한 칸 수>를 count 변수로 선언함
3. StringBuilder 로 값 저장해준 후 출력 > StringBuilder는 매우 유용하고 편하다
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int arr[] = new int [N];
boolean visited[] = new boolean[N];
for(int i = 0; i < N; i++) {
int n = Integer.parseInt(st.nextToken());
int count = 0;
for(int j = 0; j < N; j++) {
if(!visited[j]) {
if(count == n) {
visited[j]=true;
arr[j] = i+1;
break;
}
count++;
}
}
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < N; i++) sb.append(arr[i]+" ");
System.out.println(sb);
}
}
8911번
https://www.acmicpc.net/problem/8911
8911번: 거북이
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 컨트롤 프로그램이 주어진다. 프로그램은 항상 문제의 설명에 나와있는 네가지 명령으로만 이루어져
www.acmicpc.net
좌표 위를 움직이는 유형의 문제는 1학년때부터 자주 풀어본 문제 유형이라 처음에 봤을 땐 넘 오랜만이라 가물가물하니 잘 기억이 안났지만 어찌저찌 기억해냄... 휴
우선 switch문을 사용하면 매우 편하겠다는 생각을 가장 먼저 떠올렸고 dir 배열과 각종 변수들을 선언해준 후에 switch문 틀을 짜놓았다.
★key idea) 최소 직사각형의 넓이를 구해야 하므로 거북이가 움직인 최대 x,y 좌표 값과 최소 x,y 좌표 값을 모두 알아야한다.
넓이를 구하려면 당연히 이 좌표 값을 알아야하고 x와 y 각각에 대한 (min-max)를 서로 곱해주면 최소 직사각형의 넓이를 구할 수 있음.
다음으로 헷갈렸던건, 회전을 어떻게 코드 상에서 구현하느냐 인데
상하좌우 총 네 방향이므로 d=0,1,2,3 중 하나의 값을 가지며 위와 같이 나타낼 수 있다.
package 구현;
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
int[][] dir = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
for (int tc = 0; tc < T; tc++) {
int x = 0; int y = 0; int d = 0;
int maxX = 0, maxY = 0, minX = 0, minY = 0;
String command = br.readLine();
for(char c: command.toCharArray()) {
switch(c) {
case 'F':
x += dir[d][0];
y += dir[d][1];
break;
case 'B':
x -= dir[d][0];
y -= dir[d][1];
break;
case 'L':
d = (d + 1) % 4;
break;
case 'R':
d = (d + 3) % 4;
break;
}
maxX = Math.max(maxX, x);
minX = Math.min(minX, x);
maxY = Math.max(maxY, y);
minY = Math.min(minY, y);
}
System.out.println((maxX-minX)*(maxY-minY));
}
}
}
'Algorithms > study log' 카테고리의 다른 글
[java] 다익스트라 알고리즘 (0) | 2024.02.01 |
---|---|
[백준 나무자르기] 이분탐색시 시작 혹은 끝 지점 설정하는 방법 (0) | 2024.01.17 |
[java] 이분탐색 (2) | 2024.01.12 |
[Algorithm] Greedy 그리디 알고리즘 (1) | 2023.12.27 |
[Algorithm] DFS, BFS (1) | 2023.12.22 |