목차
코드업 100제 78번부터는 지금까지 배웠던 것을 총합해서 배우는 단계다.
78번~92번 까지는 배열을 사용 안 해서 풀 수 있지만 (특히 C/C++의 경우) 93번부터는 배열 사용이 필요하다.
그나저나 코드업 100제지만. 100번에 무슨 일이 있었는지 문제 목록에 없었다, 99번에서 끝나고 말았다. 허허
93~95번 : 기초 종합 (배열O, 1차원배열)
93번~95번 : 이상한 출석번호 부르기 시리즈
#1093
#include <iostream>
using namespace std;
int main() {
int a;
cin >> a;
int arr[23] = {};
int j;
for (int i = 0; i < a; i ++){
cin >> j;
arr[j-1]++;
}
for (int i = 0; i < 23; i ++){
cout<<arr[i]<<" ";
}
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int[] arr = new int[23];
int ii = 0;
for (; ii < a; ii++) {
int num = sc.nextInt();
arr[num - 1] += 1;
}
for (ii = 0; ii < 23; ii++) {
System.out.print(arr[ii] + " ");
}
}
}
#1094
#include <iostream>
using namespace std;
int main() {
int a;
cin >> a;
int arr[a] = {};
for (int i = 0; i < a; i ++){
cin >> arr[i];
}
for (int i = a-1; i >= 0; i --){
cout<<arr[i]<<" ";
}
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int[] arr = new int[a];
int ii = 0;
for (; ii < a; ii++) {
arr[ii] = sc.nextInt();
}
for (ii = a - 1; ii >= 1; ii--) {
System.out.print(arr[ii] + " ");
}
System.out.print(arr[0]);
}
}
#1095
#include <iostream>
using namespace std;
int main() {
int a;
cin >> a;
int ans = 24;
int temp;
for (int i = 0; i < a; i++){
cin >> temp;
if (temp<ans){
ans = temp;
}
}
cout << ans;
return 0;
}
#이제는 BufferReader를 쓸 때. (메모리 시간 차 확인하기)
이번 문제 같은 경우엔 출력량 보다는 입력량이 많아지는 경우다. 출석 번호가 10000까지도 될 수 있기 때문이다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int[] arr = new int[a];
int ii = 0;
for (; ii < a; ii++) {
arr[ii] = sc.nextInt();
}
int m = 24;
for (ii = 0; ii < a; ii++) {
if (arr[ii] < m) {
m = arr[ii];
}
}
System.out.print(m);
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int a = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int[] arr = new int[a];
for (int ii = 0; ii < a; ii++) {
arr[ii] = Integer.parseInt(st.nextToken());
}
int m = 24;
for (int ii = 0; ii < a; ii++) {
if (arr[ii] < m) {
m = arr[ii];
}
}
System.out.print(m);
}
}
아래 사진을 보면 메모리며 시간에서 상당한 차이가 나는 것을 알 수 있다.
96~99번 : 기초 종합 (배열O, 2차원배열)
드디어 2차원 배열이 등장했다!
#1096
#include <iostream>
using namespace std;
int main() {
int a;
cin >> a;
int arr[19][19] = {};
int x, y;
for (int i = 0; i < a; i++){
scanf("%d %d",&x,&y);
arr[x-1][y-1] = 1;
}
for (int i =0; i < 19; i ++){
for (int j = 0; j < 19; j++){
printf("%d ",arr[i][j]);
}
cout << endl;
}
return 0;
}
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static void printboard(int[][] arr) {
int ii, jj;
for (ii = 0; ii < 19; ii++) {
for (jj = 0; jj < 18; jj++) {
System.out.print(arr[ii][jj] + " ");
}
System.out.println(arr[ii][jj]);
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int a = Integer.parseInt(br.readLine());
int[][] arr = new int[19][19];
for (int ii = 0; ii < a; ii++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int y = Integer.valueOf(st.nextToken());
int x = Integer.valueOf(st.nextToken());
arr[y - 1][x - 1] = 1;
}
Main.printboard(arr);
br.close();
bw.flush();
bw.close();
}
}
BufferReader를 사용할 경우, Scanner와 달리 (예: nextInt()) 공백을 두고 숫자를 끊어 읽을 수 없기 때문에 StringTokenizer사용이 필수다. 자바는 진짜 코드 글자수량이 다른 언어에 비해 너무 많은 것 같다. (손가락근력이 올라가네)
#1097
#include <iostream>
using namespace std;
int main() {
int arr[19][19] = {};
for (int i=0; i<19; i++){
for (int j=0; j<19; j++){
cin >> arr[i][j];
}
}
int t, x, y;
cin >> t;
for (int i = 0; i < t; i ++){
scanf("%d %d",&x, &y);
x--;
y--;
for (int j = 0; j < 19; j ++){
arr[x][j] = !arr[x][j];
arr[j][y] = !arr[j][y];
}
}
for (int i =0; i < 19; i ++){
for (int j = 0; j < 19; j++){
printf("%d ",arr[i][j]);
}
cout << endl;
}
return 0;
}
다시 한 번 Buffer사용 유무 성능차 확인하기
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[][] board = new int[19][19];
//TODO fill given numbers to your board using scanner:
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
board[i][j] = sc.nextInt();
}
}
int time = sc.nextInt();
for (int t = 0; t < time; t++) {
int r = sc.nextInt() - 1;
int c = sc.nextInt() - 1;
for (int j = 0; j < 19; j++) {
if (board[r][j] == 0) {
board[r][j] = 1;
} else {
board[r][j] = 0;
}
}
for (int i = 0; i < 19; i++) {
if (board[i][c] == 0) {
board[i][c] = 1;
} else {
board[i][c] = 0;
}
}
}
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
System.out.print(board[i][j] + " ");
}
System.out.println();
}
}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
class Main {
public static void main(String[] args) throws Exception {
int[][] board = new int[19][19];
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for (int i = 0; i < 19; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < 19; j++) {
int val = Integer.parseInt(st.nextToken());
board[i][j] = val;
}
}
int n = Integer.parseInt(br.readLine());
for (int t = 0; t < n; t++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken()) - 1;
int c = Integer.parseInt(st.nextToken()) - 1;
for (int j = 0; j < 19; j++) {
if (board[r][j] == 0) {
board[r][j] = 1;
} else {
board[r][j] = 0;
}
}
for (int i = 0; i < 19; i++) {
if (board[i][c] == 0) {
board[i][c] = 1;
} else {
board[i][c] = 0;
}
}
}
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
bw.write(board[i][j] + " ");
}
bw.write("\n");
}
bw.flush();
bw.close();
}
}
19X19 바둑판을 입력받고 후처리한 뒤 출력하는 문제였다.
데이터 크기가 19X19라서 (100X100도 아니고) 큰 차이는 없을 테지만, 어떻게든 버퍼 사용 유무 성능차를 확인해보고 싶었다. 실험 결과는 아래처럼 나왔다. 스캐너, 시스아웃 VS 버퍼 및 스트링토크나이저 경우다
※ 전에 잠시 언급했지만, 버퍼리더를 사용할 경우 공백 끊어읽기가 안되기 때문에 스트링토크나이저 사용이 필수다.
#1098
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int arr[n][m] = {};
int t,l,d,x,y;
cin >> t;
for (int i = 0; i < t; i++){
scanf("%d %d %d %d", &l, &d, &x, &y);
if (d){
for (int j = 0; j < l; j ++){
arr[x-1+j][y-1] = 1;
}
}else{
for (int j = 0; j < l; j ++){
arr[x-1][y-1+j] = 1;
}
}
}
for (int i = 0; i < n; i ++){
for (int j = 0 ; j < m; j++){
cout << arr[i][j] << " ";
}
cout << endl;
}
return 0;
}
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int rsize = sc.nextInt();
int csize = sc.nextInt();
int[][] board = new int[rsize][csize];
int n = sc.nextInt(); //number of information
for (int i = 0; i < n; i++) {
int l = sc.nextInt();
int d = sc.nextInt(); // horiz if 0, vert if 1
int x = sc.nextInt() - 1;
int y = sc.nextInt() - 1;
if (d == 0) {
for (int ind = y; ind < y + l; ind++) {
board[x][ind] = 1;
}
} else if (d == 1) {
for (int ind = x; ind < x + l; ind++) {
board[ind][y] = 1;
}
}
}
for (int i = 0; i < rsize; i++) {
for (int j = 0; j < csize; j++) {
System.out.print(board[i][j] + " ");
}
System.out.println();
}
}
}
성실한 개미
코드업 100제 난이도 최고봉, 정답율 최저(지금 확인해보니 22% ㄷㄷ) 문제다.
사실 개미는 무조건 오른쪽으로만 간다. (안되면 밑으로 시도) 라고 생각하면 어려운 문제는 아니다.
여담
깊게 생각해보지 않고 BFS/DFS처럼 dx = [-1,1,0,0], dy=[0,0,-1,1] 부터 써내려 가는 학생들이 있더라.. (난 아님 ㅠ)
그나저나 22% 정답율을 백준과 비교해선 안된다. 백준으로 갔다면 성실한 개미는 아마 정답율이 35~40% 정도 나오지 않았을까 싶다. 하지만, 초보자들이 푸는 문제라는 것을 고려해서는 뭐...
#1099
#include <iostream>
using namespace std;
int main() {
int arr[10][10];
for (int i = 0; i < 10; i++){
for (int j = 0; j < 10; j++){
cin >> arr[i][j];
}
}
int x = 1;
int y = 1;
while (1){
//아래 두 케이스면, 더 갈 거 없이 현재 상황 종료
if (arr[x][y] == 2){
arr[x][y] = 9;
break;
}
if (x==8 && y==8) {
arr[x][y] = 9;
break;
}
// 오른쪽으로 갈 수 있음
if ((y+1)<=8 && arr[x][y+1] != 1){
arr[x][y++] = 9;
continue;
}
// 오른쪽으로 못가기 때문에 일단 밑으로 내려감
if ((x+1)<=8 && arr[x+1][y] != 1){
arr[x++][y] = 9;
continue;
}
//위에 두 케이스 안걸리면 아무데도 못간다는 것임. 종료
arr[x][y] = 9;
break;
}
for (int i = 0; i < 10; i++){
for (int j = 0; j < 10; j++){
cout << arr[i][j] << " ";
}
cout << endl;
}
return 0;
}
예전 글 정리
코드업 기초 100제 C++/Java (1~37)
1~8번: 기초 출력 스탠다드 인풋 없이 스탠다드 아웃풋만 내는 방식이다. C++의 경우 cout을 사용하였다. (물론 printf도 가능은 하지만) using namespace std;를 외치지 않은 경우, 그냥 cout이 아니라 std::cou
mylittlenotepad.tistory.com
코드업 기초 100제 C++/Java (38~46, 49~58, 63~64)
문제집 / C언어 기초 100제 codeup.kr 코드업 기초 100제 C++/Java (1~37) 1~8번: 기초 출력 스탠다드 인풋 없이 스탠다드 아웃풋만 내는 방식이다. C++의 경우 cout을 사용하였다. (물론 printf도 가능은 하지만
mylittlenotepad.tistory.com
코드업 기초 100제 C++/Java (65~77)
문제집 / C언어 기초 100제 codeup.kr 코드업 기초 100제 C++/Java (1~37) 1~8번: 기초 출력 스탠다드 인풋 없이 스탠다드 아웃풋만 내는 방식이다. C++의 경우 cout을 사용하였다. (물론 printf도 가능은 하지만
mylittlenotepad.tistory.com
코드업 기초 100제 C++/Java (78~92)
코드업 78번 부터는 기초 종합이다. 지금까지 배웠던 것을 사용해서 다양한 문제 풀이를 해볼 수 있다. 78번~92번 : 기초 종합 (배열X) #1078 #include int main() { int a; std::cin >> a; int res = 0; for (int i = 2; i b
mylittlenotepad.tistory.com