zj3t

email: euntaejang@gmail.com

Latest Posts
괄호문제가 있는데 그게 안풀려 넘어온 문제인데 의외로 쉬웠던것 같습니다.
주석 보시면 이해하실거라 생각됩니다.


#include <stdio.h>
int main() {
int test = 0;
int index[1001] = { 0, }; //최대 배열크기 설정
double sum = 0.0;
int day, team = 0;
double min = 9999.0;

scanf_s("%d", &test);

for (int i = 0; i < test; i++) {
scanf_s("%d %d", &day, &team); //날짜와 초대 팀 숫자 설정

for (int j = 0; j < day; j++) {
scanf_s("%d", &index[j]);
}
/*
처음에는 인덱스 0부터 팀 숫자만큼 인덱스를 더한뒤(팀숫자가 축제기간의 최                 소)
그다음에는,
팀 숫자가 축제기간의 최소이므로 하나씩 축제할 수 있는 날을 더해간다.
*/
for (int a = 0; a <= day - team; a++)
{
for (int b = a; b <= day - team; b++)
{
for (int c = a; c < team + b; c++)
{
sum += index[c];
}
sum /= (double)((team + b) - a);
if (sum <= min)
{
min = sum;
}
sum = 0;
}
}
printf("%.8f\n", min);
min = 9999.0;
index[day] = { 0, };
}
return 0;
}

주석만 보면 헷갈릴 수있으니 팁을 드리자면 비쥬얼스튜디오로 디버깅해보는 것이 가장 좋을 것입니다.( 어떤 값이 들어가는지 확인 할 수 있음)
튜토리얼 왕초보 다풀고 초보단계로 넘어왔는데 어쩐지 더 쉬운거 같습니다.

코드 보시면 따로 주석없이도 이해가실 거라 생각됩니다.




  1. #include <stdio.h>
  2. #include <string.h>

  3. int main() {
  4. int test = 0;
  5. int len = 0;
  6. int tem = 0;
  7. char arrays[81] = { 0, };

  8. scanf_s("%d", &test);

  9. for (int i = 0; i < test; i++) {
  10. scanf_s("%s",arrays, sizeof(arrays));
  11. len = strlen(arrays);
  12. for (int j = 0; j < len; j++) {
  13. arrays[len] = { 0, };

  14. if (arrays[j] == '%') {
  15. if (arrays[j + 1] == '2') {
  16. if (arrays[j + 2] == '0') {
  17. arrays[j] = ' ';
  18. for (int tem = j + 1; tem < len; tem++) {
  19. arrays[tem] = arrays[tem+ 2];
  20. }
  21. goto jump;
  22. }
  23. else if (arrays[j + 2] == '1') {
  24. arrays[j] = '!';
  25. for (int tem = j + 1; tem < len; tem++) {
  26. arrays[tem] = arrays[tem + 2];
  27. }
  28. goto jump;
  29. }
  30. else if (arrays[j + 2] == '4') {
  31. arrays[j] = '$';
  32. for (int tem = j + 1; tem < len; tem++) {
  33. arrays[tem] = arrays[tem + 2];
  34. }
  35. goto jump;
  36. }
  37. else if (arrays[j + 2] == '5') {
  38. arrays[j] = '%';
  39. for (int tem = j + 1; tem < len; tem++) {
  40. arrays[tem] = arrays[tem + 2];
  41. }
  42. goto jump;
  43. }
  44. else if (arrays[j + 2] == '8') {
  45. arrays[j] = '(';
  46. for (int tem = j + 1; tem < len; tem++) {
  47. arrays[tem] = arrays[tem + 2];
  48. }
  49. goto jump;
  50. }
  51. else if (arrays[j + 2] == '9') {
  52. arrays[j] = ')';
  53. for (int tem = j + 1; tem < len; tem++) {
  54. arrays[tem] = arrays[tem + 2];
  55. }
  56. goto jump;
  57. }
  58. else if (arrays[j + 2] == 'a') {
  59. arrays[j] = '*';
  60. for (int tem = j + 1; tem < len; tem++) {
  61. arrays[tem] = arrays[tem + 2];
  62. }
  63. goto jump;
  64. }
  65.        }
  66. }
  67. jump:tem = 0;
  68. }
  69. printf("%s\n", arrays);
  70. }
  71. return 0;
  72. }
코드만 보고도 이해가 가실거에요~~쉬운문제였습니다.


#include <stdio.h>

int main() {
int test;
double input = 0;
char arrays[100] = { 0,};

double kg = 2.2046;
double  lb = 0.4536;
double l = 0.2642;
double g = 3.7854;

scanf_s("%d", &test);
for (int i = 0; i < test; i++) {
scanf_s("%lf %s", &input, arrays, sizeof(arrays));

if (arrays[0] == 'k') { //kg라면
printf("%d %.4f lb\n", i + 1, input*kg);
goto exit_;
}
else if (arrays[0] == 'g') {//gallon이라면
printf("%d %.4f l\n", i + 1, input*g);
}
else if (arrays[1] == 'b' && arrays[0] == 'l') {//lb라면
printf("%d %.4f kg\n", i + 1, input*lb);
}
else if (arrays[0] == 'l') { //liter라면
printf("%d %.4f g\n", i + 1, input*l);
}
exit_:
arrays[0] = 0;
arrays[1] = 0;
}
return 0;
}


이번 문제도 쉬운문제였습니다.

예제입력에서 앞의 숫자는 인덱스+1에 해당합니다. 이 문제는 그 부분을 지운뒤 나머지 문자열을 출력하는 문제입니다.

//////////////////////////////////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <string.h>

int main() {
int test;
int len = 0;
int input = 0;
char old[1001]={ 0, };

scanf_s("%d", &test);

for (int i = 0; i < test; i++) {
scanf_s("%d %s",&input, old, sizeof(old));
len = strlen(old);

for (int j = 0; j < len; j++) {
if (j == input-1) { //입력한 값과 인덱스+1의 값이 같으면
for (int h = j; h < len; h++) { //하나 뒤의 문자열을 계속 저장
old[h] = old[h+1];
}
}
}
printf("%d %s\n",i+1,old);
}
return 0;
}
쉬운문제라 따로 설명은 없습니다~



#include <stdio.h>
#include <string.h>

int main() {
int test = 0;
int tem = 0;
int len = 0;
char old[101] = { 0, };
char new_[101] = { 0, };

scanf("%d", &test);

for (int i = 0; i < test; i++) {
scanf("%s", old);
len = strlen(old);
tem = 0;
new_[len] = { 0, };

for (int j = 0; j < len; j = j + 2) {
new_[tem] = old[j];
tem++;
}
for (int h = 1; h < len; h = h + 2) {
new_[tem] = old[h];
tem++;
}
printf("%s\n", new_);
}
return 0;
}
왕초보 문제 푸는데 왤케 머리가 안돌아가는지 모르겠습니다.
일년가까이 다른거하다가 프로그래밍을 하니 어렵네요...이 문제도 문제 난이도치고는 오래걸렸습니다.

문제는 그냥 단순한 버블정렬이였습니다. 처음 C배울때도 쉽게 풀던문제였는데 왜 해맸는지 잘 모르겠습니다.


#include <stdio.h>
#include <string.h>

int main() {
int count = 0;
char arrays[1000] = { 0, };
char s1[2] = { 0,0 };
int len = 0;

scanf_s("%d", &count);
for (int i = 0; i < count; i++) {
scanf_s("%s", arrays, sizeof(arrays));
len = strlen(arrays);


for (int j = 0; j < len; j = j + 2) {
for (int h = j+2; h < len; h = h + 2) {

if (arrays[j] > arrays[h]) {
s1[0] = arrays[j];
s1[1] = arrays[j + 1];
arrays[j] = arrays[h];
arrays[j + 1] = arrays[h+1];
arrays[h] = s1[0];
arrays[h + 1] = s1[1];
}

else if (arrays[j] == arrays[h]) {
if (arrays[j + 1] >= arrays[h + 1]) {
s1[0] = arrays[j + 1];
arrays[j+1] = arrays[h + 1];
arrays[h + 1] = s1[0];
}
else {
s1[0] = arrays[h];
s1[1] = arrays[h + 1];
}
}
}
}
printf("%s\n", arrays);
}
return 0;
}

버블정렬 코드라고 생각하시면 될꺼같습니다. 주석은 딱히 안달아도 될 것 같습니다.
이번 문제는 굉장히 쉬웠습니다.



문제 해결 방안:

저는 단순하게 생각했습니다. 공책에 좌표를 그려서도 봤는데 그리면서 어떻게 풀지 생각이 났습니다. 
우선 (x,y)좌표라고 하면 x좌표 세개를 모두 입력받았을때, 직 사각형을 만들어야하므로 반드시 두개는 같은 x,y 좌표가 있을 것이고 입력받은 3개의 좌표중 같지 않은 하나가 출력되어야할 좌표입니다.

코드: 

#include <stdio.h>

int main()
{
int first[4] = { 0, }; 
int second[4] = { 0, }; //사각형이므로 배열 4개를 할당 
int count = 0;
int result = 0;

scanf_s("%d", &count);
for (int i = 0; i < count; i++) {
for (int j = 0; j < 3; j++) {
scanf_s("%d %d", &first[j], &second[j]); //x, y좌표를 입력받음
}
                //같은 수가 무엇인지 확인하는 조건문
if (first[0] == first[1]) {
first[3] = first[2];
}
else if (first[1] == first[2]) {
first[3] = first[0];
}
else if (first[0] == first[2]) {
first[3] = first[1];
}

if (second[0] == second[1]) {
second[3] = second[2];
}
else if (second[1] == second[2]) {
second[3] = second[0];
}
else if (second[0] == second[2]) {
second[3] = second[1];
}
printf("%d %d\n", first[3], second[3]);
}
return 0;
}
C로 풀었는데도 시간이 초과됬다고 하네요.....
일단 제가 푼 C코드입니다. 문제는 저번 자바랑 푼거랑 동일해요

#include <stdio.h>
#include <string.h>

int main()
{
char old[1000000];
int n1, n2 = 0;
int count=0;
int num = 0;

scanf_s("%s", old,sizeof(old));
scanf_s("%d", &count);

for (int j = 0; j < count; j++) {
scanf_s("%d %d", &n1, &n2);
num = 0;
if (n1 < n2) {
for (int i = n1; i < n2; i++) {

if (old[i] == old[i + 1]) {
num++;
}
}
if (num == (n2 - n1))
{
printf("Yes\n");
}
else
{
printf("No\n");
}

}
else if (n1 > n2) {
for (int i = n2; i < n1; i++) {
if (old[i] == old[i + 1]) {
num++;
}
}
if (num == (n1 - n2))
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
}
return 0;
}
자바로 푸는게 편할 꺼같아서 오랜시간 풀었는데 자바는 실행시간이 느려 아무리 빨리짜도 걸리더군요.

알고리즘 그대로 C로 적용해서 풀어야겠어요

그래도 푼게 아까워서 자바로 푼걸 포스팅하겠습니다.


import java.util.Scanner;

public class Main {
public static void main(String[] args){
int count=0;
String num=null;
String s1;
String s2;
int len=0;

Scanner scanner=new Scanner(System.in);  //입력 사용준비
num=scanner.nextLine();  //문자열을 입력받음
len=num.length();  //문자열의 길이를 구함

String[] arrays=new String[len];
int[] value=new int[len]; //문자열의 길이만큼 배열을 정의

for(int i1=0; i1<len; i1++){
arrays[i1]=num.substring(i1,i1+1); //문자열을 1크기로 잘라 할당
value[i1]=Integer.parseInt(arrays[i1]); //문자를 정수로 바꿈 
}

count=scanner.nextInt(); //테스트 횟수를 입력 

for(int i=0; i<count; i++){
s1=scanner.next();
s2=scanner.next(); //띄어쓰기 단위로 두개의 문자를 입력받음
int c=0;

int n1=Integer.parseInt(s1);
int n2=Integer.parseInt(s2); //각각 입력받은 문자를 정수형으로 변환

                        //밑에는 해석하기 쉽습니다.
if(n1<n2){
for(int j=n1; j<n2; j++){
if(value[j]==value[j+1]){
c++;
}
}
if(c==(n2-n1))
{
System.out.println("Yes");
}
else{
System.out.println("No");
}
}
else if(n1>n2){
for(int j=n2; j<n1; j++){
if(value[j]==value[j+1]){
c++;
}
}
if(c==(n1-n2))
{
System.out.println("Yes");
}
else{
System.out.println("No");
}
}
}
}
}

알고스팟 초보용 문제인데, &(AND연산), >>,<<(SHIFT연산) 을 써서 프로그래밍을해본 적이 없어서 많이 해맸습니다.

프로젝트 오일러보다 어려운거 같아요


#include <stdio.h>

int main()
{
int count=0;
int num = 0;
unsigned int result = 0;
unsigned int base[4] = { 0xFF,0xFF00,0xFF0000,0xFF000000 };

scanf_s("%d", &count);

for (int i = 0; i < count; i++) {
scanf_s("%d", &num);

result = ((num&base[0]) << 24) + ((num&base[1]) << 8) + ((num&base[2]) >> 8) + ((num&base[3]) >> 24);

printf("%u\n", result);
}
return 0;
}

해설:
((num&base[0]) << 24)를 하면 base[0]은 0xFF이므로 1111 1111, 즉 8bit 이다. 따라서 이 base[0]과 입력한 수를 AND연산하면 입력한 수의 8비트를 제외하고는 0이 된다.

AND연산은 둘다 1이여야 1로 세팅된다.

그리고 이것을 L SHIFT연산을 하여 24바이트 왼쪽으로 옮긴다. 예를 들어 0001 << 4 는
1000이 된다.

따라서 24바이트 왼쪽 쉬프트 연산을 한다. (맨 앞으로 보내기 위해, 즉 위치를 바꿔주기 위해)

하나를 더 보면 ((num&base[1]) << 8)에서 base[1]은 0xFF00 , 즉 1111 1111 0000 0000 16bit이다. 이것과 입력한 수를 AND연산하면 XXXX XXXX 0000 0000가 되고 이를 왼쪽 쉬프트 연산 8만큼하면 위치가 바뀌가 되는 원리이다.